package unit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.apache.commons.lang.exception.ExceptionUtils; import org.junit.Test; import com.baasbox.service.query.JsonTree; import com.baasbox.service.query.PartsLexer; import com.baasbox.service.query.PartsParser; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; public class JsonQueryTest { @Test public void readValueFromArray() throws Exception { String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3]}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".coll[0]", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode root = JsonTree.read(json, pp); if(root.isMissingNode()){ fail(); }else{ assertEquals(1,root.asInt()); } } @Test public void readValueFromNonExistentSimpleField() throws Exception { String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3]}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".title2", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode root = JsonTree.read(json, pp); if(root.isMissingNode()){ assertEquals(1,1); }else{ fail(); } } @Test public void readValueFromSimpleField() throws Exception { String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3]}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".title", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode root = JsonTree.read(json, pp); if(root.isMissingNode()){ fail(); }else{ assertEquals("title", root.asText()); } } @Test public void readValueFromNonExistentArrayMember() throws Exception { String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3]}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".coll[3]", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode root = JsonTree.read(json, pp); if(root.isMissingNode()){ assertEquals(1,1); }else{ fail(); } } @Test public void setValueToSimpleField() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"]}"; String data = "{\"data\":\"title2\"}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".title", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); JsonTree.write(json, pp, jsonData.get("data")); assertEquals("title2",JsonTree.read(json, pp).asText()); } @Test public void setValueToUnexistingSimpleField() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"]}"; String data = "{\"data\":\"title2\"}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".title2", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); JsonTree.write(json, pp, jsonData.get("data")); assertEquals("title2",JsonTree.read(json, pp).asText()); } @Test public void setValueToNestedUnexistingSimpleField() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"]}"; String data = "{\"data\":\"t\"}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".title2", 1)); parts.add(pl.parse(".firstLetter", 2)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); try{ JsonTree.write(json, pp, jsonData.get("data")); fail(); }catch(Exception e){ assertEquals("title2.firstLetter is not a valid path",e.getMessage()); } } @Test public void setValueToArrayAdding() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"]}"; String data = "{\"data\":\"4\"}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".coll[3]", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); try{ JsonTree.write(json, pp, jsonData.get("data")); assertEquals(4,JsonTree.read(json, pp).asInt(0)); }catch(Exception e){ fail(ExceptionUtils.getMessage(e)); } } @Test public void setValueToArrayReplacing$Int() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"]}"; String data = "{\"data\":10}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".coll[0]", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); try{ JsonTree.write(json, pp, jsonData.get("data")); assertEquals(10,JsonTree.read(json, pp).asInt(0)); JsonNode jn = json.get("coll"); assertTrue(jn instanceof ArrayNode); ArrayNode an = JsonNodeFactory.instance.arrayNode(); an.add(10); an.add(2); an.add(3); ArrayNode result = (ArrayNode)jn; assertEquals(result,an); }catch(Exception e){ fail(ExceptionUtils.getMessage(e)); } } @Test public void setValueToArrayAdding$Int() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"]}"; String data = "{\"data\":4}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".coll[3]", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); try{ JsonTree.write(json, pp, jsonData.get("data")); assertEquals(4,JsonTree.read(json, pp).asInt(0)); JsonNode jn = json.get("coll"); assertTrue(jn instanceof ArrayNode); ArrayNode an = JsonNodeFactory.instance.arrayNode(); an.add(1); an.add(2); an.add(3); an.add(4); ArrayNode result = (ArrayNode)jn; assertEquals(result,an); }catch(Exception e){ fail(ExceptionUtils.getMessage(e)); } } @Test public void setValueToArrayReplacing$String() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"]}"; String data = "{\"data\":\"megatag\"}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".tags[0]", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); try{ JsonTree.write(json, pp, jsonData.get("data")); assertEquals("megatag",JsonTree.read(json, pp).asText()); JsonNode jn = json.get("tags"); assertTrue(jn instanceof ArrayNode); ArrayNode an = JsonNodeFactory.instance.arrayNode(); an.add("megatag"); an.add("two"); an.add("three"); ArrayNode result = (ArrayNode)jn; assertEquals(result,an); }catch(Exception e){ fail(ExceptionUtils.getMessage(e)); } } @Test public void setValueToArrayAdding$String() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"]}"; String data = "{\"data\":\"four\"}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".tags[3]", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); try{ JsonTree.write(json, pp, jsonData.get("data")); assertEquals("four",JsonTree.read(json, pp).asText()); JsonNode jn = json.get("tags"); assertTrue(jn instanceof ArrayNode); ArrayNode an = JsonNodeFactory.instance.arrayNode(); an.add("one"); an.add("two"); an.add("three"); an.add("four"); ArrayNode result = (ArrayNode)jn; assertEquals(result,an); }catch(Exception e){ fail(ExceptionUtils.getMessage(e)); } } @Test public void setValueToRootAddingObject() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"]}"; String data = "{\"data\":{\"name\":\"giastfader\"}}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".author", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); try{ JsonNode n = JsonTree.write(json, pp, jsonData.get("data")); assertEquals("giastfader",n.get("name").asText()); assertTrue(json.has("author")); }catch(Exception e){ e.printStackTrace(); fail(ExceptionUtils.getMessage(e)); } } @Test public void setValueToRootReplacingObject() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"],\"author\":{\"name\":\"swampie\"}}"; String data = "{\"data\":{\"name\":\"giastfader\"}}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".author", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); try{ assertTrue(json.has("author")); assertEquals("swampie",json.get("author").get("name").asText()); JsonNode n = JsonTree.write(json, pp, jsonData.get("data")); assertEquals("giastfader",n.get("name").asText()); assertTrue(json.has("author")); }catch(Exception e){ e.printStackTrace(); fail(ExceptionUtils.getMessage(e)); } } @Test public void setValueToNestedObject() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"],\"author\":{\"name\":\"swampie\"}}"; String data = "{\"data\":{\"role\":\"Consultant\"}}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".author", 1)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); try{ assertTrue(json.has("author")); assertFalse(json.get("author").has("role")); JsonNode n = JsonTree.write(json, pp, jsonData.get("data")); assertEquals("Consultant",n.get("role").asText()); assertTrue(json.get("author").has("role")); }catch(Exception e){ e.printStackTrace(); fail(ExceptionUtils.getMessage(e)); } } @Test public void setValueToArrayInNestedObject() throws Exception{ String content = "{\"@rid\":\"#20:0\",\"@version\":25,\"@class\":\"posts\",\"title\":\"title\",\"content\":\"content\",\"id\":\"a843d3f0-25fb-468c-8452-f14b1f0c6f42\",\"coll\":[1,2,3],\"tags\":[\"one\",\"two\",\"three\"],\"author\":{\"name\":\"swampie\",\"roles\":[\"Admin\",\"Consultant\"]}}"; String data = "{\"data\":\"Java Developer\"}"; List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".author", 1)); parts.add(pl.parse(".roles[2]", 2)); PartsParser pp = new PartsParser(parts); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(content); JsonNode jsonData = om.readTree(data); try{ assertTrue(json.has("author")); assertTrue(json.get("author").has("roles")); assertEquals(2,json.get("author").get("roles").size()); JsonTree.write(json, pp, jsonData.get("data")); assertEquals(3,json.get("author").get("roles").size()); }catch(Exception e){ e.printStackTrace(); fail(ExceptionUtils.getMessage(e)); } } @Test public void testComplexQuery() throws Exception{ Random r = new Random(); URL u = new URL("https://google-api-go-client.googlecode.com/hg-history/adc5d697472e6769364e3d60214e7251dcada595/drive/v2/drive-api.json?rand="+r.nextInt(50000)); BufferedReader reader = new BufferedReader(new InputStreamReader(u.openStream())); String line; StringBuffer content = new StringBuffer(); while ((line = reader.readLine()) != null) { content.append(line); } reader.close(); long start = System.nanoTime(); ObjectMapper om = new ObjectMapper(); JsonNode jn = om.readTree(content.toString()); List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".resources", 1)); parts.add(pl.parse(".about", 2)); parts.add(pl.parse(".methods", 3)); parts.add(pl.parse(".get", 4)); parts.add(pl.parse(".scopes", 5)); PartsParser pp = new PartsParser(parts); JsonNode res = JsonTree.read(jn, pp); long end = System.nanoTime(); double seconds = (double)(end-start) / 1000000000.0; assertTrue(seconds < 1.0); assertTrue(res instanceof ArrayNode); assertEquals("https://www.googleapis.com/auth/drive",res.get(0).asText()); } @Test public void testComplexWrite() throws Exception{ Random r = new Random(); URL u = new URL("https://google-api-go-client.googlecode.com/hg-history/adc5d697472e6769364e3d60214e7251dcada595/drive/v2/drive-api.json?rand="+r.nextInt(50000)); BufferedReader reader = new BufferedReader(new InputStreamReader(u.openStream())); String line; StringBuffer content = new StringBuffer(); while ((line = reader.readLine()) != null) { content.append(line); } reader.close(); String data = "{\"data\":\"http://baasbox.com\"}"; long start = System.nanoTime(); ObjectMapper om = new ObjectMapper(); JsonNode jn = om.readTree(content.toString()); JsonNode jsonData = om.readTree(data); List<PartsLexer.Part> parts = new ArrayList<PartsLexer.Part>(); PartsLexer pl = new PartsLexer(); parts.add(pl.parse(".resources", 1)); parts.add(pl.parse(".about", 2)); parts.add(pl.parse(".methods", 3)); parts.add(pl.parse(".get", 4)); parts.add(pl.parse(".scopes[4]", 5)); PartsParser pp = new PartsParser(parts); JsonNode res = JsonTree.write(jn, pp,jsonData.get("data")); long end = System.nanoTime(); double seconds = (double)(end-start) / 1000000000.0; assertTrue(seconds < 1.0); assertEquals("http://baasbox.com",res.get(4).asText()); JsonNode result = jn.path("resources").path("about").path("methods").path("get").path("scopes"); assertTrue(result instanceof ArrayNode); ArrayNode arrNode = (ArrayNode)result; assertEquals(5,arrNode.size()); assertEquals(arrNode.get(4).asText(),res.get(4).asText()); } }