package com.tinkerpop.rexster.gremlin.converter; import com.tinkerpop.blueprints.Graph; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.blueprints.impls.tg.TinkerGraph; import com.tinkerpop.blueprints.impls.tg.TinkerGraphFactory; import com.tinkerpop.blueprints.util.io.graphson.GraphSONMode; import com.tinkerpop.pipes.util.structures.Table; import com.tinkerpop.rexster.Tokens; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONObject; import org.junit.Assert; import org.junit.Test; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class JSONResultConverterTest { private JSONResultConverter converterNotPaged = new JSONResultConverter(GraphSONMode.NORMAL, 0, Long.MAX_VALUE, null); private JSONResultConverter converterPaged = new JSONResultConverter(GraphSONMode.NORMAL, 1, 3, null); @Test public void convertNullResultReturnsNull() throws Exception { JSONArray results = this.converterNotPaged.convert(null); Assert.assertNull(results); } @Test public void convertJSONObjectNullResultReturnsNull() throws Exception { JSONArray results = this.converterNotPaged.convert(JSONObject.NULL); Assert.assertNotNull(results); Assert.assertEquals(1, results.length()); } @Test public void convertTableNotPaged() throws Exception { Table table = new Table("col1", "col2"); table.addRow("x1", "x2"); table.addRow("y1", "y2"); JSONArray results = this.converterNotPaged.convert(table); Assert.assertNotNull(results); Assert.assertEquals(2, results.length()); boolean rowMatchX = false; boolean rowMatchY = false; for (int ix = 0; ix < results.length(); ix++) { JSONObject row = results.optJSONObject(ix); Assert.assertNotNull(row); Assert.assertTrue(row.has("col1")); Assert.assertTrue(row.has("col2")); if (row.optString("col1").equals("x1") && row.optString("col2").equals("x2")) { rowMatchX = true; } if (row.optString("col1").equals("y1") && row.optString("col2").equals("y2")) { rowMatchY = true; } } Assert.assertTrue(rowMatchX && rowMatchY); } @Test public void convertTablePaged() throws Exception { Table table = new Table("col1", "col2"); table.addRow("x1", "x2"); table.addRow("y1", "y2"); table.addRow("z1", "z2"); table.addRow("a1", "a2"); JSONArray results = this.converterPaged.convert(table); Assert.assertNotNull(results); Assert.assertEquals(2, results.length()); boolean rowMatchZ = false; boolean rowMatchY = false; for (int ix = 0; ix < results.length(); ix++) { JSONObject row = results.optJSONObject(ix); Assert.assertNotNull(row); Assert.assertTrue(row.has("col1")); Assert.assertTrue(row.has("col2")); if (row.optString("col1").equals("z1") && row.optString("col2").equals("z2")) { rowMatchZ = true; } if (row.optString("col1").equals("y1") && row.optString("col2").equals("y2")) { rowMatchY = true; } } Assert.assertTrue(rowMatchZ && rowMatchY); } @Test public void convertIterableNotPaged() throws Exception { ArrayList<FunObject> funList = new ArrayList<FunObject>(); funList.add(new FunObject("x")); funList.add(new FunObject("y")); Iterable<FunObject> iterable = funList; JSONArray converted = this.converterNotPaged.convert(iterable); Assert.assertNotNull(converted); Assert.assertEquals(2, converted.length()); Assert.assertEquals("x", converted.get(0)); Assert.assertEquals("y", converted.get(1)); } @Test public void convertIterablePaged() throws Exception { ArrayList<FunObject> funList = new ArrayList<FunObject>(); funList.add(new FunObject("x")); funList.add(new FunObject("y")); funList.add(new FunObject("z")); funList.add(new FunObject("a")); Iterable<FunObject> iterable = funList; JSONArray converted = this.converterPaged.convert(iterable); Assert.assertNotNull(converted); Assert.assertEquals(2, converted.length()); Assert.assertEquals("y", converted.get(0)); Assert.assertEquals("z", converted.get(1)); } @Test public void convertIteratorNotPaged() throws Exception { ArrayList<FunObject> funList = new ArrayList<FunObject>(); funList.add(new FunObject("x")); funList.add(new FunObject("y")); Iterator<FunObject> iterable = funList.iterator(); JSONArray converted = this.converterNotPaged.convert(iterable); Assert.assertNotNull(converted); Assert.assertEquals(2, converted.length()); Assert.assertEquals("x", converted.get(0)); Assert.assertEquals("y", converted.get(1)); } @Test public void convertIteratorNotPagedNullElement() throws Exception { ArrayList<FunObject> funList = new ArrayList<FunObject>(); funList.add(new FunObject("x")); funList.add(null); funList.add(new FunObject("y")); Iterator<FunObject> iterable = funList.iterator(); JSONArray converted = this.converterNotPaged.convert(iterable); Assert.assertNotNull(converted); Assert.assertEquals(3, converted.length()); Assert.assertEquals("x", converted.get(0)); Assert.assertNull(converted.opt(1)); Assert.assertEquals("y", converted.get(2)); } @Test public void convertIteratorPaged() throws Exception { ArrayList<FunObject> funList = new ArrayList<FunObject>(); funList.add(new FunObject("x")); funList.add(new FunObject("y")); funList.add(new FunObject("z")); funList.add(new FunObject("a")); Iterator<FunObject> iterable = funList.iterator(); JSONArray converted = this.converterPaged.convert(iterable); Assert.assertNotNull(converted); Assert.assertEquals(2, converted.length()); Assert.assertEquals("y", converted.getString(0)); Assert.assertEquals("z", converted.getString(1)); } @Test public void convertMap() throws Exception { Map<String, Object> map = new HashMap<String, Object>(); Map<String, String> innerMap = new HashMap<String, String>(); innerMap.put("a", "b"); map.put("x", new FunObject("x")); map.put("y", "some"); map.put("z", innerMap); JSONArray converted = this.converterNotPaged.convert(map); Assert.assertNotNull(converted); Assert.assertEquals(1, converted.length()); JSONObject jsonObject = converted.getJSONObject(0); Assert.assertNotNull(jsonObject); Assert.assertEquals("some", jsonObject.optString("y")); Assert.assertEquals("x", jsonObject.optString("x")); JSONObject innerJsonObject = jsonObject.optJSONObject("z"); Assert.assertNotNull(innerJsonObject); Assert.assertEquals("b", innerJsonObject.optString("a")); } @Test public void convertIteratorNotPagedWithEmbeddedMap() throws Exception { final JSONResultConverter converter = new JSONResultConverter(GraphSONMode.EXTENDED, 0, Long.MAX_VALUE, null); final Graph g = new TinkerGraph(); final Vertex v = g.addVertex(1); Map<String, Object> map = new HashMap<String, Object>(); map.put("x", 500); map.put("y", "some"); ArrayList friends = new ArrayList(); friends.add("x"); friends.add(5); friends.add(map); v.setProperty("friends", friends); Iterator iterable = g.getVertices().iterator(); JSONArray converted = converter.convert(iterable); Assert.assertNotNull(converted); Assert.assertEquals(1, converted.length()); JSONObject vertexAsJson = converted.optJSONObject(0); Assert.assertNotNull(vertexAsJson); JSONObject friendsProperty = vertexAsJson.optJSONObject("friends"); Assert.assertEquals("list", friendsProperty.getString("type")); JSONArray friendPropertyList = friendsProperty.getJSONArray("value"); JSONObject object1 = friendPropertyList.getJSONObject(0); Assert.assertEquals("string", object1.getString("type")); Assert.assertEquals("x", object1.getString("value")); JSONObject object2 = friendPropertyList.getJSONObject(1); Assert.assertEquals("integer", object2.getString("type")); Assert.assertEquals(5, object2.getInt("value")); JSONObject object3 = friendPropertyList.getJSONObject(2); Assert.assertEquals("map", object3.getString("type")); JSONObject object3Value = object3.getJSONObject("value"); JSONObject object3ValueY = object3Value.getJSONObject("y"); Assert.assertEquals("string", object3ValueY.getString("type")); Assert.assertEquals("some", object3ValueY.getString("value")); JSONObject object3ValueX = object3Value.getJSONObject("x"); Assert.assertEquals("integer", object3ValueX.getString("type")); Assert.assertEquals(500, object3ValueX.getInt("value")); } @Test public void convertMapWithElementForKey() throws Exception { TinkerGraph g = TinkerGraphFactory.createTinkerGraph(); Map<Vertex, Integer> map = new HashMap<Vertex, Integer>(); map.put(g.getVertex(1), 1000); JSONArray converted = this.converterNotPaged.convert(map); Assert.assertNotNull(converted); Assert.assertEquals(1, converted.length()); JSONObject jsonObject = converted.getJSONObject(0); Assert.assertNotNull(jsonObject); JSONObject mapValue = jsonObject.optJSONObject("1"); Assert.assertEquals(1000, mapValue.optInt(Tokens._VALUE)); JSONObject element = mapValue.optJSONObject(Tokens._KEY); Assert.assertNotNull(element); Assert.assertEquals("1", element.optString(Tokens._ID)); } private class FunObject { private String val; public FunObject(String val) { this.val = val; } public String toString() { return this.val; } } }