|
8 | 8 | using System.Security.Claims;
|
9 | 9 | using Microsoft.AspNetCore.Builder;
|
10 | 10 | using Microsoft.AspNetCore.Http;
|
| 11 | +using Microsoft.AspNetCore.Http.HttpResults; |
11 | 12 | using Microsoft.AspNetCore.Http.Metadata;
|
12 | 13 | using Microsoft.AspNetCore.Mvc.Abstractions;
|
13 | 14 | using Microsoft.AspNetCore.Mvc.Infrastructure;
|
@@ -273,6 +274,144 @@ public void AddsMultipleResponseFormatsFromMetadataWithIResult()
|
273 | 274 | Assert.Empty(badRequestResponseType.ApiResponseFormats);
|
274 | 275 | }
|
275 | 276 |
|
| 277 | + [Fact] |
| 278 | + public void AddsMultipleResponseFormatsForTypedResults() |
| 279 | + { |
| 280 | + var apiDescription = GetApiDescription(Results<Created<InferredJsonClass>, BadRequest> () => |
| 281 | + TypedResults.Created("https://example.com", new InferredJsonClass())); |
| 282 | + |
| 283 | + Assert.Equal(2, apiDescription.SupportedResponseTypes.Count); |
| 284 | + |
| 285 | + var createdResponseType = apiDescription.SupportedResponseTypes[0]; |
| 286 | + |
| 287 | + Assert.Equal(201, createdResponseType.StatusCode); |
| 288 | + Assert.Equal(typeof(InferredJsonClass), createdResponseType.Type); |
| 289 | + Assert.Equal(typeof(InferredJsonClass), createdResponseType.ModelMetadata?.ModelType); |
| 290 | + |
| 291 | + var createdResponseFormat = Assert.Single(createdResponseType.ApiResponseFormats); |
| 292 | + Assert.Equal("application/json", createdResponseFormat.MediaType); |
| 293 | + |
| 294 | + var badRequestResponseType = apiDescription.SupportedResponseTypes[1]; |
| 295 | + |
| 296 | + Assert.Equal(400, badRequestResponseType.StatusCode); |
| 297 | + Assert.Equal(typeof(void), badRequestResponseType.Type); |
| 298 | + Assert.Equal(typeof(void), badRequestResponseType.ModelMetadata?.ModelType); |
| 299 | + |
| 300 | + Assert.Empty(badRequestResponseType.ApiResponseFormats); |
| 301 | + } |
| 302 | + |
| 303 | + [Fact] |
| 304 | + public void AddsResponseFormatsForTypedResultWithoutReturnType() |
| 305 | + { |
| 306 | + var apiDescription = GetApiDescription(() => TypedResults.Created("https://example.com", new InferredJsonClass())); |
| 307 | + |
| 308 | + Assert.Equal(1, apiDescription.SupportedResponseTypes.Count); |
| 309 | + |
| 310 | + var createdResponseType = apiDescription.SupportedResponseTypes[0]; |
| 311 | + |
| 312 | + Assert.Equal(201, createdResponseType.StatusCode); |
| 313 | + Assert.Equal(typeof(InferredJsonClass), createdResponseType.Type); |
| 314 | + Assert.Equal(typeof(InferredJsonClass), createdResponseType.ModelMetadata?.ModelType); |
| 315 | + |
| 316 | + var createdResponseFormat = Assert.Single(createdResponseType.ApiResponseFormats); |
| 317 | + Assert.Equal("application/json", createdResponseFormat.MediaType); |
| 318 | + } |
| 319 | + |
| 320 | + [Fact] |
| 321 | + public void HandlesTypedResultsWithoutIEndpointMetadataProviderImplementation() |
| 322 | + { |
| 323 | + // TypedResults for ProblemDetails doesn't implement IEndpointMetadataProvider |
| 324 | + var apiDescription = GetApiDescription(() => TypedResults.Problem()); |
| 325 | + |
| 326 | + Assert.Equal(1, apiDescription.SupportedResponseTypes.Count); |
| 327 | + |
| 328 | + var responseType = apiDescription.SupportedResponseTypes[0]; |
| 329 | + |
| 330 | + Assert.Equal(200, responseType.StatusCode); |
| 331 | + Assert.Equal(typeof(void), responseType.Type); |
| 332 | + Assert.Equal(typeof(void), responseType.ModelMetadata?.ModelType); |
| 333 | + } |
| 334 | + |
| 335 | + [Fact] |
| 336 | + public void AddsResponseFormatsForAwaitableTypedResultWithoutReturnType() |
| 337 | + { |
| 338 | + var apiDescription = GetApiDescription(() => |
| 339 | + Task.FromResult(TypedResults.Created("https://example.com", new InferredJsonClass()))); |
| 340 | + |
| 341 | + Assert.Equal(1, apiDescription.SupportedResponseTypes.Count); |
| 342 | + |
| 343 | + var createdResponseType = apiDescription.SupportedResponseTypes[0]; |
| 344 | + |
| 345 | + Assert.Equal(201, createdResponseType.StatusCode); |
| 346 | + Assert.Equal(typeof(InferredJsonClass), createdResponseType.Type); |
| 347 | + Assert.Equal(typeof(InferredJsonClass), createdResponseType.ModelMetadata?.ModelType); |
| 348 | + |
| 349 | + var createdResponseFormat = Assert.Single(createdResponseType.ApiResponseFormats); |
| 350 | + Assert.Equal("application/json", createdResponseFormat.MediaType); |
| 351 | + } |
| 352 | + |
| 353 | + // Coverage for https://github.com/dotnet/aspnetcore/issues/56975 |
| 354 | + [Fact] |
| 355 | + public void AddsMultipleResponseFormatsFromMetadataWithAwaitableIResult() |
| 356 | + { |
| 357 | + var apiDescription = GetApiDescription( |
| 358 | + [ProducesResponseType(typeof(InferredJsonClass), StatusCodes.Status201Created)] |
| 359 | + [ProducesResponseType(StatusCodes.Status400BadRequest)] |
| 360 | + () => Task.FromResult(Results.Ok(new InferredJsonClass()))); |
| 361 | + |
| 362 | + Assert.Equal(2, apiDescription.SupportedResponseTypes.Count); |
| 363 | + |
| 364 | + var createdResponseType = apiDescription.SupportedResponseTypes[0]; |
| 365 | + |
| 366 | + Assert.Equal(201, createdResponseType.StatusCode); |
| 367 | + Assert.Equal(typeof(InferredJsonClass), createdResponseType.Type); |
| 368 | + Assert.Equal(typeof(InferredJsonClass), createdResponseType.ModelMetadata?.ModelType); |
| 369 | + |
| 370 | + var createdResponseFormat = Assert.Single(createdResponseType.ApiResponseFormats); |
| 371 | + Assert.Equal("application/json", createdResponseFormat.MediaType); |
| 372 | + |
| 373 | + var badRequestResponseType = apiDescription.SupportedResponseTypes[1]; |
| 374 | + |
| 375 | + Assert.Equal(400, badRequestResponseType.StatusCode); |
| 376 | + Assert.Equal(typeof(void), badRequestResponseType.Type); |
| 377 | + Assert.Equal(typeof(void), badRequestResponseType.ModelMetadata?.ModelType); |
| 378 | + |
| 379 | + Assert.Empty(badRequestResponseType.ApiResponseFormats); |
| 380 | + } |
| 381 | + |
| 382 | + [Fact] |
| 383 | + public void AddsMultipleResponseFormatsFromMetadataWithAwaitableResultType() |
| 384 | + { |
| 385 | + var apiDescription = GetApiDescription( |
| 386 | + [ProducesResponseType(typeof(InferredJsonClass), StatusCodes.Status201Created)] |
| 387 | + [ProducesResponseType(StatusCodes.Status400BadRequest)] |
| 388 | + async Task<Results<Created<InferredJsonClass>, ProblemHttpResult>> () => { |
| 389 | + await Task.CompletedTask; |
| 390 | + return Random.Shared.Next() % 2 == 0 |
| 391 | + ? TypedResults.Created<InferredJsonClass>("/", new InferredJsonClass()) |
| 392 | + : TypedResults.Problem(); |
| 393 | + }); |
| 394 | + |
| 395 | + Assert.Equal(2, apiDescription.SupportedResponseTypes.Count); |
| 396 | + |
| 397 | + var createdResponseType = apiDescription.SupportedResponseTypes[0]; |
| 398 | + |
| 399 | + Assert.Equal(201, createdResponseType.StatusCode); |
| 400 | + Assert.Equal(typeof(InferredJsonClass), createdResponseType.Type); |
| 401 | + Assert.Equal(typeof(InferredJsonClass), createdResponseType.ModelMetadata?.ModelType); |
| 402 | + |
| 403 | + var createdResponseFormat = Assert.Single(createdResponseType.ApiResponseFormats); |
| 404 | + Assert.Equal("application/json", createdResponseFormat.MediaType); |
| 405 | + |
| 406 | + var badRequestResponseType = apiDescription.SupportedResponseTypes[1]; |
| 407 | + |
| 408 | + Assert.Equal(400, badRequestResponseType.StatusCode); |
| 409 | + Assert.Equal(typeof(void), badRequestResponseType.Type); |
| 410 | + Assert.Equal(typeof(void), badRequestResponseType.ModelMetadata?.ModelType); |
| 411 | + |
| 412 | + Assert.Empty(badRequestResponseType.ApiResponseFormats); |
| 413 | + } |
| 414 | + |
276 | 415 | [Fact]
|
277 | 416 | public void AddsFromRouteParameterAsPath()
|
278 | 417 | {
|
|
0 commit comments