Skip to content

Commit 7fda04b

Browse files
committed
Add test cases where "higher" types are defined in attribute instead of metadata, and removed duplicate code
1 parent 9508aba commit 7fda04b

File tree

1 file changed

+42
-4
lines changed

1 file changed

+42
-4
lines changed

src/Mvc/Mvc.ApiExplorer/test/EndpointMetadataApiDescriptionProviderTest.cs

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ public void AddsResponseDescription_WorksWithGenerics()
336336
{
337337
const string expectedOkDescription = "The weather forecast for the next 5 days.";
338338

339-
var apiDescription = GetApiDescription([ProducesResponseType<GenericClass<TimeSpan>>(StatusCodes.Status200OK, Description = "The weather forecast for the next 5 days.")]
339+
var apiDescription = GetApiDescription([ProducesResponseType<GenericClass<TimeSpan>>(StatusCodes.Status200OK, Description = expectedOkDescription)]
340340
() => new GenericClass<TimeSpan> { Value = new TimeSpan() });
341341

342342
var okResponseType = Assert.Single(apiDescription.SupportedResponseTypes);
@@ -355,7 +355,7 @@ public void AddsResponseDescription_WorksWithGenericsAndTypedResults()
355355
{
356356
const string expectedOkDescription = "The weather forecast for the next 5 days.";
357357

358-
var apiDescription = GetApiDescription([ProducesResponseType<GenericClass<TimeSpan>>(StatusCodes.Status200OK, Description = "The weather forecast for the next 5 days.")]
358+
var apiDescription = GetApiDescription([ProducesResponseType<GenericClass<TimeSpan>>(StatusCodes.Status200OK, Description = expectedOkDescription)]
359359
() => TypedResults.Ok(new GenericClass<TimeSpan> { Value = new TimeSpan() }));
360360

361361
var okResponseType = Assert.Single(apiDescription.SupportedResponseTypes);
@@ -374,7 +374,7 @@ public void AddsResponseDescription_WorksWithCollections()
374374
{
375375
const string expectedOkDescription = "The weather forecast for the next 5 days.";
376376

377-
var apiDescription = GetApiDescription([ProducesResponseType<IEnumerable<TimeSpan>>(StatusCodes.Status200OK, Description = "The weather forecast for the next 5 days.")]
377+
var apiDescription = GetApiDescription([ProducesResponseType<IEnumerable<TimeSpan>>(StatusCodes.Status200OK, Description = expectedOkDescription)]
378378
() => new List<TimeSpan> { new() });
379379

380380
var okResponseType = Assert.Single(apiDescription.SupportedResponseTypes);
@@ -393,7 +393,7 @@ public void AddsResponseDescription_WorksWithCollectionsAndTypedResults()
393393
{
394394
const string expectedOkDescription = "The weather forecast for the next 5 days.";
395395

396-
var apiDescription = GetApiDescription([ProducesResponseType<IEnumerable<TimeSpan>>(StatusCodes.Status200OK, Description = "The weather forecast for the next 5 days.")]
396+
var apiDescription = GetApiDescription([ProducesResponseType<IEnumerable<TimeSpan>>(StatusCodes.Status200OK, Description = expectedOkDescription)]
397397
() => TypedResults.Ok(new List<TimeSpan> { new() }));
398398

399399
var okResponseType = Assert.Single(apiDescription.SupportedResponseTypes);
@@ -407,6 +407,44 @@ public void AddsResponseDescription_WorksWithCollectionsAndTypedResults()
407407
Assert.Equal("application/json", createdOkFormat.MediaType);
408408
}
409409

410+
[Fact]
411+
public void AddsResponseDescription_WorksWithCollectionsWhereInnerTypeIsInEndpoint()
412+
{
413+
const string expectedOkDescription = "The weather forecast for the next 5 days.";
414+
415+
var apiDescription = GetApiDescription([ProducesResponseType<List<TimeSpan>>(StatusCodes.Status200OK, Description = expectedOkDescription)]
416+
() => new List<TimeSpan> { new() }.AsEnumerable());
417+
418+
var okResponseType = Assert.Single(apiDescription.SupportedResponseTypes);
419+
420+
Assert.Equal(200, okResponseType.StatusCode);
421+
Assert.Equal(typeof(IEnumerable<TimeSpan>), okResponseType.Type); // We use IEnumerable<TimeSpan> as the inferred type has higher priority than those set by metadata (attributes)
422+
Assert.Equal(typeof(IEnumerable<TimeSpan>), okResponseType.ModelMetadata?.ModelType);
423+
Assert.Equal(expectedOkDescription, okResponseType.Description);
424+
425+
var createdOkFormat = Assert.Single(okResponseType.ApiResponseFormats);
426+
Assert.Equal("application/json", createdOkFormat.MediaType);
427+
}
428+
429+
[Fact]
430+
public void AddsResponseDescription_WorksWithCollectionsAndTypedResultsWhereInnerTypeIsInEndpoint()
431+
{
432+
const string expectedOkDescription = "The weather forecast for the next 5 days.";
433+
434+
var apiDescription = GetApiDescription([ProducesResponseType<List<TimeSpan>>(StatusCodes.Status200OK, Description = expectedOkDescription)]
435+
() => TypedResults.Ok(new List<TimeSpan> { new() }.AsEnumerable()));
436+
437+
var okResponseType = Assert.Single(apiDescription.SupportedResponseTypes);
438+
439+
Assert.Equal(200, okResponseType.StatusCode);
440+
Assert.Equal(typeof(IEnumerable<TimeSpan>), okResponseType.Type); // We use IEnumerable<TimeSpan> as the inferred type has higher priority than those set by metadata (attributes)
441+
Assert.Equal(typeof(IEnumerable<TimeSpan>), okResponseType.ModelMetadata?.ModelType);
442+
Assert.Equal(expectedOkDescription, okResponseType.Description);
443+
444+
var createdOkFormat = Assert.Single(okResponseType.ApiResponseFormats);
445+
Assert.Equal("application/json", createdOkFormat.MediaType);
446+
}
447+
410448
[Fact]
411449
public void WithEmptyMethodBody_AddsResponseDescription()
412450
{

0 commit comments

Comments
 (0)