|
8 | 8 | using Microsoft.Extensions.DependencyInjection;
|
9 | 9 | using Microsoft.OpenApi.Any;
|
10 | 10 | using Microsoft.OpenApi.Models;
|
11 |
| -using Xunit.Sdk; |
12 | 11 |
|
13 | 12 | public class SchemaTransformerTests : OpenApiDocumentServiceTestBase
|
14 | 13 | {
|
@@ -606,6 +605,61 @@ await VerifyOpenApiDocument(builder, options, document =>
|
606 | 605 | });
|
607 | 606 | }
|
608 | 607 |
|
| 608 | + [Fact] |
| 609 | + public async Task SchemaTransformers_CanImplementNotSchemaIndependently() |
| 610 | + { |
| 611 | + var builder = CreateBuilder(); |
| 612 | + |
| 613 | + builder.MapGet("/todo", () => new Todo(1, "Item1", false, DateTime.Now)); |
| 614 | + builder.MapPost("/shape", (Shape shape) => { }); |
| 615 | + |
| 616 | + var options = new OpenApiOptions(); |
| 617 | + options.AddSchemaTransformer((schema, context, cancellationToken) => |
| 618 | + { |
| 619 | + if (context.JsonTypeInfo.Type == typeof(Todo)) |
| 620 | + { |
| 621 | + schema.Not = new OpenApiSchema { Type = "string" }; |
| 622 | + } |
| 623 | + if (context.JsonTypeInfo.Type == typeof(Triangle)) |
| 624 | + { |
| 625 | + schema.Not = new OpenApiSchema { Type = "string" }; |
| 626 | + } |
| 627 | + return Task.CompletedTask; |
| 628 | + }); |
| 629 | + UseNotSchemaTransformer(options, (schema, context, cancellationToken) => |
| 630 | + { |
| 631 | + schema.Extensions["modified-by-not-schema-transformer"] = new OpenApiBoolean(true); |
| 632 | + return Task.CompletedTask; |
| 633 | + }); |
| 634 | + |
| 635 | + // Assert that not schemas have been modified for both `Todo` and `Triangle` types. |
| 636 | + await VerifyOpenApiDocument(builder, options, document => |
| 637 | + { |
| 638 | + var path = document.Paths["/todo"]; |
| 639 | + var getOperation = path.Operations[OperationType.Get]; |
| 640 | + var responseSchema = getOperation.Responses["200"].Content["application/json"].Schema.GetEffective(document); |
| 641 | + Assert.True(((OpenApiBoolean)responseSchema.Not.Extensions["modified-by-not-schema-transformer"]).Value); |
| 642 | + |
| 643 | + var shapePath = document.Paths["/shape"]; |
| 644 | + var shapeOperation = shapePath.Operations[OperationType.Post]; |
| 645 | + var shapeRequestSchema = shapeOperation.RequestBody.Content["application/json"].Schema.GetEffective(document); |
| 646 | + var triangleSchema = Assert.Single(shapeRequestSchema.AnyOf.Where(s => s.Reference.Id == "ShapeTriangle")).GetEffective(document); |
| 647 | + Assert.True(((OpenApiBoolean)triangleSchema.Not.Extensions["modified-by-not-schema-transformer"]).Value); |
| 648 | + }); |
| 649 | + |
| 650 | + static void UseNotSchemaTransformer(OpenApiOptions options, Func<OpenApiSchema, OpenApiSchemaTransformerContext, CancellationToken, Task> func) |
| 651 | + { |
| 652 | + options.AddSchemaTransformer(async (schema, context, cancellationToken) => |
| 653 | + { |
| 654 | + if (schema.Not != null) |
| 655 | + { |
| 656 | + await func(schema.Not, context, cancellationToken); |
| 657 | + } |
| 658 | + return; |
| 659 | + }); |
| 660 | + } |
| 661 | + } |
| 662 | + |
609 | 663 | private class ActivatedTransformer : IOpenApiSchemaTransformer
|
610 | 664 | {
|
611 | 665 | public Task TransformAsync(OpenApiSchema schema, OpenApiSchemaTransformerContext context, CancellationToken cancellationToken)
|
|
0 commit comments