private Task <Compilation> GetCompilation([CallerMemberName] string testMethod = "")
        {
            var testSource = MvcTestSource.Read(GetType().Name, testMethod);
            var project    = MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { testSource.Source });

            return(project.GetCompilationAsync());
        }
Esempio n. 2
0
        public async Task IsApiControllerAction_ReturnsFalse_IfMethodReturnTypeIsInvalid()
        {
            // Arrange
            var source      = @"
using Microsoft.AspNetCore.Mvc;

namespace TestNamespace
{
    [ApiController]
    public class TestController : ControllerBase
    {
        public DoesNotExist Get(int id)
        {
            if (id == 0)
            {
                return NotFound();
            }

            return new DoesNotExist(id);
        }
    }
}";
            var project     = MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { source });
            var compilation = await project.GetCompilationAsync();

            Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
            var method = (IMethodSymbol)compilation.GetTypeByMetadataName("TestNamespace.TestController").GetMembers("Get").First();

            // Act
            var result = ApiControllerFacts.IsApiControllerAction(symbolCache, method);

            // Assert
            Assert.False(result);
        }
    private Task <Compilation> GetCompilationAsync(string test = "SymbolApiConventionMatcherTestFile")
    {
        var testSource = MvcTestSource.Read(GetType().Name, test);
        var project    = MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { testSource.Source });

        return(project.GetCompilationAsync());
    }
        private async Task <Compilation> GetCompilationForGetName()
        {
            var testSource = MvcTestSource.Read(GetType().Name, "GetNameTests");
            var project    = MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { testSource.Source });

            var compilation = await project.GetCompilationAsync();

            return(compilation);
        }
        public StartupAnalyzerTest()
        {
            StartupAnalyzer = new StartupAnalzyer();
            StartupAnalyzer.StartupFilePredicate = path => path.Equals("Test.cs", StringComparison.Ordinal);

            Runner = new MvcDiagnosticAnalyzerRunner(StartupAnalyzer);

            Analyses = new ConcurrentBag <StartupComputedAnalysis>();
            ConfigureServicesMethods         = new ConcurrentBag <IMethodSymbol>();
            ConfigureMethods                 = new ConcurrentBag <IMethodSymbol>();
            StartupAnalyzer.AnalysisStarted += (sender, analysis) => Analyses.Add(analysis);
            StartupAnalyzer.ConfigureServicesMethodFound += (sender, method) => ConfigureServicesMethods.Add(method);
            StartupAnalyzer.ConfigureMethodFound         += (sender, method) => ConfigureMethods.Add(method);
        }
