From e1eaa9726a5a5e04c56bb59e0bb4467f55e2ed23 Mon Sep 17 00:00:00 2001 From: Lukas Krecan Date: Sat, 25 May 2019 08:42:59 +0200 Subject: [PATCH] #182 Ignore paths even if present in expected value --- .../javacrumbs/jsonunit/assertj/JsonAssert.java | 7 +++++++ .../javacrumbs/jsonunit/core/Configuration.java | 7 +++++++ .../javacrumbs/jsonunit/core/internal/Diff.java | 5 +++-- .../jsonunit/fluent/JsonFluentAssert.java | 3 ++- .../java/net/javacrumbs/jsonunit/JsonMatchers.java | 4 ++++ .../jsonunit/test/base/AbstractAssertJTest.java | 14 ++++++++++++++ 6 files changed, 37 insertions(+), 3 deletions(-) diff --git a/json-unit-assertj/src/main/java/net/javacrumbs/jsonunit/assertj/JsonAssert.java b/json-unit-assertj/src/main/java/net/javacrumbs/jsonunit/assertj/JsonAssert.java index 3a07e7b05..8d3e9f35f 100644 --- a/json-unit-assertj/src/main/java/net/javacrumbs/jsonunit/assertj/JsonAssert.java +++ b/json-unit-assertj/src/main/java/net/javacrumbs/jsonunit/assertj/JsonAssert.java @@ -340,6 +340,13 @@ public ConfigurableJsonAssert withTolerance(double tolerance) { return withTolerance(BigDecimal.valueOf(tolerance)); } + /** + * Makes JsonUnit ignore the specified paths in the actual value. If the path matches, + * it's completely ignored. It may be missing, null or have any value + * + * @param pathsToBeIgnored + * @return + */ public ConfigurableJsonAssert whenIgnoringPaths(String... pathsToBeIgnored) { return withConfiguration(c -> c.whenIgnoringPaths(pathsToBeIgnored)); } diff --git a/json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/Configuration.java b/json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/Configuration.java index 09ce11f59..9955b1aae 100644 --- a/json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/Configuration.java +++ b/json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/Configuration.java @@ -118,6 +118,13 @@ public Configuration withOptions(Options options) { return new Configuration(tolerance, options, ignorePlaceholder, matchers, pathsToBeIgnored, differenceListener); } + /** + * Makes JsonUnit ignore the specified paths in the actual value. If the path matches, + * it's completely ignored. It may be missing, null or have any value + * + * @param pathsToBeIgnored + * @return + */ public Configuration whenIgnoringPaths(String... pathsToBeIgnored) { return new Configuration(tolerance, options, ignorePlaceholder, matchers, asList(pathsToBeIgnored), differenceListener); } diff --git a/json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/Diff.java b/json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/Diff.java index d8915d400..07454814f 100644 --- a/json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/Diff.java +++ b/json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/Diff.java @@ -151,6 +151,7 @@ private void compareObjectNodes(Context context) { } removePathsToBeIgnored(path, extraKeys); + removePathsToBeIgnored(path, missingKeys); removeMissingIgnoredElements(expected, missingKeys); @@ -172,8 +173,8 @@ private void compareObjectNodes(Context context) { } } - private boolean removeMissingIgnoredElements(Node expected, Set missingKeys) { - return missingKeys.removeIf(missingKey -> shouldIgnoreElement(expected.get(missingKey))); + private void removeMissingIgnoredElements(Node expected, Set missingKeys) { + missingKeys.removeIf(missingKey -> shouldIgnoreElement(expected.get(missingKey))); } @SuppressWarnings("unchecked") diff --git a/json-unit-fluent/src/main/java/net/javacrumbs/jsonunit/fluent/JsonFluentAssert.java b/json-unit-fluent/src/main/java/net/javacrumbs/jsonunit/fluent/JsonFluentAssert.java index 3419f5401..89bc26007 100644 --- a/json-unit-fluent/src/main/java/net/javacrumbs/jsonunit/fluent/JsonFluentAssert.java +++ b/json-unit-fluent/src/main/java/net/javacrumbs/jsonunit/fluent/JsonFluentAssert.java @@ -357,7 +357,8 @@ public ConfigurableJsonFluentAssert node(String newPath) { } /** - * Adds paths to be ignored + * Makes JsonUnit ignore the specified paths in the actual value. If the path matches, + * it's completely ignored. It may be missing, null or have any value */ public ConfigurableJsonFluentAssert whenIgnoringPaths(String... pathsToBeIgnored) { return new ConfigurableJsonFluentAssert(actual, path, description, configuration.whenIgnoringPaths(pathsToBeIgnored)); diff --git a/json-unit/src/main/java/net/javacrumbs/jsonunit/JsonMatchers.java b/json-unit/src/main/java/net/javacrumbs/jsonunit/JsonMatchers.java index 16c4bea2d..714566a7c 100644 --- a/json-unit/src/main/java/net/javacrumbs/jsonunit/JsonMatchers.java +++ b/json-unit/src/main/java/net/javacrumbs/jsonunit/JsonMatchers.java @@ -163,6 +163,10 @@ public ConfigurableJsonMatcher withMatcher(String matcherName, Matcher mat return this; } + /** + * Makes JsonUnit ignore the specified paths in the actual value. If the path matches, + * it's completely ignored. It may be missing, null or have any value + */ public ConfigurableJsonMatcher whenIgnoringPaths(String... paths) { configuration = configuration.whenIgnoringPaths(paths); return this; diff --git a/tests/test-base/src/main/java/net/javacrumbs/jsonunit/test/base/AbstractAssertJTest.java b/tests/test-base/src/main/java/net/javacrumbs/jsonunit/test/base/AbstractAssertJTest.java index 4470cefa5..3c5b765b2 100644 --- a/tests/test-base/src/main/java/net/javacrumbs/jsonunit/test/base/AbstractAssertJTest.java +++ b/tests/test-base/src/main/java/net/javacrumbs/jsonunit/test/base/AbstractAssertJTest.java @@ -411,6 +411,20 @@ void multipleFailuresErrorShouldbeCorrectlyFormatted() { }); } + @Test + void shouldIgnoreMissingPathEvenIfItIsInExpectedValue() { + assertThatJson("{\"root\":{\"foo\":1}}") + .whenIgnoringPaths("root.bar", "missing") + .isEqualTo("{\"root\":{\"foo\":1, \"bar\":2}, \"missing\":{\"quux\":\"test\"}}"); + } + + @Test + void shouldIgnoreArrayElement() { + assertThatJson("{\"root\":[0, 1, 2]}") + .whenIgnoringPaths("root[1]") + .isEqualTo("{\"root\":[0, 8, 2]}"); + } + @Test void arraySimpleIgnoringOrderNotEqualComparison() { assertThatJson("{\"a\":[{\"b\": 1}, {\"c\": 1}, {\"d\": 1}]}").when(Option.IGNORING_ARRAY_ORDER).node("a").isArray()