Skip to content

Commit 4730e8f

Browse files
committed
Add tests which now succeed
1 parent ef31d31 commit 4730e8f

File tree

3 files changed

+80
-2
lines changed

3 files changed

+80
-2
lines changed

src/Mvc/Mvc.ApiExplorer/src/EndpointMetadataApiDescriptionProvider.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,9 @@ private static void AddSupportedResponseTypes(
375375
apiResponseType.ApiResponseFormats.Add(defaultResponseFormat);
376376
}
377377

378+
// We set the Description to the first non-null value we find that matches the status code.
379+
apiResponseType.Description ??= responseMetadataTypes.FirstOrDefault(x => x.StatusCode == apiResponseType.StatusCode && x.Description is not null)?.Description;
380+
378381
if (!supportedResponseTypes.Any(existingResponseType => existingResponseType.StatusCode == apiResponseType.StatusCode))
379382
{
380383
supportedResponseTypes.Add(apiResponseType);

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

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,81 @@ public void AddsMultipleResponseFormatsForTypedResults()
300300
Assert.Empty(badRequestResponseType.ApiResponseFormats);
301301
}
302302

303+
[Fact]
304+
public void AddsResponseDescription()
305+
{
306+
const string expectedCreatedDescription = "A new item was created";
307+
const string expectedBadRequestDescription = "Validation failed for the request";
308+
309+
var apiDescription = GetApiDescription(
310+
[ProducesResponseType(typeof(TimeSpan), StatusCodes.Status201Created, Description = expectedCreatedDescription)]
311+
[ProducesResponseType(StatusCodes.Status400BadRequest, Description = expectedBadRequestDescription)]
312+
() => TypedResults.Created("https://example.com", new TimeSpan()));
313+
314+
Assert.Equal(2, apiDescription.SupportedResponseTypes.Count);
315+
316+
var createdResponseType = apiDescription.SupportedResponseTypes[0];
317+
318+
Assert.Equal(201, createdResponseType.StatusCode);
319+
Assert.Equal(typeof(TimeSpan), createdResponseType.Type);
320+
Assert.Equal(typeof(TimeSpan), createdResponseType.ModelMetadata?.ModelType);
321+
Assert.Equal(expectedCreatedDescription, createdResponseType.Description);
322+
323+
var createdResponseFormat = Assert.Single(createdResponseType.ApiResponseFormats);
324+
Assert.Equal("application/json", createdResponseFormat.MediaType);
325+
326+
var badRequestResponseType = apiDescription.SupportedResponseTypes[1];
327+
328+
Assert.Equal(400, badRequestResponseType.StatusCode);
329+
Assert.Equal(typeof(void), badRequestResponseType.Type);
330+
Assert.Equal(typeof(void), badRequestResponseType.ModelMetadata?.ModelType);
331+
Assert.Equal(expectedBadRequestDescription, badRequestResponseType.Description);
332+
}
333+
334+
[Fact]
335+
public void WithEmptyMethodBody_AddsResponseDescription()
336+
{
337+
const string expectedCreatedDescription = "A new item was created";
338+
const string expectedBadRequestDescription = "Validation failed for the request";
339+
340+
var apiDescription = GetApiDescription(
341+
[ProducesResponseType(typeof(TimeSpan), StatusCodes.Status201Created, Description = expectedCreatedDescription)]
342+
[ProducesResponseType(StatusCodes.Status400BadRequest, Description = expectedBadRequestDescription)]
343+
() => new InferredJsonClass());
344+
345+
Assert.Equal(3, apiDescription.SupportedResponseTypes.Count);
346+
347+
var rdfInferredResponseType = apiDescription.SupportedResponseTypes[0];
348+
349+
Assert.Equal(200, rdfInferredResponseType.StatusCode);
350+
Assert.Equal(typeof(InferredJsonClass), rdfInferredResponseType.Type);
351+
Assert.Equal(typeof(InferredJsonClass), rdfInferredResponseType.ModelMetadata?.ModelType);
352+
353+
var rdfInferredResponseFormat = Assert.Single(rdfInferredResponseType.ApiResponseFormats);
354+
Assert.Equal("application/json", rdfInferredResponseFormat.MediaType);
355+
Assert.Null(rdfInferredResponseType.Description); // There is no description set for the default "200" code, so we expect it to be null.
356+
357+
var createdResponseType = apiDescription.SupportedResponseTypes[1];
358+
359+
Assert.Equal(201, createdResponseType.StatusCode);
360+
Assert.Equal(typeof(TimeSpan), createdResponseType.Type);
361+
Assert.Equal(typeof(TimeSpan), createdResponseType.ModelMetadata?.ModelType);
362+
Assert.Equal(expectedCreatedDescription, createdResponseType.Description);
363+
364+
var createdResponseFormat = Assert.Single(createdResponseType.ApiResponseFormats);
365+
Assert.Equal("application/json", createdResponseFormat.MediaType);
366+
367+
var badRequestResponseType = apiDescription.SupportedResponseTypes[2];
368+
369+
Assert.Equal(400, badRequestResponseType.StatusCode);
370+
Assert.Equal(typeof(InferredJsonClass), badRequestResponseType.Type);
371+
Assert.Equal(typeof(InferredJsonClass), badRequestResponseType.ModelMetadata?.ModelType);
372+
Assert.Equal(expectedBadRequestDescription, badRequestResponseType.Description);
373+
374+
var badRequestResponseFormat = Assert.Single(badRequestResponseType.ApiResponseFormats);
375+
Assert.Equal("application/json", badRequestResponseFormat.MediaType);
376+
}
377+
303378
[Fact]
304379
public void AddsResponseFormatsForTypedResultWithoutReturnType()
305380
{

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Responses.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ public async Task GetOpenApiResponse_WithEmptyMethodBody_UsesDescriptionSetByUse
320320
// Act
321321
builder.MapPost("/api/todos",
322322
[ProducesResponseType<Todo>(StatusCodes.Status200OK, Description = expectedCreatedDescription)]
323-
[ProducesResponseType(StatusCodes.Status400BadRequest)] // Omitted, meaning it should be NULL
323+
[ProducesResponseType(StatusCodes.Status400BadRequest, Description = expectedBadRequestDescription)]
324324
() =>
325325
{ });
326326

@@ -354,7 +354,7 @@ public async Task GetOpenApiResponse_UsesDescriptionSetByUser()
354354
// Act
355355
builder.MapPost("/api/todos",
356356
[ProducesResponseType<Todo>(StatusCodes.Status200OK, Description = expectedCreatedDescription)]
357-
[ProducesResponseType(StatusCodes.Status400BadRequest)] // Omitted, meaning it should be NULL
357+
[ProducesResponseType(StatusCodes.Status400BadRequest, Description = expectedBadRequestDescription)]
358358
() =>
359359
{ return TypedResults.Ok(new Todo(1, "Lorem", true, DateTime.UtcNow)); }); // This code doesn't return Bad Request, but that doesn't matter for this test.
360360

0 commit comments

Comments
 (0)