Browse Source

Merge pull request #237 from helsing/issue_232_assert_empty_arrays

Fix for assert on empty arrays, issues #232 and #236
pull/263/head
kallestenflo 9 years ago committed by GitHub
parent
commit
60cd93dbf2
  1. 43
      json-path-assert/README.md
  2. 18
      json-path-assert/src/main/java/com/jayway/jsonpath/matchers/JsonPathMatchers.java
  3. 4
      json-path-assert/src/main/java/com/jayway/jsonpath/matchers/WithoutJsonPath.java
  4. 30
      json-path-assert/src/test/java/com/jayway/jsonpath/matchers/HasNoJsonPathTest.java
  5. 53
      json-path-assert/src/test/java/com/jayway/jsonpath/matchers/IsJsonTest.java
  6. 188
      json-path-assert/src/test/java/com/jayway/jsonpath/matchers/JsonPathMatchersTest.java
  7. 28
      json-path-assert/src/test/java/com/jayway/jsonpath/matchers/WithJsonPathTest.java
  8. 44
      json-path-assert/src/test/java/com/jayway/jsonpath/matchers/WithoutJsonPathTest.java
  9. 11
      json-path-assert/src/test/java/com/jayway/jsonpath/matchers/helpers/ResourceHelpers.java
  10. 4
      json-path-assert/src/test/resources/books.json

43
json-path-assert/README.md

@ -80,3 +80,46 @@ Use typed matchers for specific JSON representations, if needed
File json = ... File json = ...
assertThat(json, isJsonFile(withJsonPath("$..author"))); assertThat(json, isJsonFile(withJsonPath("$..author")));
---
### Regarding the use of indefinite paths
When using indefinite path expressions (e.g with wildcards '*'), the result will yield a list. Possibly an _empty_ list if no matching entries were found. If you want to assert that the list will actually contain something, make sure to express this explicitly, e.g checking for the size of the list.
// Given a JSON like this:
{
"items": []
}
// Both of these statements will succeed(!)
assertThat(json, hasJsonPath("$.items[*]"));
assertThat(json, hasJsonPath("$.items[*].name"));
// Make sure to explicitly check for size if you want to catch this scenario as a failure
assertThat(json, hasJsonPath("$.items[*]", hasSize(greaterThan(0))));
// However, checking for the existence of an array works fine, as is
assertThat(json, hasJsonPath("$.not_here[*]"));
---
### Regarding the use of null in JSON
'null' is a valid JSON value. If such a value exist, the path is still considered to be a valid path.
// Given a JSON like this:
{ "none": null }
// All of these will succeed, since '$.none' is a valid path
assertThat(json, hasJsonPath("$.none"));
assertThat(json, isJson(withJsonPath("$.none")));
assertThat(json, hasJsonPath("$.none", nullValue()));
assertThat(json, isJson(withJsonPath("$.none", nullValue())));
// But all of these will fail, since '$.not_there' is not a valid path
assertThat(json, hasJsonPath("$.not_there"));
assertThat(json, isJson(withJsonPath("$.not_there")));
assertThat(json, hasJsonPath("$.not_there", anything()));
assertThat(json, isJson(withJsonPath("$.not_there", anything())));

18
json-path-assert/src/main/java/com/jayway/jsonpath/matchers/JsonPathMatchers.java

