From 636cff7d40bff46ce5ae5b2c3e76a2f9d01f6d9f Mon Sep 17 00:00:00 2001 From: frantuma Date: Fri, 25 Mar 2022 13:53:37 +0100 Subject: [PATCH] oas 3.1 - opinionated deterministic schema properties ordering --- .../v3/core/jackson/mixin/Schema31Mixin.java | 2 + .../SchemaSerializationTest.java | 60 +++++++++++++------ 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Schema31Mixin.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Schema31Mixin.java index 02170fc62e..67dcfd015c 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Schema31Mixin.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Schema31Mixin.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; @@ -15,6 +16,7 @@ import java.util.Map; import java.util.Set; +@JsonPropertyOrder(value = {"type", "format", "if", "then", "else"}, alphabetic = true) public abstract class Schema31Mixin { //@JsonValue diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/SchemaSerializationTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/SchemaSerializationTest.java index 00f63796ec..713f5f9da7 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/SchemaSerializationTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/SchemaSerializationTest.java @@ -3,45 +3,70 @@ import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.media.JsonSchema; import org.testng.annotations.Test; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.HashSet; + public class SchemaSerializationTest { @Test public void serializeRefSchema3_1() { OpenAPI openAPI = new OpenAPI() .components(new Components() - .addSchemas("Pet", new Schema() - .addProperties("id", new Schema().type("integer")) - .addProperties("name", new Schema().type("string")) - .addProperties("tag", new Schema().type("string"))) - .addSchemas("AnotherPet", new Schema() + .addSchemas("Pet", new JsonSchema() + .types(new HashSet<>(Arrays.asList("object"))) + .format("whatever") + ._if(new JsonSchema().type("string").types(new HashSet<>(Arrays.asList("string")))) + .then(new JsonSchema().type("string").types(new HashSet<>(Arrays.asList("string")))) + ._else(new JsonSchema().type("string").types(new HashSet<>(Arrays.asList("string")))) + .minimum(BigDecimal.valueOf(1)) + .addProperties("id", new JsonSchema().type("integer").types(new HashSet<>(Arrays.asList("integer")))) + .addProperties("name", new JsonSchema().type("string").types(new HashSet<>(Arrays.asList("string")))) + .addProperties("tag", new JsonSchema().type("string").types(new HashSet<>(Arrays.asList("string"))))) + .addSchemas("AnotherPet", new JsonSchema() .title("Another Pet") .description("Another Pet for petstore referencing Pet schema") .$ref("#/components/schemas/Pet") - .addProperties("category", new Schema().type("string")) - .addProperties("photoUrl", new Schema().type("string")))); + .addProperties("category", new JsonSchema().types(new HashSet<>(Arrays.asList("string")))) + .addProperties("photoUrl", new JsonSchema().types(new HashSet<>(Arrays.asList("string")))))); SerializationMatchers.assertEqualsToYaml31(openAPI, "openapi: 3.0.1\n" + "components:\n" + " schemas:\n" + " Pet:\n" + + " type: object\n" + + " format: whatever\n" + + " if:\n" + + " type: string\n" + + " then:\n" + + " type: string\n" + + " else:\n" + + " type: string\n" + + " minimum: 1\n" + " properties:\n" + - " id: {}\n" + - " name: {}\n" + - " tag: {}\n" + + " id:\n" + + " type: integer\n" + + " name:\n" + + " type: string\n" + + " tag:\n" + + " type: string\n" + " AnotherPet:\n" + - " title: Another Pet\n" + - " properties:\n" + - " category: {}\n" + - " photoUrl: {}\n" + + " $ref: '#/components/schemas/Pet'\n" + " description: Another Pet for petstore referencing Pet schema\n" + - " $ref: '#/components/schemas/Pet'"); + " properties:\n" + + " category:\n" + + " type: string\n" + + " photoUrl:\n" + + " type: string\n" + + " title: Another Pet\n"); SerializationMatchers.assertEqualsToYaml(openAPI, "openapi: 3.0.1\n" + "components:\n" + " schemas:\n" + " Pet:\n" + + " minimum: 1\n" + " properties:\n" + " id:\n" + " type: integer\n" + @@ -49,7 +74,8 @@ public void serializeRefSchema3_1() { " type: string\n" + " tag:\n" + " type: string\n" + + " format: whatever\n" + " AnotherPet:\n" + - " $ref: '#/components/schemas/Pet'"); + " $ref: '#/components/schemas/Pet'\n"); } }