This is an automated email from the ASF dual-hosted git repository.
jin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph.git
The following commit(s) were added to refs/heads/master by this push:
new ca5fc0cb2 fix(server): support GraphAPI for rocksdb & add tests (#2900)
ca5fc0cb2 is described below
commit ca5fc0cb29281f5b0c1002261736acfd6e1b3f9f
Author: Tsukilc <[email protected]>
AuthorDate: Tue Nov 4 19:33:25 2025 +0800
fix(server): support GraphAPI for rocksdb & add tests (#2900)
---
.../apache/hugegraph/api/profile/GraphsAPI.java | 8 +-
.../apache/hugegraph/api/space/GraphSpaceAPI.java | 3 +-
.../org/apache/hugegraph/core/GraphManager.java | 61 +++-
.../org/apache/hugegraph/StandardHugeGraph.java | 2 +-
.../java/org/apache/hugegraph/api/BaseApiTest.java | 20 ++
.../org/apache/hugegraph/api/GraphsApiTest.java | 325 ++++++++++++++++++++-
6 files changed, 392 insertions(+), 27 deletions(-)
diff --git
a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/GraphsAPI.java
b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/GraphsAPI.java
index aef06dca9..5f10da09e 100644
---
a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/GraphsAPI.java
+++
b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/GraphsAPI.java
@@ -29,6 +29,7 @@ import org.apache.hugegraph.HugeGraph;
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.StatusFilter;
import org.apache.hugegraph.auth.HugeAuthenticator.RequiredPerm;
+import org.apache.hugegraph.auth.HugeGraphAuthProxy;
import org.apache.hugegraph.auth.HugePermission;
import org.apache.hugegraph.config.HugeConfig;
import org.apache.hugegraph.core.GraphManager;
@@ -128,7 +129,7 @@ public class GraphsAPI extends API {
LOG.debug("Get graph by name '{}'", name);
HugeGraph g = graph(manager, graphSpace, name);
- return ImmutableMap.of("name", g.spaceGraphName(), "backend",
g.backend());
+ return ImmutableMap.of("name", g.name(), "backend", g.backend());
}
@DELETE
@@ -198,8 +199,7 @@ public class GraphsAPI extends API {
}
}
- // todo: auth get actual user info
- String creator = "admin";
+ String creator = HugeGraphAuthProxy.getContext().user().username();
if (StringUtils.isNotEmpty(clone)) {
// Clone from existing graph
@@ -214,7 +214,7 @@ public class GraphsAPI extends API {
if (description == null) {
description = Strings.EMPTY;
}
- Object result = ImmutableMap.of("name", graph.spaceGraphName(),
+ Object result = ImmutableMap.of("name", graph.name(),
"nickname", graph.nickname(),
"backend", graph.backend(),
"description", description);
diff --git
a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/space/GraphSpaceAPI.java
b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/space/GraphSpaceAPI.java
index c4f604aac..4f12a59cf 100644
---
a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/space/GraphSpaceAPI.java
+++
b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/space/GraphSpaceAPI.java
@@ -26,6 +26,7 @@ import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.StatusFilter.Status;
+import org.apache.hugegraph.auth.HugeGraphAuthProxy;
import org.apache.hugegraph.core.GraphManager;
import org.apache.hugegraph.define.Checkable;
import org.apache.hugegraph.exception.NotFoundException;
@@ -103,7 +104,7 @@ public class GraphSpaceAPI extends API {
jsonGraphSpace.checkCreate(false);
- String creator = "admin";
+ String creator = HugeGraphAuthProxy.getContext().user().username();
GraphSpace exist = manager.graphSpace(jsonGraphSpace.name);
E.checkArgument(exist == null, "The graph space '%s' has existed",
jsonGraphSpace.name);
diff --git
a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
index 24949314a..a2659641b 100644
---
a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
+++
b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
@@ -22,6 +22,7 @@ import static
org.apache.hugegraph.space.GraphSpace.DEFAULT_GRAPH_SPACE_DESCRIPT
import static
org.apache.hugegraph.space.GraphSpace.DEFAULT_GRAPH_SPACE_SERVICE_NAME;
import java.io.IOException;
+import java.io.StringWriter;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Collections;
@@ -1227,10 +1228,42 @@ public final class GraphManager {
public HugeGraph createGraph(String graphSpace, String name, String
creator,
Map<String, Object> configs, boolean init) {
if (!usePD()) {
- return createGraphLocal(configs.toString(), name);
+ // Extract nickname from configs
+ String nickname;
+ if (configs.get("nickname") != null) {
+ nickname = configs.get("nickname").toString();
+ checkNickname(nickname);
+ } else {
+ nickname = name;
+ }
+
+ Date timeStamp = new Date();
+
+ // Convert Map to Properties format string
+ PropertiesConfiguration propConfig = new PropertiesConfiguration();
+ for (Map.Entry<String, Object> entry : configs.entrySet()) {
+ propConfig.setProperty(entry.getKey(), entry.getValue());
+ }
+ StringWriter writer = new StringWriter();
+ try {
+ propConfig.write(writer);
+ } catch (Exception e) {
+ throw new HugeException("Failed to convert config map to
properties", e);
+ }
+
+ HugeGraph graph = createGraphLocal(name, writer.toString());
+
+ // Set metadata fields for non-PD mode
+ graph.nickname(nickname);
+ graph.creator(creator);
+ graph.createTime(timeStamp);
+ graph.updateTime(timeStamp);
+
+ return graph;
}
- // When the registered graph space is not DEFAULT, only the graphs
within that registered graph space are loaded.
+ // When the registered graph space is not DEFAULT, only the graphs
within that registered
+ // graph space are loaded.
if (!"DEFAULT".equals(this.serviceGraphSpace) &&
!this.serviceGraphSpace.equals(graphSpace)) {
throw new HugeException(String.format(
@@ -1291,7 +1324,7 @@ public final class GraphManager {
Date timeStamp = new Date();
- configs.putIfAbsent("nickname", nickname);
+ // Note: nickname was already extracted and removed from configs
earlier
configs.putIfAbsent("creator", creator);
configs.putIfAbsent("create_time", timeStamp);
configs.putIfAbsent("update_time", timeStamp);
@@ -1514,7 +1547,7 @@ public final class GraphManager {
}
private String defaultSpaceGraphName(String graphName) {
- return "DEFAULT-" + graphName;
+ return spaceGraphName("DEFAULT", graphName);
}
private void loadGraph(String name, String graphConfPath) {
@@ -1931,7 +1964,7 @@ public final class GraphManager {
}
public void dropGraphLocal(String name) {
- HugeGraph graph = this.graph(name);
+ HugeGraph graph = this.graph(DEFAULT_GRAPH_SPACE_SERVICE_NAME + "-" +
name);
E.checkArgument(this.conf.get(ServerOptions.ENABLE_DYNAMIC_CREATE_DROP),
"Not allowed to drop graph '%s' dynamically, " +
"please set `enable_dynamic_create_drop` to true.",
@@ -2052,6 +2085,17 @@ public final class GraphManager {
public Set<String> graphs(String graphSpace) {
Set<String> graphs = new HashSet<>();
+
+ if (!usePD()) {
+ for (String key : this.graphs.keySet()) {
+ String[] parts = key.split(DELIMITER);
+ if (parts[0].equals(graphSpace)) {
+ graphs.add(parts[1]);
+ }
+ }
+ return graphs;
+ }
+
for (String key : this.metaManager.graphConfigs(graphSpace).keySet()) {
graphs.add(key.split(DELIMITER)[1]);
}
@@ -2107,6 +2151,13 @@ public final class GraphManager {
public void graphReadMode(String graphSpace, String graphName,
GraphReadMode readMode) {
+
+ if (!usePD()) {
+ HugeGraph g = this.graph(spaceGraphName(graphSpace, graphName));
+ g.readMode(readMode);
+ return;
+ }
+
try {
Map<String, Object> configs =
this.metaManager.getGraphConfig(graphSpace, graphName);
diff --git
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java
index 9d5f5b720..faf97aa8d 100644
---
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java
+++
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java
@@ -1120,7 +1120,7 @@ public class StandardHugeGraph implements HugeGraph {
this.serverStarted(nodeInfo);
// Write config to the disk file
- String confPath = ConfigUtil.writeToFile(configPath,
this.spaceGraphName(),
+ String confPath = ConfigUtil.writeToFile(configPath, this.name,
this.configuration());
this.configuration.file(confPath);
}
diff --git
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/api/BaseApiTest.java
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/api/BaseApiTest.java
index 45fceafc7..f88c134ab 100644
---
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/api/BaseApiTest.java
+++
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/api/BaseApiTest.java
@@ -74,6 +74,15 @@ public class BaseApiTest {
private static final String GRAPH_EDGE = "/graph/edges";
private static final String BATCH = "/batch";
+ private static final String ROCKSDB_CONFIG_TEMPLATE =
+ "{ \"gremlin.graph\": \"org.apache.hugegraph.HugeFactory\"," +
+ "\"backend\": \"rocksdb\", \"serializer\": \"binary\"," +
+ "\"store\": \"%s\", \"nickname\": \"%s\"," +
+ "\"rocksdb.data_path\": \"rocksdbtest-data-%s\"," +
+ "\"rocksdb.wal_path\": \"rocksdbtest-data-%s\"," +
+ "\"search.text_analyzer\": \"jieba\"," +
+ "\"search.text_analyzer_mode\": \"INDEX\" }";
+
protected static RestClient client;
private static final ObjectMapper MAPPER = new ObjectMapper();
@@ -661,6 +670,17 @@ public class BaseApiTest {
return createGraph(graphSpace, name, name);
}
+ public static Response createGraphInRocksDB(String graphSpace, String
name) {
+ return createGraphInRocksDB(graphSpace, name, name);
+ }
+
+ public static Response createGraphInRocksDB(String graphSpace, String name,
+ String nickname) {
+ String path = String.format("graphspaces/%s/graphs/%s", graphSpace,
name);
+ String config = String.format(ROCKSDB_CONFIG_TEMPLATE, name, nickname,
name, name);
+ return client.post(path, Entity.json(config));
+ }
+
public static Response createGraph(String graphSpace, String name,
String nickname) {
String config = "{\n" +
diff --git
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/api/GraphsApiTest.java
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/api/GraphsApiTest.java
index 469a83e51..efd7c3e76 100644
---
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/api/GraphsApiTest.java
+++
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/api/GraphsApiTest.java
@@ -18,42 +18,335 @@
package org.apache.hugegraph.api;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
+import org.apache.hugegraph.util.JsonUtil;
+import org.junit.Assert;
import org.junit.Test;
+import com.google.common.collect.ImmutableMap;
+
+import jakarta.ws.rs.client.Entity;
import jakarta.ws.rs.core.Response;
public class GraphsApiTest extends BaseApiTest {
- private static final String TEMP_SPACE = "graph_test";
- private static final String TEMP_AUTH_SPACE = "graph_auth_test";
- private static final String PATH = "graphspaces/graph_test/graphs";
- private static final String PATH_AUTH = "graphspaces/graph_auth_test" +
- "/graphs";
+ private static final String TEMP_SPACE = "DEFAULT";
+ private static final String PATH = "graphspaces/DEFAULT/graphs";
+
+ @Test
+ public void testListGraphs() {
+ try {
+ // Create multiple graphs
+ Response r1 = createGraphInRocksDB(TEMP_SPACE, "listtest1");
+ assertResponseStatus(201, r1);
+
+ Response r2 = createGraphInRocksDB(TEMP_SPACE, "listtest2");
+ assertResponseStatus(201, r2);
+
+ // List all graphs
+ Response r = client().get(PATH);
+ String content = assertResponseStatus(200, r);
+
+ Map<String, Object> result = JsonUtil.fromJson(content, Map.class);
+ Assert.assertTrue(result.containsKey("graphs"));
+
+ @SuppressWarnings("unchecked")
+ List<String> graphs = (List<String>) result.get("graphs");
+ Assert.assertTrue(graphs.contains("listtest1"));
+ Assert.assertTrue(graphs.contains("listtest2"));
+ } finally {
+ // Clean up
+ Map<String, Object> params = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/listtest1", params);
+ client().delete(PATH + "/listtest2", params);
+ }
+ }
+
+ @Test
+ public void testGetGraph() {
+ try {
+ // Create a graph
+ Response r = createGraphInRocksDB(TEMP_SPACE, "get_test",
"GetTestGraph");
+ assertResponseStatus(201, r);
+
+ // Get the graph
+ Response getResponse = client().get(PATH + "/get_test");
+ String content = assertResponseStatus(200, getResponse);
+
+ Map<String, Object> result = JsonUtil.fromJson(content, Map.class);
+ Assert.assertTrue(result.containsKey("name"));
+ Assert.assertTrue(result.containsKey("backend"));
+ Assert.assertEquals("get_test", result.get("name"));
+ } finally {
+ // Clean up
+ Map<String, Object> params = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/get_test", params);
+ }
+ }
+
+ @Test
+ public void testcreateGraphInRocksDB() {
+ try {
+ String config = "{\n" +
+ " \"gremlin.graph\":
\"org.apache.hugegraph.HugeFactory\",\n" +
+ " \"backend\": \"rocksdb\",\n" +
+ " \"serializer\": \"binary\",\n" +
+ " \"store\": \"create_test\",\n" +
+ " \"nickname\": \"CreateTestGraph\",\n" +
+ " \"description\": \"Test graph creation\",\n" +
+ " \"rocksdb.data_path\":
\"rocksdbtest-data-create_test\",\n" +
+ " \"rocksdb.wal_path\":
\"rocksdbtest-data-create_test\"\n" +
+ "}";
+
+ Response r = client().post(PATH + "/create_test",
+ Entity.json(config));
+ String content = assertResponseStatus(201, r);
+
+ Map<String, Object> result = JsonUtil.fromJson(content, Map.class);
+ Assert.assertEquals("create_test", result.get("name"));
+ Assert.assertEquals("CreateTestGraph", result.get("nickname"));
+ Assert.assertEquals("rocksdb", result.get("backend"));
+ Assert.assertEquals("Test graph creation",
result.get("description"));
+ } finally {
+ // Clean up
+ Map<String, Object> params = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/create_test", params);
+ }
+ }
+
+ @Test
+ public void testcreateGraphInRocksDBWithMissingRequiredParams() {
+ // Missing 'backend' parameter
+ String config = "{\n" +
+ " \"serializer\": \"binary\",\n" +
+ " \"store\": \"invalid_test\"\n" +
+ "}";
- @BeforeClass
- public static void prepareSpace() {
- createSpace(TEMP_SPACE, false);
- createSpace(TEMP_AUTH_SPACE, true);
+ Response r = client().post(PATH + "/invalid_test",
+ Entity.json(config));
+ Assert.assertTrue(r.getStatus() >= 400);
}
- @AfterClass
- public static void tearDown() {
- clearSpaces();
+ @Test
+ public void testCloneGraph() {
+ try {
+ // Create source graph
+ Response r1 = createGraphInRocksDB(TEMP_SPACE, "clone_source",
"SourceGraph");
+ assertResponseStatus(201, r1);
+
+ // Clone the graph
+ String config = "{\n" +
+ " \"gremlin.graph\":
\"org.apache.hugegraph.HugeFactory\",\n" +
+ " \"backend\": \"rocksdb\",\n" +
+ " \"serializer\": \"binary\",\n" +
+ " \"store\": \"clone_target\",\n" +
+ " \"nickname\": \"ClonedGraph\",\n" +
+ " \"rocksdb.data_path\":
\"rocksdbtest-data-clone_target\",\n" +
+ " \"rocksdb.wal_path\":
\"rocksdbtest-data-clone_target\"\n" +
+ "}";
+
+ Map<String, Object> params = ImmutableMap.of(
+ "clone_graph_name", "clone_source");
+
+ String path = PATH + "/clone_target";
+ Response r = client().target(baseUrl())
+ .path(path)
+ .queryParam("clone_graph_name",
"clone_source")
+ .request()
+ .post(Entity.json(config));
+
+ String content = assertResponseStatus(201, r);
+ Map<String, Object> result = JsonUtil.fromJson(content, Map.class);
+ Assert.assertEquals("clone_target", result.get("name"));
+ } finally {
+ // Clean up
+ Map<String, Object> deleteParams = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/clone_source", deleteParams);
+ client().delete(PATH + "/clone_target", deleteParams);
+ }
}
@Test
public void testDeleteGraph() {
- Response r = createGraph(TEMP_SPACE, "delete");
+ Response r = createGraphInRocksDB(TEMP_SPACE, "delete_test");
assertResponseStatus(201, r);
Map<String, Object> params = new HashMap<>();
params.put("confirm_message", "I'm sure to drop the graph");
- r = client().delete(PATH + "/delete", params);
+ r = client().delete(PATH + "/delete_test", params);
assertResponseStatus(204, r);
+
+ // Verify graph is deleted
+ Response getResponse = client().get(PATH + "/delete_test");
+ Assert.assertTrue(getResponse.getStatus() >= 400);
+ }
+
+ @Test
+ public void testDeleteGraphWithoutConfirmMessage() {
+ try {
+ Response r = createGraphInRocksDB(TEMP_SPACE, "delete_no_confirm");
+ assertResponseStatus(201, r);
+
+ // Try to delete without confirmation
+ Response deleteResponse = client().delete(PATH +
"/delete_no_confirm",
+ new HashMap<>());
+ Assert.assertTrue(deleteResponse.getStatus() >= 400);
+ } finally {
+ // Clean up properly
+ Map<String, Object> params = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/delete_no_confirm", params);
+ }
+ }
+
+ @Test
+ public void testClearGraph() {
+ try {
+ Response r = createGraphInRocksDB(TEMP_SPACE, "clear_test");
+ assertResponseStatus(201, r);
+
+ Map<String, Object> params = ImmutableMap.of(
+ "confirm_message", "I'm sure to delete all data");
+
+ Response clearResponse = client().delete(PATH +
"/clear_test/clear",
+ params);
+ assertResponseStatus(204, clearResponse);
+ } finally {
+ // Clean up
+ Map<String, Object> deleteParams = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/clear_test", deleteParams);
+ }
+ }
+
+ @Test
+ public void testClearGraphWithoutConfirmMessage() {
+ try {
+ Response r = createGraphInRocksDB(TEMP_SPACE, "clear_no_confirm");
+ assertResponseStatus(201, r);
+
+ // Try to clear without confirmation
+ Response clearResponse = client().delete(PATH +
"/clear_no_confirm/clear",
+ new HashMap<>());
+ Assert.assertTrue(clearResponse.getStatus() >= 400);
+ } finally {
+ // Clean up
+ Map<String, Object> params = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/clear_no_confirm", params);
+ }
+ }
+
+ @Test
+ public void testSetGraphMode() {
+ try {
+ Response r = createGraphInRocksDB(TEMP_SPACE, "mode_test");
+ assertResponseStatus(201, r);
+
+ // Set mode to RESTORING
+ String modeJson = "\"RESTORING\"";
+ Response modeResponse = client().target(baseUrl())
+ .path(PATH + "/mode_test/mode")
+ .request()
+ .put(Entity.json(modeJson));
+
+ String content = assertResponseStatus(200, modeResponse);
+ Map<String, Object> result = JsonUtil.fromJson(content, Map.class);
+ Assert.assertEquals("RESTORING", result.get("mode"));
+ } finally {
+ // Clean up
+ Map<String, Object> params = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/mode_test", params);
+ }
+ }
+
+ @Test
+ public void testGetGraphMode() {
+ try {
+ Response r = createGraphInRocksDB(TEMP_SPACE, "get_mode_test");
+ assertResponseStatus(201, r);
+
+ Response modeResponse = client().get(PATH + "/get_mode_test/mode");
+ String content = assertResponseStatus(200, modeResponse);
+
+ Map<String, Object> result = JsonUtil.fromJson(content, Map.class);
+ Assert.assertTrue(result.containsKey("mode"));
+ } finally {
+ // Clean up
+ Map<String, Object> params = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/get_mode_test", params);
+ }
+ }
+
+ @Test
+ public void testSetGraphReadMode() {
+ try {
+ Response r = createGraphInRocksDB(TEMP_SPACE, "read_mode_test");
+ assertResponseStatus(201, r);
+
+ // Set read mode to OLTP_ONLY
+ String readModeJson = "\"OLTP_ONLY\"";
+ Response readModeResponse = client().target(baseUrl())
+ .path(PATH +
"/read_mode_test/graph_read_mode")
+ .request()
+
.put(Entity.json(readModeJson));
+
+ String content = assertResponseStatus(200, readModeResponse);
+ Map<String, Object> result = JsonUtil.fromJson(content, Map.class);
+ Assert.assertEquals("OLTP_ONLY", result.get("graph_read_mode"));
+ } finally {
+ // Clean up
+ Map<String, Object> params = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/read_mode_test", params);
+ }
+ }
+
+ @Test
+ public void testGetGraphReadMode() {
+ try {
+ Response r = createGraphInRocksDB(TEMP_SPACE,
"get_read_mode_test");
+ assertResponseStatus(201, r);
+
+ Response readModeResponse = client().get(PATH +
"/get_read_mode_test/graph_read_mode");
+ String content = assertResponseStatus(200, readModeResponse);
+
+ Map<String, Object> result = JsonUtil.fromJson(content, Map.class);
+ Assert.assertTrue(result.containsKey("graph_read_mode"));
+ } finally {
+ // Clean up
+ Map<String, Object> params = ImmutableMap.of(
+ "confirm_message", "I'm sure to drop the graph");
+ client().delete(PATH + "/get_read_mode_test", params);
+ }
+ }
+
+ @Test
+ public void testReloadGraphsWithInvalidAction() {
+ String actionJson = "{\n" +
+ " \"action\": \"invalid_action\"\n" +
+ "}";
+
+ Response r = client().target(baseUrl())
+ .path(PATH + "/manage")
+ .request()
+ .put(Entity.json(actionJson));
+
+ Assert.assertTrue(r.getStatus() >= 400);
+ }
+
+ @Test
+ public void testGraphNotExist() {
+ Response r = client().get(PATH + "/non_existent_graph");
+ Assert.assertTrue(r.getStatus() >= 400);
}
}