From 7bde04ea461f1e9e06b93c130e5155cd4230e8ae Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 26 Jun 2018 12:06:33 +0100 Subject: [PATCH] Consider sometimes present field beneath optional array to not be missing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The changes made in 7476562d inadvertently caused a field that is an descendant of an array and a child of an optional field to be considered missing when its parent is only sometimes present. Due to the parent being optional, the parent’s absence should not cause the absent child to be considered to be missing. Closes gh-519 --- .../restdocs/payload/JsonContentHandler.java | 3 +++ .../restdocs/payload/JsonContentHandlerTests.java | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/payload/JsonContentHandler.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/payload/JsonContentHandler.java index c034a0e0..2978dd56 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/payload/JsonContentHandler.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/payload/JsonContentHandler.java @@ -81,6 +81,9 @@ class JsonContentHandler implements ContentHandler { } private boolean isMissing(FieldDescriptor candidate, Object payload) { + if (!this.fieldProcessor.hasField(candidate.getPath(), payload)) { + return true; + } try { ExtractedField extracted = this.fieldProcessor.extract(candidate.getPath(), payload); diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/payload/JsonContentHandlerTests.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/payload/JsonContentHandlerTests.java index 41bc05bb..91c1ff73 100644 --- a/spring-restdocs-core/src/test/java/org/springframework/restdocs/payload/JsonContentHandlerTests.java +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/payload/JsonContentHandlerTests.java @@ -157,4 +157,14 @@ public class JsonContentHandlerTests { assertThat(missingFields.size(), is(equalTo(0))); } + @Test + public void describedFieldThatIsSometimesPresentChildOfOptionalArrayIsNotConsideredMissing() { + List missingFields = new JsonContentHandler( + "{\"a\":[ {\"b\": \"bravo\"}, {\"b\": \"bravo\", \"c\": { \"d\": \"delta\"}}]}" + .getBytes()).findMissingFields( + Arrays.asList(new FieldDescriptor("a.[].c").optional(), + new FieldDescriptor("a.[].c.d]"))); + assertThat(missingFields.size(), is(equalTo(0))); + } + }