Esempio n. 6
0
        public StartupAnalyzerTest()
        {
            StartupAnalyzer = new StartupAnalzyer();

            Runner = new MvcDiagnosticAnalyzerRunner(StartupAnalyzer);

            Analyses = new ConcurrentBag <object>();
            ConfigureServicesMethods = new ConcurrentBag <IMethodSymbol>();
            ConfigureMethods         = new ConcurrentBag <IMethodSymbol>();
            StartupAnalyzer.ServicesAnalysisCompleted    += (sender, analysis) => Analyses.Add(analysis);
            StartupAnalyzer.OptionsAnalysisCompleted     += (sender, analysis) => Analyses.Add(analysis);
            StartupAnalyzer.MiddlewareAnalysisCompleted  += (sender, analysis) => Analyses.Add(analysis);
            StartupAnalyzer.ConfigureServicesMethodFound += (sender, method) => ConfigureServicesMethods.Add(method);
            StartupAnalyzer.ConfigureMethodFound         += (sender, method) => ConfigureMethods.Add(method);
        }
        private async Task <bool> IsProblematicParameterTest([CallerMemberName] string testMethod = "")
        {
            var testSource = MvcTestSource.Read(GetType().Name, testMethod);
            var project    = MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { testSource.Source });

            var compilation = await project.GetCompilationAsync();

            var modelType = compilation.GetTypeByMetadataName($"Microsoft.AspNetCore.Mvc.Analyzers.TopLevelParameterNameAnalyzerTestFiles.{testMethod}");
            var method    = (IMethodSymbol)modelType.GetMembers("ActionMethod").First();
            var parameter = method.Parameters[0];

            Assert.True(TopLevelParameterNameAnalyzer.SymbolCache.TryCreate(compilation, out var symbolCache));

            var result = TopLevelParameterNameAnalyzer.IsProblematicParameter(symbolCache, parameter);

            return(result);
        }
        public async Task SpecifiesModelType_ReturnsTrue_IfModelBinderSpecifiesTypeFromProperty()
        {
            var testMethod = nameof(SpecifiesModelType_ReturnsTrue_IfModelBinderSpecifiesTypeFromProperty);
            var testSource = MvcTestSource.Read(GetType().Name, "SpecifiesModelTypeTests");
            var project    = MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { testSource.Source });

            var compilation = await project.GetCompilationAsync();

            Assert.True(TopLevelParameterNameAnalyzer.SymbolCache.TryCreate(compilation, out var symbolCache));

            var type   = compilation.GetTypeByMetadataName(typeof(SpecifiesModelTypeTests).FullName);
            var method = (IMethodSymbol)type.GetMembers(testMethod).First();

            var parameter = method.Parameters[0];
            var result    = TopLevelParameterNameAnalyzer.SpecifiesModelType(symbolCache, parameter);

            Assert.True(result);
        }
        private async Task <ActualApiResponseMetadata?> RunInspectReturnStatementSyntax(string source, string test)
        {
            var project     = MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { source });
            var compilation = await project.GetCompilationAsync();

            Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));

            var returnType = compilation.GetTypeByMetadataName($"{Namespace}.{test}");
            var syntaxTree = returnType.DeclaringSyntaxReferences[0].SyntaxTree;

            var method          = (IMethodSymbol)returnType.GetMembers().First();
            var methodSyntax    = syntaxTree.GetRoot().FindNode(method.Locations[0].SourceSpan);
            var returnStatement = methodSyntax.DescendantNodes().OfType <ReturnStatementSyntax>().First();
            var returnOperation = (IReturnOperation)compilation.GetSemanticModel(syntaxTree).GetOperation(returnStatement);

            return(ActualApiResponseMetadataFactory.InspectReturnOperation(
                       symbolCache,
                       returnOperation));
        }
        private async Task <(bool result, IList <ActualApiResponseMetadata> responseMetadatas, TestSource testSource)> TryGetActualResponseMetadata(string typeName, string methodName)
        {
            var testSource = MvcTestSource.Read(GetType().Name, "TryGetActualResponseMetadataTests");
            var project    = MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { testSource.Source });

            var compilation = await GetCompilation("TryGetActualResponseMetadataTests");

            var type   = compilation.GetTypeByMetadataName(typeName);
            var method = (IMethodSymbol)type.GetMembers(methodName).First();

            Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));

            var syntaxTree      = method.DeclaringSyntaxReferences[0].SyntaxTree;
            var methodSyntax    = (MethodDeclarationSyntax)syntaxTree.GetRoot().FindNode(method.Locations[0].SourceSpan);
            var methodOperation = (IMethodBodyBaseOperation)compilation.GetSemanticModel(syntaxTree).GetOperation(methodSyntax);

            var result = ActualApiResponseMetadataFactory.TryGetActualResponseMetadata(symbolCache, methodOperation, CancellationToken.None, out var responseMetadatas);

            return(result, responseMetadatas, testSource);
        }
        public async Task InspectReturnExpression_ReturnsNull_IfReturnExpressionCannotBeFound()
        {
            // Arrange & Act
            var source      = @"
            using Microsoft.AspNetCore.Mvc;

namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
{
    [ApiController]
    public class TestController : ControllerBase
    {
        public IActionResult Get(int id)
        {
            return new DoesNotExist(id);
        }
    }
}";
            var project     = MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { source });
            var compilation = await project.GetCompilationAsync();

            Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));

            var returnType = compilation.GetTypeByMetadataName($"{Namespace}.TestController");
            var syntaxTree = returnType.DeclaringSyntaxReferences[0].SyntaxTree;

            var method          = (IMethodSymbol)returnType.GetMembers().First();
            var methodSyntax    = syntaxTree.GetRoot().FindNode(method.Locations[0].SourceSpan);
            var returnStatement = methodSyntax.DescendantNodes().OfType <ReturnStatementSyntax>().First();

            var actualResponseMetadata = ActualApiResponseMetadataFactory.InspectReturnStatementSyntax(
                symbolCache,
                compilation.GetSemanticModel(syntaxTree),
                returnStatement,
                CancellationToken.None);

            // Assert
            Assert.Null(actualResponseMetadata);
        }
Esempio n. 12
0
        private Project GetProject(string testMethod)
        {
            var testSource = Read(testMethod + ".Input");

            return(MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { testSource }));
        }