Skip to content

Commit c679840

Browse files
committed
test(response): test content negotiation for all openapi specs
1 parent 3802787 commit c679840

4 files changed

Lines changed: 84 additions & 51 deletions

File tree

tests/Example.OpenApi20/Paths/FooFooId/Put/Operation.Handler.cs

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,21 @@ public Operation()
1212
ValidationLevel = ValidationLevel.Detailed;
1313
}
1414

15-
private static Response.BadRequest400 HandleValidationErrors(HttpContext _, ImmutableList<ValidationResult> validationResults)
15+
private static Response.BadRequest400 HandleValidationErrors(HttpContext context, ImmutableList<ValidationResult> validationResults)
1616
{
17-
var response = validationResults.Select(result =>
18-
Responses.BadRequest.RequiredErrorAndName.Create(
19-
name: result.Location?.SchemaLocation.ToString() ?? string.Empty,
20-
error: result.Message ?? string.Empty));
21-
return new Response.BadRequest400.ApplicationJson(
22-
Responses.BadRequest.Create(response.ToArray()));
17+
switch (context.Request.TryMatchAcceptMediaType(Response.BadRequest400.ContentMediaTypes, out var matchedMediaType))
18+
{
19+
case false:
20+
case true when ReferenceEquals(matchedMediaType, Response.BadRequest400.ApplicationJson.ContentMediaType):
21+
var response = validationResults.Select(result =>
22+
Responses.BadRequest.RequiredErrorAndName.Create(
23+
name: result.Location?.SchemaLocation.ToString() ?? string.Empty,
24+
error: result.Message ?? string.Empty));
25+
return new Response.BadRequest400.ApplicationJson(
26+
Responses.BadRequest.Create(response.ToArray()));
27+
default:
28+
throw new NotImplementedException($"Content media type {matchedMediaType} has not been implemented");
29+
}
2330
}
2431

2532
internal partial Task<Response> HandleAsync(Request request, CancellationToken cancellationToken)
@@ -28,18 +35,24 @@ internal partial Task<Response> HandleAsync(Request request, CancellationToken c
2835
_ = request.Path.FooId;
2936
_ = request.Header.Bar;
3037

31-
var response = new Response.OK200.ApplicationJson(Definitions.FooProperties.Create(
32-
name: request.Body.ApplicationJson?.Name))
38+
switch (request.TryMatchAcceptMediaType(Response.OK200.ContentMediaTypes, out var matchedMediaType))
3339
{
34-
Headers = new Response.OK200.ResponseHeaders
35-
{
36-
Status = 2
37-
}
38-
};
39-
40-
var validationContext = response.Validate(ValidationLevel);
41-
return !validationContext.IsValid
42-
? throw new JsonValidationException("Response is not valid", validationContext.Results)
43-
: Task.FromResult<Response>(response);
40+
case false:
41+
case true when ReferenceEquals(matchedMediaType, Response.OK200.ApplicationJson.ContentMediaType):
42+
var response = new Response.OK200.ApplicationJson(Definitions.FooProperties.Create(
43+
name: request.Body.ApplicationJson?.Name))
44+
{
45+
Headers = new Response.OK200.ResponseHeaders
46+
{
47+
Status = 2
48+
}
49+
};
50+
var validationContext = response.Validate(ValidationLevel);
51+
return !validationContext.IsValid
52+
? throw new JsonValidationException("Response is not valid", validationContext.Results)
53+
: Task.FromResult<Response>(response);
54+
default:
55+
throw new NotImplementedException($"Content media type {matchedMediaType} has not been implemented");
56+
}
4457
}
4558
}

tests/Example.OpenApi30/Paths/FooFooId/Put/Operation.Handler.cs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,21 @@ public Operation()
1111
ValidateResponse = true;
1212
}
1313

14-
private static Response.BadRequest400 HandleValidationErrors(HttpContext _, ImmutableList<ValidationResult> validationResults)
14+
private static Response.BadRequest400 HandleValidationErrors(HttpContext context, ImmutableList<ValidationResult> validationResults)
1515
{
16-
var response = validationResults.Select(result =>
17-
Components.Responses.BadRequest.Content.ApplicationJson.RequiredErrorAndName.Create(
18-
name: result.Location?.SchemaLocation.ToString() ?? string.Empty,
19-
error: result.Message ?? string.Empty));
20-
return new Response.BadRequest400.ApplicationJson(
21-
Components.Responses.BadRequest.Content.ApplicationJson.Create(response.ToArray()));
16+
switch (context.Request.TryMatchAcceptMediaType(Response.BadRequest400.ContentMediaTypes, out var matchedMediaType))
17+
{
18+
case false:
19+
case true when ReferenceEquals(matchedMediaType, Response.BadRequest400.ApplicationJson.ContentMediaType):
20+
var response = validationResults.Select(result =>
21+
Components.Responses.BadRequest.Content.ApplicationJson.RequiredErrorAndName.Create(
22+
name: result.Location?.SchemaLocation.ToString() ?? string.Empty,
23+
error: result.Message ?? string.Empty));
24+
return new Response.BadRequest400.ApplicationJson(
25+
Components.Responses.BadRequest.Content.ApplicationJson.Create(response.ToArray()));
26+
default:
27+
throw new NotImplementedException($"Content media type {matchedMediaType} has not been implemented");
28+
}
2229
}
2330

