blob: 374d7438faefa0b93718471d35c47e0e6d87fe61 [file] [log] [blame]
package org.eclipse.sensinact.gateway.nthbnd.test.jsonpath.old;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.Filter;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Predicate;
import com.jayway.jsonpath.Predicate.PredicateContext;
import com.jayway.jsonpath.spi.json.JsonProvider;
import org.assertj.core.api.Assertions;
import org.eclipse.sensinact.gateway.nthbnd.test.jsonpath.BaseTestConfiguration;
import org.junit.Test;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import static com.jayway.jsonpath.Filter.filter;
import static java.util.Arrays.asList;
import static junit.framework.Assert.*;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class FilterTest extends BaseTestConfiguration {
public final static String DOCUMENT = "{ \"store\": {\n" + " \"book\": [ \n" + " { \"category\": \"reference\",\n" + " \"author\": \"Nigel Rees\",\n" + " \"title\": \"Sayings of the Century\",\n" + " \"price\": 8.95\n" + " },\n" + " { \"category\": \"fiction\",\n" + " \"author\": \"Evelyn Waugh\",\n" + " \"title\": \"Sword of Honour\",\n" + " \"price\": 12.99\n" + " },\n" + " { \"category\": \"fiction\",\n" + " \"author\": \"Herman Melville\",\n" + " \"title\": \"Moby Dick\",\n" + " \"isbn\": \"0-553-21311-3\",\n" + " \"price\": 8.99\n" + " },\n" + " { \"category\": \"fiction\",\n" + " \"author\": \"J. R. R. Tolkien\",\n" + " \"title\": \"The Lord of the Rings\",\n" + " \"isbn\": \"0-395-19395-8\",\n" + " \"price\": 22.99\n" + " }\n" + " ],\n" + " \"bicycle\": {\n" + " \"color\": \"red\",\n" + " \"price\": 19.95,\n" + " \"foo:bar\": \"fooBar\",\n" + " \"dot.notation\": \"new\"\n" + " }\n" + " }\n" + "}";
private static final Configuration conf = Configuration.defaultConfiguration();
private static final JsonProvider jp = conf.jsonProvider();
@SuppressWarnings("deprecation")
public void is_filters_evaluates() throws Exception {
final Map<String, Object> check = new HashMap<String, Object>();
check.put("foo", "foo");
check.put("bar", null);
assertTrue(filter(conf.nodeBuilder().where("bar").is(null)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("foo").is("foo")).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo").is("xxx")).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("bar").is("xxx")).apply(createPredicateContext(check)));
}
@SuppressWarnings("deprecation")
@Test
public void ne_filters_evaluates() throws Exception {
final Map<String, Object> check = new HashMap<String, Object>();
check.put("foo", "foo");
check.put("bar", null);
assertTrue(filter(conf.nodeBuilder().where("foo").ne(null)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("foo").ne("not foo")).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo").ne("foo")).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("bar").ne(null)).apply(createPredicateContext(check)));
}
@Test
@SuppressWarnings("deprecation")
public void gt_filters_evaluates() throws Exception {
final Map<String, Object> check = new HashMap<String, Object>();
check.put("foo", 12.5D);
check.put("foo_null", null);
assertTrue(filter(conf.nodeBuilder().where("foo").gt(12D)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo").gt(null)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo").gt(20D)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo_null").gt(20D)).apply(createPredicateContext(check)));
}
@Test
@SuppressWarnings("deprecation")
public void gte_filters_evaluates() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("foo", 12.5D);
check.put("foo_null", null);
assertTrue(filter(conf.nodeBuilder().where("foo").gte(12D)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("foo").gte(12.5D)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo").gte(null)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo").gte(20D)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo_null").gte(20D)).apply(createPredicateContext(check)));
}
@SuppressWarnings("deprecation")
@Test
public void lt_filters_evaluates() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("foo", 10.5D);
check.put("foo_null", null);
//assertTrue(filter(where("foo").lt(12D)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo").lt(null)).apply(createPredicateContext(check)));
//assertFalse(filter(where("foo").lt(5D)).apply(createPredicateContext(check)));
//assertFalse(filter(where("foo_null").lt(5D)).apply(createPredicateContext(check)));
}
@SuppressWarnings("deprecation")
@Test
public void lte_filters_evaluates() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("foo", 12.5D);
check.put("foo_null", null);
assertTrue(filter(conf.nodeBuilder().where("foo").lte(13D)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo").lte(null)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo").lte(5D)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo_null").lte(5D)).apply(createPredicateContext(check)));
}
@SuppressWarnings("deprecation")
@Test
public void in_filters_evaluates() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("item", 3);
check.put("null_item", null);
assertTrue(filter(conf.nodeBuilder().where("item").in(1, 2, 3)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("item").in(asList(1, 2, 3))).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("item").in(4, 5, 6)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("item").in(asList(4, 5, 6))).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("item").in(asList('A'))).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("item").in(asList((Object) null))).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("null_item").in(1, 2, 3)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("null_item").in((Object) null)).apply(createPredicateContext(check)));
}
@SuppressWarnings("deprecation")
@Test
public void nin_filters_evaluates() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("item", 3);
check.put("null_item", null);
assertTrue(filter(conf.nodeBuilder().where("item").nin(4, 5)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("item").nin(asList(4, 5))).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("item").nin(asList('A'))).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("null_item").nin(1, 2, 3)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("item").nin(asList((Object) null))).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("item").nin(3)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("item").nin(asList(3))).apply(createPredicateContext(check)));
}
@Test
@SuppressWarnings("deprecation")
public void all_filters_evaluates() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("items", asList(1, 2, 3));
assertTrue(filter(conf.nodeBuilder().where("items").all(1, 2, 3)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("items").all(1, 2, 3, 4)).apply(createPredicateContext(check)));
}
@Test
@SuppressWarnings("deprecation")
public void size_filters_evaluates() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("items", asList(1, 2, 3));
check.put("items_empty", Collections.emptyList());
assertTrue(filter(conf.nodeBuilder().where("items").size(3)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("items_empty").size(0)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("items").size(2)).apply(createPredicateContext(check)));
}
@Test
@SuppressWarnings("deprecation")
public void exists_filters_evaluates() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("foo", "foo");
check.put("foo_null", null);
assertTrue(filter(conf.nodeBuilder().where("foo").exists(true)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo").exists(false)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("foo_null").exists(true)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("foo_null").exists(false)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("bar").exists(false)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("bar").exists(true)).apply(createPredicateContext(check)));
}
@Test
@SuppressWarnings("deprecation")
public void type_filters_evaluates() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("string", "foo");
check.put("string_null", null);
check.put("int", 1);
check.put("long", 1L);
check.put("double", 1.12D);
check.put("boolean", true);
assertFalse(filter(conf.nodeBuilder().where("string_null").type(String.class)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("string").type(String.class)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("string").type(Number.class)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("int").type(Number.class)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("int").type(String.class)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("long").type(Number.class)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("long").type(String.class)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("double").type(Number.class)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("double").type(String.class)).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("boolean").type(Boolean.class)).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("boolean").type(String.class)).apply(createPredicateContext(check)));
}
@Test
public void pattern_filters_evaluates() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("name", "kalle");
check.put("name_null", null);
assertFalse(filter(conf.nodeBuilder().where("name_null").regex(Pattern.compile(".alle"))).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("name").regex(Pattern.compile(".alle"))).apply(createPredicateContext(check)));
assertFalse(filter(conf.nodeBuilder().where("name").regex(Pattern.compile("KALLE"))).apply(createPredicateContext(check)));
assertTrue(filter(conf.nodeBuilder().where("name").regex(Pattern.compile("KALLE", Pattern.CASE_INSENSITIVE))).apply(createPredicateContext(check)));
}
@Test
public void combine_filter_deep_criteria() {
String json = "[\n" + " {\n" + " \"first-name\" : \"John\",\n" + " \"last-name\" : \"Irving\",\n" + " \"address\" : {\"state\" : \"Texas\"}\n" + " },\n" + " {\n" + " \"first-name\" : \"Jock\",\n" + " \"last-name\" : \"Ewing\",\n" + " \"address\" : {\"state\" : \"Texas\"}\n" + " },\n" + " {\n" + " \"first-name\" : \"Jock\",\n" + " \"last-name\" : \"Barnes\",\n" + " \"address\" : {\"state\" : \"Nevada\"}\n" + " } \n" + "]";
Filter filter = filter(conf.nodeBuilder().where("first-name").is("Jock").and("address.state").is("Texas"));
List<Map<String, Object>> jocksInTexas1 = JsonPath.read(json, "$[?]", filter);
List<Map<String, Object>> jocksInTexas2 = JsonPath.read(json, "$[?(@.first-name == 'Jock' && @.address.state == 'Texas')]");
JsonPath.parse(json).json();
assertThat((String) JsonPath.read(jocksInTexas1, "$[0].address.state"), is("Texas"));
assertThat((String) JsonPath.read(jocksInTexas1, "$[0].first-name"), is("Jock"));
assertThat((String) JsonPath.read(jocksInTexas1, "$[0].last-name"), is("Ewing"));
}
//-------------------------------------------------
//
// Single filter tests
//
//-------------------------------------------------
@Test
public void filters_can_be_combined() throws Exception {
Map<String, Object> check = new HashMap<String, Object>();
check.put("string", "foo");
check.put("string_null", null);
check.put("int", 10);
check.put("long", 1L);
check.put("double", 1.12D);
Filter shouldMarch = filter(conf.nodeBuilder().where("string").is("foo").and("int").lt(11));
Filter shouldNotMarch = filter(conf.nodeBuilder().where("string").is("foo").and("int").gt(11));
assertTrue(shouldMarch.apply(createPredicateContext(check)));
assertFalse(shouldNotMarch.apply(createPredicateContext(check)));
}
@Test
public void arrays_of_maps_can_be_filtered() throws Exception {
Map<String, Object> rootGrandChild_A = new HashMap<String, Object>();
rootGrandChild_A.put("name", "rootGrandChild_A");
Map<String, Object> rootGrandChild_B = new HashMap<String, Object>();
rootGrandChild_B.put("name", "rootGrandChild_B");
Map<String, Object> rootGrandChild_C = new HashMap<String, Object>();
rootGrandChild_C.put("name", "rootGrandChild_C");
Map<String, Object> rootChild_A = new HashMap<String, Object>();
rootChild_A.put("name", "rootChild_A");
rootChild_A.put("children", asList(rootGrandChild_A, rootGrandChild_B, rootGrandChild_C));
Map<String, Object> rootChild_B = new HashMap<String, Object>();
rootChild_B.put("name", "rootChild_B");
rootChild_B.put("children", asList(rootGrandChild_A, rootGrandChild_B, rootGrandChild_C));
Map<String, Object> rootChild_C = new HashMap<String, Object>();
rootChild_C.put("name", "rootChild_C");
rootChild_C.put("children", asList(rootGrandChild_A, rootGrandChild_B, rootGrandChild_C));
Map<String, Object> root = new HashMap<String, Object>();
root.put("children", asList(rootChild_A, rootChild_B, rootChild_C));
Predicate customFilter = new Predicate() {
@Override
public boolean apply(PredicateContext ctx) {
if (ctx.configuration().jsonProvider().getMapValue(ctx.item(), "name").equals("rootGrandChild_A")) {
return true;
}
return false;
}
};
Filter rootChildFilter = filter(conf.nodeBuilder().where("name").regex(Pattern.compile("rootChild_[A|B]")));
Filter rootGrandChildFilter = filter(conf.nodeBuilder().where("name").regex(Pattern.compile("rootGrandChild_[A|B]")));
List read = JsonPath.read(root, "children[?].children[?, ?]", rootChildFilter, rootGrandChildFilter, customFilter);
}
@Test
public void arrays_of_objects_can_be_filtered() throws Exception {
Map<String, Object> doc = new HashMap<String, Object>();
doc.put("items", asList(1, 2, 3));
Predicate customFilter = new Predicate() {
@Override
public boolean apply(PredicateContext ctx) {
return 1 == (Integer) ctx.item();
}
};
List<Integer> res = JsonPath.read(doc, "$.items[?]", customFilter);
assertEquals(1, res.get(0).intValue());
}
@Test
public void filters_can_contain_json_path_expressions() throws Exception {
Object doc = Configuration.defaultConfiguration().jsonProvider().parse(DOCUMENT);
assertFalse(filter(conf.nodeBuilder().where("$.store.bicycle.color").ne("red")).apply(createPredicateContext(doc)));
}
@Test
public void not_empty_filter_evaluates() {
String json = "{\n" + " \"fields\": [\n" + " {\n" + " \"errors\": [], \n" + " \"name\": \"\", \n" + " \"empty\": true \n" + " }, \n" + " {\n" + " \"errors\": [], \n" + " \"name\": \"foo\"\n" + " }, \n" + " {\n" + " \"errors\": [\n" + " \"first\", \n" + " \"second\"\n" + " ], \n" + " \"name\": \"invalid\"\n" + " }\n" + " ]\n" + "}\n";
Object doc = Configuration.defaultConfiguration().jsonProvider().parse(json);
List<Map<String, Object>> result = JsonPath.read(doc, "$.fields[?]", filter(conf.nodeBuilder().where("errors").notEmpty()));
assertEquals(1, result.size());
List<Map<String, Object>> result2 = JsonPath.read(doc, "$.fields[?]", filter(conf.nodeBuilder().where("name").notEmpty()));
assertEquals(2, result2.size());
}
@Test
public void contains_filter_evaluates_on_array() {
String json = "{\n" + "\"store\": {\n" + " \"book\": [\n" + " {\n" + " \"category\": \"reference\",\n" + " \"authors\" : [\n" + " {\n" + " \"firstName\" : \"Nigel\",\n" + " \"lastName\" : \"Rees\"\n" + " }\n" + " ],\n" + " \"title\": \"Sayings of the Century\",\n" + " \"price\": 8.95\n" + " },\n" + " {\n" + " \"category\": \"fiction\",\n" + " \"authors\": [\n" + " {\n" + " \"firstName\" : \"Evelyn\",\n" + " \"lastName\" : \"Waugh\"\n" + " },\n" + " {\n" + " \"firstName\" : \"Another\",\n" + " \"lastName\" : \"Author\"\n" + " }\n" + " ],\n" + " \"title\": \"Sword of Honour\",\n" + " \"price\": 12.99\n" + " }\n" + " ]\n" + " }\n" + "}";
Filter filter = filter(conf.nodeBuilder().where("authors[*].lastName").contains("Waugh"));
List<String> result = JsonPath.parse(json).read("$.store.book[?].title", filter);
Assertions.assertThat(result).containsExactly("Sword of Honour");
}
@Test
public void contains_filter_evaluates_on_string() {
String json = "{\n" + "\"store\": {\n" + " \"book\": [\n" + " {\n" + " \"category\": \"reference\",\n" + " \"title\": \"Sayings of the Century\",\n" + " \"price\": 8.95\n" + " },\n" + " {\n" + " \"category\": \"fiction\",\n" + " \"title\": \"Sword of Honour\",\n" + " \"price\": 12.99\n" + " }\n" + " ]\n" + " }\n" + "}";
Filter filter = filter(conf.nodeBuilder().where("category").contains("fic"));
List<String> result = JsonPath.parse(json).read("$.store.book[?].title", filter);
Assertions.assertThat(result).containsExactly("Sword of Honour");
}
}