@ -6,6 +6,8 @@ import com.jayway.jsonpath.ReadContext;
import org.hamcrest.Matcher; import org.hamcrest.Matcher;
import java.io.File; import java.io.File;
import java.util.List;
import java.util.Map;
import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.*;
@ -17,11 +19,11 @@ public class JsonPathMatchers {
public static Matcher<? super Object> hasJsonPath(String jsonPath) { public static Matcher<? super Object> hasJsonPath(String jsonPath) {
return describedAs("has json path %0", return describedAs("has json path %0",
hasJsonPath(jsonPath, not(anyOf(nullValue(), empty()))), isJson(withJsonPath(jsonPath)),
jsonPath); jsonPath);
} }
public static <T> Matcher<? super Object> hasJsonPath(final String jsonPath, final Matcher<T> resultMatcher) { public static <T> Matcher<? super Object> hasJsonPath(String jsonPath, Matcher<T> resultMatcher) {
return isJson(withJsonPath(jsonPath, resultMatcher)); return isJson(withJsonPath(jsonPath, resultMatcher));
} }
@ -30,18 +32,18 @@ public class JsonPathMatchers {
} }
public static Matcher<Object> isJson() { public static Matcher<Object> isJson() {
return isJson(withJsonPath("$..*")); return isJson(withJsonPath("$", anyOf(instanceOf(Map.class), instanceOf(List.class))));
} }
public static Matcher<Object> isJson(final Matcher<? super ReadContext> matcher) { public static Matcher<Object> isJson(Matcher<? super ReadContext> matcher) {
return new IsJson<Object>(matcher); return new IsJson<Object>(matcher);
} }
public static Matcher<String> isJsonString(final Matcher<? super ReadContext> matcher) { public static Matcher<String> isJsonString(Matcher<? super ReadContext> matcher) {
return new IsJson<String>(matcher); return new IsJson<String>(matcher);
} }
public static Matcher<File> isJsonFile(final Matcher<? super ReadContext> matcher) { public static Matcher<File> isJsonFile(Matcher<? super ReadContext> matcher) {
return new IsJson<File>(matcher); return new IsJson<File>(matcher);
} }
@ -51,7 +53,7 @@ public class JsonPathMatchers {
public static Matcher<? super ReadContext> withJsonPath(JsonPath jsonPath) { public static Matcher<? super ReadContext> withJsonPath(JsonPath jsonPath) {
return describedAs("with json path %0", return describedAs("with json path %0",
withJsonPath(jsonPath, not(anyOf(nullValue(), empty()))), withJsonPath(jsonPath, anything()),
jsonPath.getPath()); jsonPath.getPath());
} }
@ -67,7 +69,7 @@ public class JsonPathMatchers {
return withJsonPath(JsonPath.compile(jsonPath), resultMatcher); return withJsonPath(JsonPath.compile(jsonPath), resultMatcher);
} }
public static <T> Matcher<? super ReadContext> withJsonPath(final JsonPath jsonPath, final Matcher<T> resultMatcher) { public static <T> Matcher<? super ReadContext> withJsonPath(JsonPath jsonPath, Matcher<T> resultMatcher) {
return new WithJsonPath<T>(jsonPath, resultMatcher); return new WithJsonPath<T>(jsonPath, resultMatcher);
} }
} }

4
json-path-assert/src/main/java/com/jayway/jsonpath/matchers/WithoutJsonPath.java

