From e12e5718b6788ac27830bcbf4f96f01cb4132d46 Mon Sep 17 00:00:00 2001 From: Fredrik Teschke Date: Wed, 24 Oct 2018 11:16:50 +0200 Subject: [PATCH] :sparkles: Add `Snapshot.ignore(String... paths)` method - Restricted to nested `java.util.Map` objects. - Technically replaces the nested value with `"IGNORE"` if it is present. --- .../java/io/github/jsonSnapshot/Snapshot.java | 20 +++++++++++++ .../io/github/jsonSnapshot/SnapshotUtils.java | 30 +++++++++++++++++++ src/test/resources/ignoreFieldsExpected.json | 8 +++++ src/test/resources/ignoreFieldsOriginal.json | 8 +++++ 4 files changed, 66 insertions(+) create mode 100644 src/test/resources/ignoreFieldsExpected.json create mode 100644 src/test/resources/ignoreFieldsOriginal.json diff --git a/src/main/java/io/github/jsonSnapshot/Snapshot.java b/src/main/java/io/github/jsonSnapshot/Snapshot.java index cb5875a..5ecd1ac 100644 --- a/src/main/java/io/github/jsonSnapshot/Snapshot.java +++ b/src/main/java/io/github/jsonSnapshot/Snapshot.java @@ -1,11 +1,13 @@ package io.github.jsonSnapshot; +import lombok.Getter; import org.assertj.core.util.diff.DiffUtils; import org.assertj.core.util.diff.Patch; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; +import java.util.Map; import java.util.Set; import java.util.function.Function; @@ -19,6 +21,7 @@ public class Snapshot { private Function jsonFunction; + @Getter private Object[] current; Snapshot(SnapshotFile snapshotFile, Class clazz, Method method, Function jsonFunction, Object... current) { @@ -76,4 +79,21 @@ private String takeSnapshot() { public String getSnapshotName() { return clazz.getName() + "." + method.getName() + "="; } + + /** + * Ignore nested fields in the {@link #current} objects. + * + * @param pathsToIgnore Dot delimited paths to ignore within the {@link #current} objects. For example {@code nested.field}. + * @return self + * @throws SnapshotMatchException if the {@link #current} objects are not nested {@link Map}s. + */ + public Snapshot ignoring(String... pathsToIgnore) throws SnapshotMatchException { + for (String path : pathsToIgnore) { + for (Object object : current) { + SnapshotUtils.deleteNestedFieldFromMap(object, path); + } + } + + return this; + } } diff --git a/src/main/java/io/github/jsonSnapshot/SnapshotUtils.java b/src/main/java/io/github/jsonSnapshot/SnapshotUtils.java index 6ee299c..0b6ae4e 100644 --- a/src/main/java/io/github/jsonSnapshot/SnapshotUtils.java +++ b/src/main/java/io/github/jsonSnapshot/SnapshotUtils.java @@ -4,9 +4,11 @@ import java.lang.reflect.Parameter; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.verify; @@ -82,4 +84,32 @@ private static HashMap>> process( return result; } + + public static void deleteNestedFieldFromMap(Object object, String path) { + deleteNestedFieldFromMap(object, Arrays.asList(path.split("\\."))); + } + + private static void deleteNestedFieldFromMap(Object object, List pathSegments) { + if (!(object instanceof Map)) { + throw new SnapshotMatchException("object is not a map"); + } + + Map map = (Map) object; + int numberOfSegments = pathSegments.size(); + + if (numberOfSegments == 0) { + return; + } + + String key = pathSegments.get(0); + + if (numberOfSegments == 1) { + if (map.containsKey(key)) { + map.put(key, "IGNORED"); + } + return; + } + + deleteNestedFieldFromMap(map.get(key), pathSegments.subList(1, numberOfSegments)); + } } diff --git a/src/test/resources/ignoreFieldsExpected.json b/src/test/resources/ignoreFieldsExpected.json new file mode 100644 index 0000000..7c6ffe4 --- /dev/null +++ b/src/test/resources/ignoreFieldsExpected.json @@ -0,0 +1,8 @@ +{ + "topLevel": "IGNORED", + "nested": { + "field": "IGNORED", + "notIgnored": "unchanged" + }, + "notIgnored": "unchanged" +} \ No newline at end of file diff --git a/src/test/resources/ignoreFieldsOriginal.json b/src/test/resources/ignoreFieldsOriginal.json new file mode 100644 index 0000000..61d9859 --- /dev/null +++ b/src/test/resources/ignoreFieldsOriginal.json @@ -0,0 +1,8 @@ +{ + "topLevel": "X", + "nested": { + "field": "Y", + "notIgnored": "unchanged" + }, + "notIgnored": "unchanged" +} \ No newline at end of file