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()); }
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); }
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); }
private Project GetProject(string testMethod) { var testSource = Read(testMethod + ".Input"); return(MvcDiagnosticAnalyzerRunner.CreateProjectWithReferencesInBinDir(GetType().Assembly, new[] { testSource })); }