package com.tinkerpop.rexster.gremlin;
import com.codahale.metrics.MetricRegistry;
import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.impls.tg.TinkerGraphFactory;
import com.tinkerpop.rexster.RexsterResourceContext;
import com.tinkerpop.rexster.Tokens;
import com.tinkerpop.rexster.extension.ExtensionMethod;
import com.tinkerpop.rexster.extension.ExtensionResponse;
import com.tinkerpop.rexster.protocol.EngineController;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import org.codehaus.jettison.json.JSONTokener;
import org.jmock.Mockery;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.net.URI;
public class GremlinExtensionTest {
private Mockery mockery = new JUnit4Mockery();
private GremlinExtension gremlinExtension;
private static Graph graph;
private HttpServletRequest httpServletRequest = this.mockery.mock(HttpServletRequest.class);
private UriInfo uriInfo = this.mockery.mock(UriInfo.class);
private URI uri = URI.create("http://localhost:8182");
/**
* a null constructed extension method creates no API documentation on error
*/
private ExtensionMethod extensionMethodNoApi = new ExtensionMethod(null, null, null, null);
private RexsterResourceContext rexsterResourceContext = new RexsterResourceContext(null, uriInfo,
httpServletRequest, null, null, extensionMethodNoApi, null, new MetricRegistry());
/**
* Choosing not to mock Graph instance for these tests as GremlinGroovyScriptEngine is
* embedded into the GremlinExtension.
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
EngineController.configure(-1, null);
graph = TinkerGraphFactory.createTinkerGraph();
}
@Before
public void beforeEachTest() {
this.gremlinExtension = new GremlinExtension();
}
@Test
public void evaluateGetOnGraphNoScript() {
ExtensionResponse extensionResponse = this.gremlinExtension.evaluateGetOnGraph(
rexsterResourceContext, graph, "");
JSONObject jsonResponse = assertResponseAndGetEntity(extensionResponse,
true,
Response.Status.BAD_REQUEST.getStatusCode());
Assert.assertNotNull(jsonResponse);
Assert.assertTrue(jsonResponse.has(Tokens.MESSAGE));
Assert.assertEquals("no scripts provided", jsonResponse.optString(Tokens.MESSAGE));
}
@Test
public void evaluateGetOnGraphNoKeysNoTypesReturnVertex() {
ExtensionResponse extensionResponse = this.gremlinExtension.evaluateGetOnGraph(
rexsterResourceContext, graph, "g.v(1)");
JSONObject jsonResponse = assertResponseAndGetEntity(extensionResponse,
Response.Status.OK.getStatusCode());
Assert.assertNotNull(jsonResponse);
Assert.assertTrue(jsonResponse.has("results"));
JSONArray jsonResults = jsonResponse.optJSONArray("results");
Assert.assertNotNull(jsonResults);
Assert.assertEquals(1, jsonResults.length());
JSONObject firstResult = jsonResults.optJSONObject(0);
Assert.assertNotNull(firstResult);
Assert.assertTrue(firstResult.has("name"));
Assert.assertEquals("marko", firstResult.optString("name"));
}
@Test
public void evaluateGetOnGraphWithBindings() throws Exception {
String json = "{\"params\":{\"x\":1, \"y\":2, \"z\":\"test\", \"list\":[3,2,1,0], \"map\":{\"mapx\":[300,200,100]}}}";
RexsterResourceContext rexsterResourceContext = new RexsterResourceContext(null, uriInfo,
httpServletRequest, new JSONObject(new JSONTokener(json)), null, extensionMethodNoApi, null, new MetricRegistry());
ExtensionResponse extensionResponse = this.gremlinExtension.evaluateGetOnGraph(
rexsterResourceContext, graph, "[x+y, z, list.size, map.mapx.size]");
JSONObject jsonResponse = assertResponseAndGetEntity(extensionResponse,
Response.Status.OK.getStatusCode());
Assert.assertNotNull(jsonResponse);
Assert.assertTrue(jsonResponse.has("results"));
JSONArray jsonResults = jsonResponse.optJSONArray("results");
Assert.assertNotNull(jsonResults);
Assert.assertEquals(4, jsonResults.length());
Assert.assertEquals(3, jsonResults.optInt(0));
Assert.assertEquals("test", jsonResults.optString(1));
Assert.assertEquals(4, jsonResults.optInt(2));
Assert.assertEquals(3, jsonResults.optInt(3));
}
@Test
public void evaluateGetOnVertexNoKeysNoTypesReturnOutEdges() {
ExtensionResponse extensionResponse = this.gremlinExtension.evaluateGetOnVertex(
rexsterResourceContext, graph, graph.getVertex(6), "v.outEdges");
JSONObject jsonResponse = assertResponseAndGetEntity(extensionResponse,
Response.Status.OK.getStatusCode());
Assert.assertNotNull(jsonResponse);
Assert.assertTrue(jsonResponse.has("results"));
JSONArray jsonResults = jsonResponse.optJSONArray("results");
Assert.assertNotNull(jsonResults);
Assert.assertEquals(1, jsonResults.length());
}
@Test
public void evaluateGetOnEdgeNoKeysNoTypesReturnOutVertex() {
ExtensionResponse extensionResponse = this.gremlinExtension.evaluateGetOnEdge(
rexsterResourceContext, graph, graph.getEdge(7), "e.outVertex");
JSONObject jsonResponse = assertResponseAndGetEntity(extensionResponse,
Response.Status.OK.getStatusCode());
Assert.assertNotNull(jsonResponse);
Assert.assertTrue(jsonResponse.has("results"));
JSONArray jsonResults = jsonResponse.optJSONArray("results");
Assert.assertNotNull(jsonResults);
Assert.assertEquals(1, jsonResults.length());
}
private JSONObject assertResponseAndGetEntity(ExtensionResponse extensionResponse, int expectedStatusCode) {
return assertResponseAndGetEntity(extensionResponse, false, expectedStatusCode);
}
private JSONObject assertResponseAndGetEntity(ExtensionResponse extensionResponse, boolean isError, int expectedStatusCode) {
Assert.assertNotNull(extensionResponse);
Assert.assertEquals(isError, extensionResponse.isErrorResponse());
Response response = extensionResponse.getJerseyResponse();
Assert.assertEquals(expectedStatusCode, response.getStatus());
return (JSONObject) response.getEntity();
}
}