@ -6,8 +6,6 @@ import com.jayway.jsonpath.ReadContext;
import org.hamcrest.Description; import org.hamcrest.Description;
import org.hamcrest.TypeSafeDiagnosingMatcher; import org.hamcrest.TypeSafeDiagnosingMatcher;
import static org.hamcrest.Matchers.empty;
public class WithoutJsonPath extends TypeSafeDiagnosingMatcher<ReadContext> { public class WithoutJsonPath extends TypeSafeDiagnosingMatcher<ReadContext> {
private final JsonPath jsonPath; private final JsonPath jsonPath;
@ -23,7 +21,7 @@ public class WithoutJsonPath extends TypeSafeDiagnosingMatcher<ReadContext> {
.appendText(jsonPath.getPath()) .appendText(jsonPath.getPath())
.appendText(" was evaluated to ") .appendText(" was evaluated to ")
.appendValue(value); .appendValue(value);
return value == null || empty().matches(value); return false;
} catch (JsonPathException e) { } catch (JsonPathException e) {
return true; return true;
} }

30
json-path-assert/src/test/java/com/jayway/jsonpath/matchers/HasNoJsonPathTest.java

@ -0,0 +1,30 @@
package com.jayway.jsonpath.matchers;
import org.junit.Test;
import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasNoJsonPath;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
public class HasNoJsonPathTest {
private static final String JSON_STRING = "{" +
"\"name\": \"Jessie\"" +
"}";
@Test
public void shouldMatchMissingJsonPath() {
assertThat(JSON_STRING, hasNoJsonPath("$.not_there"));
}
@Test
public void shouldNotMatchExistingJsonPath() {
assertThat(JSON_STRING, not(hasNoJsonPath("$.name")));
}
@Test
public void shouldBeDescriptive() {
assertThat(hasNoJsonPath("$.name"),
hasToString(equalTo("is json without json path \"$['name']\"")));
}
}

53
json-path-assert/src/test/java/com/jayway/jsonpath/matchers/IsJsonTest.java

@ -20,8 +20,11 @@ import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
public class IsJsonTest { public class IsJsonTest {
private static final String VALID_JSON = resource("example.json");
private static final String INVALID_JSON = "{ invalid-json }";
private static final String BOOKS_JSON_STRING = resource("books.json"); private static final String BOOKS_JSON_STRING = resource("books.json");
private static final File BOOKS_JSON_FILE = resourceAsFile("books.json"); private static final File BOOKS_JSON_FILE = resourceAsFile("books.json");
private static final Object BOOKS_JSON_PARSED = parseJson(BOOKS_JSON_STRING);
@BeforeClass @BeforeClass
public static void setupStrictJsonParsing() { public static void setupStrictJsonParsing() {
@ -33,16 +36,52 @@ public class IsJsonTest {
Configuration.setDefaults(null); Configuration.setDefaults(null);
} }
@Test
public void shouldMatchOnEmptyJsonObject() {
assertThat("{}", isJson());
}
@Test
public void shouldMatchOnJsonObject() {
assertThat("{ \"hi\" : \"there\" }", isJson());
}
@Test
public void shouldMatchOnEmptyJsonArray() {
assertThat("[]", isJson());
}
@Test
public void shouldMatchOnJsonArray() {
assertThat("[\"hi\", \"there\"]", isJson());
}
@Test
public void shouldMatchValidJson() {
assertThat(VALID_JSON, isJson());
assertThat(BOOKS_JSON_STRING, isJson());
}
@Test
public void shouldNotMatchInvalidJson() {
assertThat(INVALID_JSON, not(isJson()));
assertThat(new Object(), not(isJson()));
assertThat(new Object[]{}, not(isJson()));
assertThat("hi there", not(isJson()));
assertThat(new Integer(42), not(isJson()));
assertThat(Boolean.TRUE, not(isJson()));
assertThat(false, not(isJson()));
assertThat(null, not(isJson()));
}
@Test @Test
public void shouldMatchJsonObjectEvaluatedToTrue() { public void shouldMatchJsonObjectEvaluatedToTrue() {
Object parsedJson = parseJson(BOOKS_JSON_STRING); assertThat(BOOKS_JSON_PARSED, isJson(withPathEvaluatedTo(true)));
assertThat(parsedJson, isJson(withPathEvaluatedTo(true)));
} }
@Test @Test
public void shouldNotMatchJsonObjectEvaluatedToFalse() { public void shouldNotMatchJsonObjectEvaluatedToFalse() {
Object parsedJson = parseJson(BOOKS_JSON_STRING); assertThat(BOOKS_JSON_PARSED, not(isJson(withPathEvaluatedTo(false))));
assertThat(parsedJson, not(isJson(withPathEvaluatedTo(false))));
} }
@Test @Test
@ -65,6 +104,12 @@ public class IsJsonTest {
assertThat(BOOKS_JSON_FILE, not(isJson(withPathEvaluatedTo(false)))); assertThat(BOOKS_JSON_FILE, not(isJson(withPathEvaluatedTo(false))));
} }
@Test
public void shouldNotMatchNonExistingJsonFile() {
File nonExistingFile = new File("missing-file");
assertThat(nonExistingFile, not(isJson()));
}
@Test @Test
public void shouldBeDescriptive() { public void shouldBeDescriptive() {
Matcher<Object> matcher = isJson(withPathEvaluatedTo(true)); Matcher<Object> matcher = isJson(withPathEvaluatedTo(true));

188
json-path-assert/src/test/java/com/jayway/jsonpath/matchers/JsonPathMatchersTest.java

@ -7,8 +7,8 @@ import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import java.io.File; import java.io.File;
import java.nio.file.Paths; import java.util.List;
import java.util.Collection; import java.util.Map;
import static com.jayway.jsonpath.matchers.JsonPathMatchers.*; import static com.jayway.jsonpath.matchers.JsonPathMatchers.*;
import static com.jayway.jsonpath.matchers.helpers.ResourceHelpers.resource; import static com.jayway.jsonpath.matchers.helpers.ResourceHelpers.resource;
@ -17,8 +17,6 @@ import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
public class JsonPathMatchersTest { public class JsonPathMatchersTest {
private static final String VALID_JSON = resource("example.json");
private static final String BOOKS_JSON = resource("books.json"); private static final String BOOKS_JSON = resource("books.json");
private static final String INVALID_JSON = "{ invalid-json }"; private static final String INVALID_JSON = "{ invalid-json }";
private static final File BOOKS_JSON_FILE = resourceAsFile("books.json"); private static final File BOOKS_JSON_FILE = resourceAsFile("books.json");
@ -35,84 +33,164 @@ public class JsonPathMatchersTest {
} }
@Test @Test
public void shouldMatchValidJson() { public void shouldMatchJsonPathToStringValue() {
assertThat(VALID_JSON, isJson()); final String json = "{\"name\": \"Jessie\"}";
assertThat(BOOKS_JSON, isJson());
assertThat(json, hasJsonPath("$.name"));
assertThat(json, isJson(withJsonPath("$.name")));
assertThat(json, hasJsonPath("$.name", equalTo("Jessie")));
assertThat(json, isJson(withJsonPath("$.name", equalTo("Jessie"))));
assertThat(json, not(hasJsonPath("$.name", equalTo("John"))));
assertThat(json, not(isJson(withJsonPath("$.name", equalTo("John")))));
} }
@Test @Test
public void shouldNotMatchInvalidJson() { public void shouldMatchJsonPathToIntegerValue() {
assertThat(INVALID_JSON, not(isJson())); final String json = "{\"number\": 10}";
assertThat(new Object(), not(isJson()));
assertThat("{}", not(isJson())); assertThat(json, hasJsonPath("$.number"));
assertThat(null, not(isJson())); assertThat(json, isJson(withJsonPath("$.number")));
assertThat(json, hasJsonPath("$.number", equalTo(10)));
assertThat(json, isJson(withJsonPath("$.number", equalTo(10))));
assertThat(json, not(hasJsonPath("$.number", equalTo(3))));
assertThat(json, not(isJson(withJsonPath("$.number", equalTo(3)))));
} }
@Test @Test
public void shouldMatchExistingJsonPath() { public void shouldMatchJsonPathToDoubleValue() {
assertThat(BOOKS_JSON, hasJsonPath("$.store.name")); final String json = "{\"price\": 19.95}";
assertThat(BOOKS_JSON, hasJsonPath("$.store.book[2].title"));
assertThat(BOOKS_JSON, hasJsonPath("$.store.book[*].author")); assertThat(json, hasJsonPath("$.price"));
assertThat(json, isJson(withJsonPath("$.price")));
assertThat(json, hasJsonPath("$.price", equalTo(19.95)));
assertThat(json, isJson(withJsonPath("$.price", equalTo(19.95))));
assertThat(json, not(hasJsonPath("$.price", equalTo(3.3))));
assertThat(json, not(isJson(withJsonPath("$.price", equalTo(42)))));
} }
@Test @Test
public void shouldMatchExistingJsonPathAlternative() { public void shouldMatchJsonPathToBooleanValue() {
assertThat(BOOKS_JSON, isJson(withJsonPath("$.store.name"))); final String json = "{\"flag\": false}";
assertThat(BOOKS_JSON, isJson(withJsonPath("$.store.book[2].title")));
assertThat(BOOKS_JSON, isJson(withJsonPath("$.store.book[*].author"))); assertThat(json, hasJsonPath("$.flag"));
assertThat(json, isJson(withJsonPath("$.flag")));
assertThat(json, hasJsonPath("$.flag", equalTo(false)));
assertThat(json, isJson(withJsonPath("$.flag", equalTo(false))));
assertThat(json, not(hasJsonPath("$.flag", equalTo(true))));
assertThat(json, not(isJson(withJsonPath("$.flag", equalTo(true)))));
} }
@Test @Test
public void shouldNotMatchInvalidJsonWithPath() { public void shouldMatchJsonPathToJsonObject() {
assertThat(INVALID_JSON, not(hasJsonPath("$.path"))); final String json = "{\"object\": { \"name\":\"Oscar\"}}";
assertThat(new Object(), not(hasJsonPath("$.path")));
assertThat("{}", not(hasJsonPath("$.path"))); assertThat(json, hasJsonPath("$.object"));
assertThat(null, not(hasJsonPath("$.path"))); assertThat(json, isJson(withJsonPath("$.object")));
assertThat(json, hasJsonPath("$.object", instanceOf(Map.class)));
assertThat(json, isJson(withJsonPath("$.object", instanceOf(Map.class))));
assertThat(json, not(hasJsonPath("$.object", instanceOf(List.class))));
assertThat(json, not(isJson(withJsonPath("$.object", instanceOf(List.class)))));
} }
@Test @Test
public void shouldNotMatchInvalidJsonWithPathAndValue() { public void shouldMatchJsonPathToEmptyJsonObject() {
assertThat(INVALID_JSON, not(hasJsonPath("$.path", anything()))); final String json = "{\"empty_object\": {}}";
assertThat(new Object(), not(hasJsonPath("$.path", anything())));
assertThat(null, not(hasJsonPath("$.message", anything()))); assertThat(json, hasJsonPath("$.empty_object"));
assertThat(json, isJson(withJsonPath("$.empty_object")));
assertThat(json, hasJsonPath("$.empty_object", instanceOf(Map.class)));
assertThat(json, isJson(withJsonPath("$.empty_object", instanceOf(Map.class))));
assertThat(json, not(hasJsonPath("$.empty_object", instanceOf(List.class))));
assertThat(json, not(isJson(withJsonPath("$.empty_object", instanceOf(List.class)))));
} }
@Test @Test
public void shouldNotMatchNonExistingJsonPath() { public void shouldMatchJsonPathToJsonArray() {
assertThat(BOOKS_JSON, not(hasJsonPath("$.not_there"))); final String json = "{\"list\": [ \"one\",\"two\",\"three\"]}";
assertThat(BOOKS_JSON, not(hasJsonPath("$.store.book[5].title")));
assertThat(BOOKS_JSON, not(hasJsonPath("$.store.book[*].not_there"))); assertThat(json, hasJsonPath("$.list"));
assertThat(json, hasJsonPath("$.list[*]"));
assertThat(json, isJson(withJsonPath("$.list")));
assertThat(json, isJson(withJsonPath("$.list[*]")));
assertThat(json, hasJsonPath("$.list", contains("one", "two", "three")));
assertThat(json, isJson(withJsonPath("$.list", hasItem("two"))));
assertThat(json, not(hasJsonPath("$.list", hasSize(2))));
assertThat(json, not(isJson(withJsonPath("$.list", contains("four")))));
} }
@Test @Test
public void shouldNotMatchNonExistingJsonPathAlternative() { public void shouldMatchJsonPathToEmptyJsonArray() {
assertThat(BOOKS_JSON, not(isJson(withJsonPath("$.not_there")))); final String json = "{\"empty_list\": []}";
assertThat(BOOKS_JSON, not(isJson(withJsonPath("$.store.book[5].title"))));
assertThat(BOOKS_JSON, not(isJson(withJsonPath("$.store.book[*].not_there")))); assertThat(json, hasJsonPath("$.empty_list"));
assertThat(json, hasJsonPath("$.empty_list[*]"));
assertThat(json, isJson(withJsonPath("$.empty_list")));
assertThat(json, isJson(withJsonPath("$.empty_list[*]")));
assertThat(json, hasJsonPath("$.empty_list", empty()));
assertThat(json, isJson(withJsonPath("$.empty_list", hasSize(0))));
assertThat(json, not(hasJsonPath("$.empty_list", hasSize(2))));
assertThat(json, not(isJson(withJsonPath("$.empty_list", contains("four")))));
} }
@Test @Test
public void shouldMatchJsonPathWithStringValue() { public void willMatchIndefiniteJsonPathsEvaluatedToEmptyLists() {
assertThat(BOOKS_JSON, hasJsonPath("$.store.name", equalTo("Little Shop"))); // This is just a test to demonstrate that indefinite paths
assertThat(BOOKS_JSON, hasJsonPath("$.store.book[2].title", equalTo("Moby Dick"))); // will always match, regardless of result. This is because
// the evaluation of these expressions will return lists,
// even though they may be empty.
String json = "{\"items\": []}";
assertThat(json, hasJsonPath("$.items[*].name"));
assertThat(json, hasJsonPath("$.items[*]"));
assertThat(json, hasJsonPath("$.items[*]", hasSize(0)));
} }
@Test @Test
public void shouldMatchJsonPathWithIntegerValue() { public void shouldMatchJsonPathToNullValue() {
assertThat(BOOKS_JSON, hasJsonPath("$.expensive", equalTo(10))); final String json = "{\"none\": null}";
assertThat(json, hasJsonPath("$.none"));
assertThat(json, isJson(withJsonPath("$.none")));
assertThat(json, hasJsonPath("$.none", nullValue()));
assertThat(json, isJson(withJsonPath("$.none", nullValue())));
assertThat(json, not(hasJsonPath("$.none", equalTo("something"))));
assertThat(json, not(isJson(withJsonPath("$.none", empty()))));
} }
@Test @Test
public void shouldMatchJsonPathWithDoubleValue() { public void shouldNotMatchNonExistingJsonPath() {
assertThat(BOOKS_JSON, hasJsonPath("$.store.bicycle.price", equalTo(19.95))); final String json = "{}";
assertThat(json, not(hasJsonPath("$.not_there")));
assertThat(json, not(hasJsonPath("$.not_there", anything())));
assertThat(json, not(hasJsonPath("$.not_there[*]")));
assertThat(json, not(hasJsonPath("$.not_there[*]", anything())));
assertThat(json, not(isJson(withJsonPath("$.not_there"))));
assertThat(json, not(isJson(withJsonPath("$.not_there", anything()))));
assertThat(json, not(isJson(withJsonPath("$.not_there[*]"))));
assertThat(json, not(isJson(withJsonPath("$.not_there[*]", anything()))));
} }
@Test @Test
public void shouldMatchJsonPathWithCollectionValue() { public void shouldNotMatchInvalidJsonWithPath() {
assertThat(BOOKS_JSON, hasJsonPath("$.store.book[*].author", instanceOf(Collection.class))); assertThat(INVALID_JSON, not(hasJsonPath("$.path")));
assertThat(BOOKS_JSON, hasJsonPath("$.store.book[*].author", hasSize(4))); assertThat(new Object(), not(hasJsonPath("$.path")));
assertThat(BOOKS_JSON, hasJsonPath("$.store.book[*].author", hasItem("Evelyn Waugh"))); assertThat(null, not(hasJsonPath("$.path")));
assertThat(BOOKS_JSON, hasJsonPath("$..book[2].title", hasItem("Moby Dick"))); }
@Test
public void shouldNotMatchInvalidJsonWithPathAndValue() {
assertThat(INVALID_JSON, not(hasJsonPath("$.path", anything())));
assertThat(new Object(), not(hasJsonPath("$.path", anything())));
assertThat(null, not(hasJsonPath("$.message", anything())));
} }
@Test @Test
@ -122,7 +200,7 @@ public class JsonPathMatchersTest {
@Test @Test
public void shouldNotMatchJsonPathOnNonExistingFile() { public void shouldNotMatchJsonPathOnNonExistingFile() {
File nonExistingFile = Paths.get("missing-file").toFile(); File nonExistingFile = new File("missing-file");
assertThat(nonExistingFile, not(hasJsonPath("$..*", anything()))); assertThat(nonExistingFile, not(hasJsonPath("$..*", anything())));
} }
@ -131,14 +209,4 @@ public class JsonPathMatchersTest {
Object json = Configuration.defaultConfiguration().jsonProvider().parse(BOOKS_JSON); Object json = Configuration.defaultConfiguration().jsonProvider().parse(BOOKS_JSON);
assertThat(json, hasJsonPath("$.store.name", equalTo("Little Shop"))); assertThat(json, hasJsonPath("$.store.name", equalTo("Little Shop")));
} }
@Test
public void shouldMatchMissingJsonPath() {
assertThat(BOOKS_JSON, hasNoJsonPath("$.not_there"));
}
@Test
public void shouldNotMatchExistingJsonPath() {
assertThat(BOOKS_JSON, not(hasNoJsonPath("$.store.name")));
}
} }

28
json-path-assert/src/test/java/com/jayway/jsonpath/matchers/WithJsonPathTest.java

@ -9,10 +9,10 @@ import org.hamcrest.StringDescription;
import org.junit.Test; import org.junit.Test;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import static com.jayway.jsonpath.JsonPath.compile; import static com.jayway.jsonpath.JsonPath.compile;
import static com.jayway.jsonpath.matchers.JsonPathMatchers.withJsonPath; import static com.jayway.jsonpath.matchers.JsonPathMatchers.withJsonPath;
import static com.jayway.jsonpath.matchers.JsonPathMatchers.withoutJsonPath;
import static com.jayway.jsonpath.matchers.helpers.ResourceHelpers.resource; import static com.jayway.jsonpath.matchers.helpers.ResourceHelpers.resource;
import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
@ -40,34 +40,14 @@ public class WithJsonPathTest {
public void shouldNotMatchNonExistingJsonPath() { public void shouldNotMatchNonExistingJsonPath() {
assertThat(BOOKS_JSON, not(withJsonPath(compile("$.not_there")))); assertThat(BOOKS_JSON, not(withJsonPath(compile("$.not_there"))));
assertThat(BOOKS_JSON, not(withJsonPath(compile("$.store.book[5].title")))); assertThat(BOOKS_JSON, not(withJsonPath(compile("$.store.book[5].title"))));
assertThat(BOOKS_JSON, not(withJsonPath(compile("$.store.book[*].not_there")))); assertThat(BOOKS_JSON, not(withJsonPath(compile("$.store.book[1].not_there"))));
} }
@Test @Test
public void shouldNotMatchNonExistingStringJsonPath() { public void shouldNotMatchNonExistingStringJsonPath() {
assertThat(BOOKS_JSON, not(withJsonPath("$.not_there"))); assertThat(BOOKS_JSON, not(withJsonPath("$.not_there")));
assertThat(BOOKS_JSON, not(withJsonPath("$.store.book[5].title"))); assertThat(BOOKS_JSON, not(withJsonPath("$.store.book[5].title")));
assertThat(BOOKS_JSON, not(withJsonPath("$.store.book[*].not_there"))); assertThat(BOOKS_JSON, not(withJsonPath("$.store.book[1].not_there")));
}
@Test
public void shouldMatchNonExistingJsonPath() {
assertThat(BOOKS_JSON, withoutJsonPath(compile("$.not_there")));
}
@Test
public void shouldMatchNonExistingStringJsonPath() {
assertThat(BOOKS_JSON, withoutJsonPath("$.not_there"));
}
@Test
public void shouldNotMatchExistingCompiledJsonPath() {
assertThat(BOOKS_JSON, not(withoutJsonPath(compile("$.store.name"))));
}
@Test
public void shouldNotMatchExistingStringJsonPath() {
assertThat(BOOKS_JSON, not(withoutJsonPath("$.store.name")));
} }
@Test @Test
@ -92,7 +72,7 @@ public class WithJsonPathTest {
@Test @Test
public void shouldMatchJsonPathEvaluatedToCollectionValue() { public void shouldMatchJsonPathEvaluatedToCollectionValue() {
assertThat(BOOKS_JSON, withJsonPath(compile("$.store.book[*].author"), instanceOf(Collection.class))); assertThat(BOOKS_JSON, withJsonPath(compile("$.store.book[*].author"), instanceOf(List.class)));
assertThat(BOOKS_JSON, withJsonPath(compile("$.store.book[*].author"), hasSize(4))); assertThat(BOOKS_JSON, withJsonPath(compile("$.store.book[*].author"), hasSize(4)));
assertThat(BOOKS_JSON, withJsonPath(compile("$.store.book[*].author"), hasItem("Evelyn Waugh"))); assertThat(BOOKS_JSON, withJsonPath(compile("$.store.book[*].author"), hasItem("Evelyn Waugh")));
assertThat(BOOKS_JSON, withJsonPath(compile("$..book[2].title"), hasItem("Moby Dick"))); assertThat(BOOKS_JSON, withJsonPath(compile("$..book[2].title"), hasItem("Moby Dick")));

44
json-path-assert/src/test/java/com/jayway/jsonpath/matchers/WithoutJsonPathTest.java

@ -0,0 +1,44 @@
package com.jayway.jsonpath.matchers;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.ReadContext;
import org.junit.Test;
import static com.jayway.jsonpath.JsonPath.compile;
import static com.jayway.jsonpath.matchers.JsonPathMatchers.withoutJsonPath;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
public class WithoutJsonPathTest {
private static final String JSON_STRING = "{" +
"\"name\": \"Jessie\"," +
"\"flag\": false," +
"\"empty_array\": []," +
"\"empty_object\": {}," +
"\"none\": null" +
"}";
private static final ReadContext JSON = JsonPath.parse(JSON_STRING);
@Test
public void shouldMatchNonExistingJsonPath() {
assertThat(JSON, withoutJsonPath(compile("$.not_there")));
assertThat(JSON, withoutJsonPath("$.not_there"));
}
@Test
public void shouldNotMatchExistingJsonPath() {
assertThat(JSON, not(withoutJsonPath(compile("$.name"))));
assertThat(JSON, not(withoutJsonPath("$.name")));
assertThat(JSON, not(withoutJsonPath("$.flag")));
assertThat(JSON, not(withoutJsonPath("$.empty_array")));
assertThat(JSON, not(withoutJsonPath("$.empty_object")));
assertThat(JSON, not(withoutJsonPath("$.none")));
}
@Test
public void shouldBeDescriptive() {
assertThat(withoutJsonPath("$.name"),
hasToString(equalTo("without json path \"$['name']\"")));
}
}

11
json-path-assert/src/test/java/com/jayway/jsonpath/matchers/helpers/ResourceHelpers.java

@ -4,11 +4,8 @@ import org.apache.commons.io.IOUtils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import static java.lang.ClassLoader.getSystemResource; import static java.lang.ClassLoader.getSystemResource;
import static java.lang.ClassLoader.getSystemResourceAsStream; import static java.lang.ClassLoader.getSystemResourceAsStream;
@ -18,18 +15,16 @@ public class ResourceHelpers {
try { try {
return IOUtils.toString(getSystemResourceAsStream(resource)); return IOUtils.toString(getSystemResourceAsStream(resource));
} catch (IOException e) { } catch (IOException e) {
throw new AssertionError("Resource not found", e); throw new AssertionError("Resource not found: " + e.getMessage());
} }
} }
public static File resourceAsFile(String resource) { public static File resourceAsFile(String resource) {
try { try {
URL systemResource = getSystemResource(resource); URL systemResource = getSystemResource(resource);
URI uri = systemResource.toURI(); return new File(systemResource.toURI());
Path path = Paths.get(uri);
return path.toFile();
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
throw new AssertionError("URI syntax error", e); throw new AssertionError("URI syntax error:" + e.getMessage());
} }
} }
} }

4
json-path-assert/src/test/resources/books.json

@ -1,6 +1,10 @@
{ {
"store": { "store": {
"name": "Little Shop", "name": "Little Shop",
"none": null,
"switch": true,
"magazine": [],
"truck": {},
"book": [ "book": [
{ {
"category": "reference", "category": "reference",

Loading…
Cancel
Save