2431
internal partial Task<Response> HandleAsync(Request request, CancellationToken cancellationToken)
@@ -27,14 +34,17 @@ internal partial Task<Response> HandleAsync(Request request, CancellationToken c
2734
_ = request.Path.FooId;
2835
_ = request.Header.Bar;
2936

30-
var response = new Response.OK200.ApplicationJson(Components.Schemas.FooProperties.Create(
31-
name: request.Body.ApplicationJson?.Name))
37+
switch (request.TryMatchAcceptMediaType(Response.OK200.ContentMediaTypes, out var matchedMediaType))
3238
{
33-
Headers = new Response.OK200.ResponseHeaders
34-
{
35-
Status = 2
36-
}
37-
};
38-
return Task.FromResult<Response>(response);
39+
case false:
40+
case true when ReferenceEquals(matchedMediaType, Response.OK200.ApplicationJson.ContentMediaType):
41+
return Task.FromResult<Response>(new Response.OK200.ApplicationJson(
42+
Components.Schemas.FooProperties.Create(name: request.Body.ApplicationJson?.Name))
43+
{
44+
Headers = new Response.OK200.ResponseHeaders { Status = 2 }
45+
});
46+
default:
47+
throw new NotImplementedException($"Content media type {matchedMediaType} has not been implemented");
48+
}
3949
}
4050
}

tests/Example.OpenApi31/Paths/FooFooId/Put/Operation.Handler.cs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,21 @@ public Operation()
1010
HandleRequestValidationError = HandleValidationErrors;
1111
}
1212

13-
private static Response.BadRequest400 HandleValidationErrors(HttpContext _, ImmutableList<ValidationResult> validationResults)
13+
private static Response.BadRequest400 HandleValidationErrors(HttpContext context, ImmutableList<ValidationResult> validationResults)
1414
{
15-
var response = validationResults.Select(result =>
16-
Components.Responses.BadRequest.Content.ApplicationJson.RequiredErrorAndName.Create(
17-
name: result.Location?.SchemaLocation.ToString() ?? string.Empty,
18-
error: result.Message ?? string.Empty));
19-
return new Response.BadRequest400.ApplicationJson(
20-
Components.Responses.BadRequest.Content.ApplicationJson.Create(response.ToArray()));
15+
switch (context.Request.TryMatchAcceptMediaType(Response.BadRequest400.ContentMediaTypes, out var matchedMediaType))
16+
{
17+
case false:
18+
case true when ReferenceEquals(matchedMediaType, Response.BadRequest400.ApplicationJson.ContentMediaType):
19+
var response = validationResults.Select(result =>
20+
Components.Responses.BadRequest.Content.ApplicationJson.RequiredErrorAndName.Create(
21+
name: result.Location?.SchemaLocation.ToString() ?? string.Empty,
22+
error: result.Message ?? string.Empty));
23+
return new Response.BadRequest400.ApplicationJson(
24+
Components.Responses.BadRequest.Content.ApplicationJson.Create(response.ToArray()));
25+
default:
26+
throw new NotImplementedException($"Content media type {matchedMediaType} has not been implemented");
27+
}
2128
}
2229

2330
internal partial Task<Response> HandleAsync(Request request, CancellationToken cancellationToken)
@@ -26,14 +33,17 @@ internal partial Task<Response> HandleAsync(Request request, CancellationToken c
2633
_ = request.Path.FooId;
2734
_ = request.Header.Bar;
2835

29-
var response = new Response.OK200.ApplicationJson(Components.Schemas.FooProperties.Create(
30-
name: request.Body.ApplicationJson?.Name))
36+
switch (request.TryMatchAcceptMediaType(Response.OK200.ContentMediaTypes, out var matchedMediaType))
3137
{
32-
Headers = new Response.OK200.ResponseHeaders
33-
{
34-
Status = 2
35-
}
36-
};
37-
return Task.FromResult<Response>(response);
38+
case false:
39+
case true when ReferenceEquals(matchedMediaType, Response.OK200.ApplicationJson.ContentMediaType):
40+
return Task.FromResult<Response>(new Response.OK200.ApplicationJson(
41+
Components.Schemas.FooProperties.Create(name: request.Body.ApplicationJson?.Name))
42+
{
43+
Headers = new Response.OK200.ResponseHeaders { Status = 2 }
44+
});
45+
default:
46+
throw new NotImplementedException($"Content media type {matchedMediaType} has not been implemented");
47+
}
3848
}
3949
}

tests/Example.OpenApi32/Paths/FooFooId/Put/Operation.Handler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ public Operation()
1212

1313
private static Response.BadRequest400 HandleValidationErrors(HttpContext context, ImmutableList<ValidationResult> validationResults)
1414
{
15-
switch (context.Request.TryMatchAcceptMediaType(Response.OK200.ContentMediaTypes, out var matchedMediaType))
15+
switch (context.Request.TryMatchAcceptMediaType(Response.BadRequest400.ContentMediaTypes, out var matchedMediaType))
1616
{
1717
case false:
18-
case true when ReferenceEquals(matchedMediaType, Response.OK200.AnyApplication.ContentMediaType):
18+
case true when ReferenceEquals(matchedMediaType, Response.BadRequest400.ApplicationJson.ContentMediaType):
1919
var response = validationResults.Select(result =>
2020
Components.Responses.BadRequest.Content.ApplicationJson.RequiredErrorAndName.Create(
2121
name: result.Location?.SchemaLocation.ToString() ?? string.Empty,

0 commit comments

Comments
 (0)