Skip to content

Commit 199e3f1

Browse files
committed
Look at ApiConventionType attributes defined on base types
Fixes #4951
1 parent 97d3a34 commit 199e3f1

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

src/Mvc/src/Microsoft.AspNetCore.Mvc.Api.Analyzers/SymbolApiResponseMetadataProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ private static IList<DeclaredApiResponseMetadata> GetResponseMetadataFromMethodA
160160

161161
internal static IReadOnlyList<ITypeSymbol> GetConventionTypes(in ApiControllerSymbolCache symbolCache, IMethodSymbol method)
162162
{
163-
var attributes = method.ContainingType.GetAttributes(symbolCache.ApiConventionTypeAttribute).ToArray();
163+
var attributes = method.ContainingType.GetAttributes(symbolCache.ApiConventionTypeAttribute, inherit: true).ToArray();
164164
if (attributes.Length == 0)
165165
{
166166
attributes = method.ContainingAssembly.GetAttributes(symbolCache.ApiConventionTypeAttribute).ToArray();

src/Mvc/test/Mvc.Api.Analyzers.Test/SymbolApiResponseMetadataProviderTest.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,50 @@ private async Task GetResponseMetadata_WorksForInvalidOrUnsupportedAttributes(st
290290
});
291291
}
292292

293+
[Fact]
294+
public async Task GetDeclaredResponseMetadata_ApiConventionTypeAttributeOnType_Works()
295+
{
296+
// Arrange
297+
var type = typeof(GetDeclaredResponseMetadata_ApiConventionTypeAttributeOnType);
298+
var compilation = await GetResponseMetadataCompilation();
299+
var controller = compilation.GetTypeByMetadataName(type.FullName);
300+
var method = (IMethodSymbol)controller.GetMembers().First();
301+
var symbolCache = new ApiControllerSymbolCache(compilation);
302+
303+
// Act
304+
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
305+
306+
// Assert
307+
// We should expect 3 entries specified by DefaultApiConventions.Post
308+
Assert.Collection(
309+
result.OrderBy(r => r.StatusCode),
310+
metadata => Assert.True(metadata.IsDefault),
311+
metadata => Assert.Equal(201, metadata.StatusCode),
312+
metadata => Assert.Equal(400, metadata.StatusCode));
313+
}
314+
315+
[Fact]
316+
public async Task GetDeclaredResponseMetadata_ApiConventionTypeAttributeOnBaseType_Works()
317+
{
318+
// Arrange
319+
var type = typeof(GetDeclaredResponseMetadata_ApiConventionTypeAttributeOnBaseType);
320+
var compilation = await GetResponseMetadataCompilation();
321+
var controller = compilation.GetTypeByMetadataName(type.FullName);
322+
var method = (IMethodSymbol)controller.GetMembers().First();
323+
var symbolCache = new ApiControllerSymbolCache(compilation);
324+
325+
// Act
326+
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
327+
328+
// Assert
329+
// We should expect 3 entries specified by DefaultApiConventions.Post
330+
Assert.Collection(
331+
result.OrderBy(r => r.StatusCode),
332+
metadata => Assert.True(metadata.IsDefault),
333+
metadata => Assert.Equal(201, metadata.StatusCode),
334+
metadata => Assert.Equal(400, metadata.StatusCode));
335+
}
336+
293337
[Fact]
294338
public Task GetStatusCode_ReturnsValueFromConstructor()
295339
{

src/Mvc/test/Mvc.Api.Analyzers.Test/TestFiles/SymbolApiResponseMetadataProviderTest/GetResponseMetadataTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,20 @@ public CustomInvalidProducesResponseTypeAttribute()
9090
}
9191
}
9292
}
93+
94+
[ApiConventionType(typeof(DefaultApiConventions))]
95+
public class GetDeclaredResponseMetadata_ApiConventionTypeAttributeOnType : Controller
96+
{
97+
public IActionResult Post(object model) => null;
98+
}
99+
100+
[ApiConventionType(typeof(DefaultApiConventions))]
101+
public class GetDeclaredResponseMetadata_ApiConventionTypeAttributeOnBaseTypeBase
102+
{
103+
}
104+
105+
public class GetDeclaredResponseMetadata_ApiConventionTypeAttributeOnBaseType : GetDeclaredResponseMetadata_ApiConventionTypeAttributeOnBaseTypeBase
106+
{
107+
public IActionResult Post(object model) => null;
108+
}
93109
}

0 commit comments

Comments
 (0)