Skip to content

Commit c525ccd

Browse files
committed
Add test for tranformers on unsupported subschemas
1 parent 62e16af commit c525ccd

File tree

1 file changed

+55
-1
lines changed

1 file changed

+55
-1
lines changed

src/OpenApi/test/Transformers/SchemaTransformerTests.cs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using Microsoft.Extensions.DependencyInjection;
99
using Microsoft.OpenApi.Any;
1010
using Microsoft.OpenApi.Models;
11-
using Xunit.Sdk;
1211

1312
public class SchemaTransformerTests : OpenApiDocumentServiceTestBase
1413
{
@@ -606,6 +605,61 @@ await VerifyOpenApiDocument(builder, options, document =>
606605
});
607606
}
608607

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+
609663
private class ActivatedTransformer : IOpenApiSchemaTransformer
610664
{
611665
public Task TransformAsync(OpenApiSchema schema, OpenApiSchemaTransformerContext context, CancellationToken cancellationToken)

0 commit comments

Comments
 (0)