@Test public void definite_upstream_illegal_array_access_throws() { assertEvaluationThrows("{\"foo\": {\"bar\": null}}", "$.foo.bar.[5]", PathNotFoundException.class); assertEvaluationThrows("{\"foo\": {\"bar\": null}}", "$.foo.bar.[5, 10]", PathNotFoundException.class); assertEvaluationThrows("{\"foo\": {\"bar\": 4}}", "$.foo.bar.[5]", PathNotFoundException.class); assertEvaluationThrows("{\"foo\": {\"bar\": 4}}", "$.foo.bar.[5, 10]", PathNotFoundException.class); assertEvaluationThrows("{\"foo\": {\"bar\": []}}", "$.foo.bar.[5]", PathNotFoundException.class); }
@Test public void lt_check_does_not_break_evaluation() { assertHasOneResult("[{\"value\":\"5\"}]", "$[?(@.value<'7')]", conf); assertHasNoResults("[{\"value\":\"7\"}]", "$[?(@.value<'5')]", conf); assertHasOneResult("[{\"value\":5}]", "$[?(@.value<7)]", conf); assertHasNoResults("[{\"value\":7}]", "$[?(@.value<5)]", conf); assertHasOneResult("[{\"value\":5}]", "$[?(@.value<7.1)]", conf); assertHasNoResults("[{\"value\":7}]", "$[?(@.value<5.1)]", conf); assertHasOneResult("[{\"value\":5.1}]", "$[?(@.value<7)]", conf); assertHasNoResults("[{\"value\":7.1}]", "$[?(@.value<5)]", conf); }
/** * Assertion which requires empty list as a result of indefinite path search. * @param json json to be parsed * @param path path to be evaluated * @param conf conf to use during evaluation */ public static void assertHasNoResults(final String json, final String path, Configuration conf) { assertHasResults(json, path, 0, conf); }
@Test public void filter_evaluation_does_not_break_path_evaluation() { assertHasOneResult("[{\"s\": \"fo\", \"expected_size\": \"m\"}, {\"s\": \"lo\", \"expected_size\": 2}]", "$[?(@.s size @.expected_size)]", conf); } }
@Test public void escape_pattern() { assertHasOneResult("[\"x\"]", "$[?(@ =~ /\\/|x/)]", conf); }
@Test public void equality_check_does_not_break_evaluation() { assertHasOneResult("[{\"value\":\"5\"}]", "$[?(@.value=='5')]", conf); assertHasOneResult("[{\"value\":5}]", "$[?(@.value==5)]", conf); assertHasOneResult("[{\"value\":\"5.1.26\"}]", "$[?(@.value=='5.1.26')]", conf); assertHasNoResults("[{\"value\":\"5\"}]", "$[?(@.value=='5.1.26')]", conf); assertHasNoResults("[{\"value\":5}]", "$[?(@.value=='5.1.26')]", conf); assertHasNoResults("[{\"value\":5.1}]", "$[?(@.value=='5.1.26')]", conf); assertHasNoResults("[{\"value\":\"5.1.26\"}]", "$[?(@.value=='5')]", conf); assertHasNoResults("[{\"value\":\"5.1.26\"}]", "$[?(@.value==5)]", conf); assertHasNoResults("[{\"value\":\"5.1.26\"}]", "$[?(@.value==5.1)]", conf); }
public static void assertEvaluationThrows(final String json, final String path, Class<? extends JsonPathException> expected) { assertEvaluationThrows(json, path, expected, Configuration.defaultConfiguration()); }
@Test public void escaped_literals() { if(conf.jsonProvider().getClass().getSimpleName().startsWith("Jackson")){ return; } assertHasOneResult("[\"\\'foo\"]", "$[?(@ == '\\'foo')]", conf); }
/** * Assertion which requires list of one element as a result of indefinite path search. * @param json json to be parsed * @param path path to be evaluated */ public static void assertHasOneResult(final String json, final String path, Configuration conf) { assertHasResults(json, path, 1, conf); }
@Test public void when_deep_scanning_require_properties_is_ignored_on_scan_target_but_not_on_children() { final Configuration conf = Configuration.defaultConfiguration().addOptions(Option.REQUIRE_PROPERTIES); assertEvaluationThrows("{\"foo\": {\"baz\": 4}}", "$..foo.bar", PathNotFoundException.class, conf); }
@Test public void escaped_literals2() { if(conf.jsonProvider().getClass().getSimpleName().startsWith("Jackson")){ return; } assertHasOneResult("[\"\\\\'foo\"]", "$[?(@ == \"\\\\'foo\")]", conf); }
@Test public void non_leaf_multi_props_can_be_required() { final Configuration conf = Configuration.defaultConfiguration().addOptions(Option.REQUIRE_PROPERTIES); final String json = "{\"a\": {\"v\": 5}, \"b\": {\"v\": 4}, \"c\": {\"v\": 1}}"; assertThat((List)using(conf).parse(json).read("$['a', 'c'].v")).asList().containsOnly(5, 1); assertEvaluationThrows(json, "$['d', 'a', 'c', 'm'].v", PathNotFoundException.class, conf); } }
@Test public void when_deep_scanning_require_properties_is_ignored_on_scan_target() { final Configuration conf = Configuration.defaultConfiguration().addOptions(Option.REQUIRE_PROPERTIES); Object result = JsonPath.parse("[{\"x\": {\"foo\": {\"x\": 4}, \"x\": null}, \"y\": {\"x\": 1}}, {\"x\": []}]").read( "$..x"); assertThat(result).asList().hasSize(5); List<Integer> result1 = JsonPath.using(conf).parse("{\"foo\": {\"bar\": 4}}").read("$..foo.bar"); assertThat(result1).containsExactly(4); assertEvaluationThrows("{\"foo\": {\"baz\": 4}}", "$..foo.bar", PathNotFoundException.class, conf); }