From 361a536ae487359dce8b28291fa3d2d7bc9d2355 Mon Sep 17 00:00:00 2001 From: Tim Gee Date: Mon, 14 Oct 2019 22:00:00 +0100 Subject: [PATCH] Allow schema exclusion to be package specific --- pom.xml | 2 +- .../serialize/AbstractJsonObjectAssert.java | 13 +++++---- .../ExcludeInlineSchemaVisitorContext.java | 28 +++++++++++++++++++ .../NoInlineSchemaVisitorContext.java | 14 ---------- ...ctAssert_serializationAsExpected_Test.java | 13 +++++++-- .../examples/NestedComplexExample.java | 17 +++++++++++ .../examples/NestedComplexExample.schema.json | 20 +++++++++++++ 7 files changed, 85 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/trickl/assertj/core/api/json/serialize/ExcludeInlineSchemaVisitorContext.java delete mode 100644 src/main/java/com/trickl/assertj/core/api/json/serialize/NoInlineSchemaVisitorContext.java create mode 100644 src/test/java/com/trickl/assertj/examples/NestedComplexExample.java create mode 100644 src/test/resources/com/trickl/assertj/examples/NestedComplexExample.schema.json diff --git a/pom.xml b/pom.xml index 1a35dc9..ef5c973 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ 4.0.0 com.github.trickl assertj-json-serialize - 0.1.8-SNAPSHOT + 0.1.9-SNAPSHOT jar diff --git a/src/main/java/com/trickl/assertj/core/api/json/serialize/AbstractJsonObjectAssert.java b/src/main/java/com/trickl/assertj/core/api/json/serialize/AbstractJsonObjectAssert.java index f72c110..e1d67e9 100644 --- a/src/main/java/com/trickl/assertj/core/api/json/serialize/AbstractJsonObjectAssert.java +++ b/src/main/java/com/trickl/assertj/core/api/json/serialize/AbstractJsonObjectAssert.java @@ -16,6 +16,8 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.security.CodeSource; +import java.util.ArrayList; +import java.util.List; import org.assertj.core.api.AbstractAssert; @@ -45,7 +47,7 @@ public abstract class AbstractJsonObjectAssert excludeInlineSchemaPackages = new ArrayList<>(); private String jsonDataFileExtension = DEFAULT_JSON_DATA_FILE_EXT; @@ -184,8 +186,8 @@ public S doNotCreateExpectedIfAbsent() { return myself; } - public S withNoInlineSchemas() { - noInlineSchemas = true; + public S excludeInlineSchemaPackage(String packageName) { + excludeInlineSchemaPackages.add(packageName); return myself; } @@ -218,8 +220,9 @@ protected String serialize(Object obj) { protected String schema(Object obj) { try { SchemaFactoryWrapper visitor = new SchemaFactoryWrapper(); - if (noInlineSchemas) { - visitor.setVisitorContext(new NoInlineSchemaVisitorContext()); + if (excludeInlineSchemaPackages.size() > 0) { + visitor.setVisitorContext( + new ExcludeInlineSchemaVisitorContext(excludeInlineSchemaPackages)); } objectMapper.acceptJsonFormatVisitor(actual.getObject().getClass(), visitor); JsonSchema schema = visitor.finalSchema(); diff --git a/src/main/java/com/trickl/assertj/core/api/json/serialize/ExcludeInlineSchemaVisitorContext.java b/src/main/java/com/trickl/assertj/core/api/json/serialize/ExcludeInlineSchemaVisitorContext.java new file mode 100644 index 0000000..1631c4b --- /dev/null +++ b/src/main/java/com/trickl/assertj/core/api/json/serialize/ExcludeInlineSchemaVisitorContext.java @@ -0,0 +1,28 @@ +package com.trickl.assertj.core.api.json.serialize; + +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.module.jsonSchema.factories.VisitorContext; + +import java.util.List; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class ExcludeInlineSchemaVisitorContext extends VisitorContext { + private final List excludePackages; + + @Override + public String getSeenSchemaUri(JavaType javaType) { + if (javaType != null && !javaType.isPrimitive() && isInExcludedPackage(javaType)) { + return javaTypeToUrn(javaType); + } + return null; + } + + private boolean isInExcludedPackage(JavaType javaType) { + String packageName = javaType.getRawClass().getPackage().getName(); + return excludePackages.stream().anyMatch((exclude -> + packageName.equals(exclude) || packageName.startsWith(exclude + ".") + )); + } +} \ No newline at end of file diff --git a/src/main/java/com/trickl/assertj/core/api/json/serialize/NoInlineSchemaVisitorContext.java b/src/main/java/com/trickl/assertj/core/api/json/serialize/NoInlineSchemaVisitorContext.java deleted file mode 100644 index 36aa4ef..0000000 --- a/src/main/java/com/trickl/assertj/core/api/json/serialize/NoInlineSchemaVisitorContext.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.trickl.assertj.core.api.json.serialize; - -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.module.jsonSchema.factories.VisitorContext; - -public class NoInlineSchemaVisitorContext extends VisitorContext { - @Override - public String getSeenSchemaUri(JavaType javaType) { - if (javaType != null && !javaType.isPrimitive()) { - return javaTypeToUrn(javaType); - } - return null; - } -} \ No newline at end of file diff --git a/src/test/java/com/trickl/assertj/core/api/json/serialize/JsonObjectAssert_serializationAsExpected_Test.java b/src/test/java/com/trickl/assertj/core/api/json/serialize/JsonObjectAssert_serializationAsExpected_Test.java index 63bcaee..36b9143 100644 --- a/src/test/java/com/trickl/assertj/core/api/json/serialize/JsonObjectAssert_serializationAsExpected_Test.java +++ b/src/test/java/com/trickl/assertj/core/api/json/serialize/JsonObjectAssert_serializationAsExpected_Test.java @@ -7,6 +7,7 @@ import java.util.Map; import com.trickl.assertj.examples.Example; +import com.trickl.assertj.examples.NestedComplexExample; import com.trickl.assertj.examples.NestedExample; import org.junit.Test; @@ -72,10 +73,10 @@ public void should_pass_on_schema_match() { } @Test - public void should_respect_no_inlining() { + public void should_respect_no_inlining_simple() { NestedExample nested = new NestedExample(); assertThat(nested) - .withNoInlineSchemas() + .excludeInlineSchemaPackage("com.trickl.assertj.examples") .schemaAsExpected(); } @@ -86,4 +87,12 @@ public void should_respect_allow_inlining() { .withSchemaFileExtension(".schema2.json") .schemaAsExpected(); } + + @Test + public void should_respect_no_inlining_complex() { + NestedComplexExample nested = new NestedComplexExample(); + assertThat(nested) + .excludeInlineSchemaPackage("com.trickl.assertj.examples") + .schemaAsExpected(); + } } diff --git a/src/test/java/com/trickl/assertj/examples/NestedComplexExample.java b/src/test/java/com/trickl/assertj/examples/NestedComplexExample.java new file mode 100644 index 0000000..a3879f6 --- /dev/null +++ b/src/test/java/com/trickl/assertj/examples/NestedComplexExample.java @@ -0,0 +1,17 @@ +package com.trickl.assertj.examples; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; +import java.util.Map; + +import lombok.Data; + +@Data +public class NestedComplexExample { + @JsonProperty("list-example") + private List firstExample; + + @JsonProperty("map-example") + private Map secondExample; +} diff --git a/src/test/resources/com/trickl/assertj/examples/NestedComplexExample.schema.json b/src/test/resources/com/trickl/assertj/examples/NestedComplexExample.schema.json new file mode 100644 index 0000000..b01dfc3 --- /dev/null +++ b/src/test/resources/com/trickl/assertj/examples/NestedComplexExample.schema.json @@ -0,0 +1,20 @@ +{ + "id": "urn:jsonschema:com:trickl:assertj:examples:NestedComplexExample", + "type": "object", + "properties": { + "list-example": { + "type": "array", + "items": { + "type": "object", + "$ref": "urn:jsonschema:com:trickl:assertj:examples:Example" + } + }, + "map-example": { + "additionalProperties": { + "type": "object", + "$ref": "urn:jsonschema:com:trickl:assertj:examples:Example" + }, + "type": "object" + } + } +} \ No newline at end of file