fix(client): update Content-Type in GraphsAPI for adding graphs (#714)
- Use RestHeaders.APPLICATION_JSON constant in GraphsAPI.create()
- Bump hugegraph-common version from 1.5.0 to 1.7.0
- Add unit tests (Mockito) to verify Content-Type and clone params
- Re-enable integration tests (server NPE fixed in hugegraph#2900)
- Migrate test config files from .properties to JSON format
- Remove outdated assertEquals on response size (server now returns 4 fields)
* chore(client): cleanup review findings
- Delete orphaned .properties test config files (replaced by .json)
- Remove unused VersionUtil import in GraphsAPITest
* fix(test): align error message assertion with common 1.7.0 Date serialization
hugegraph-common 1.7.0 added MAPPER.disable(WRITE_DATES_AS_TIMESTAMPS)
with SimpleDateFormat, so Date values are now serialized as String
("yyyy-MM-dd HH:mm:ss.SSS") instead of Long (epoch millis).
This causes the server's UpdateStrategy.formatError() to report
"Date, String" instead of "Date, Long" when checking INTERSECTION
strategy on non-collection properties.
---------
Co-authored-by: imbajin <jin@apache.org>diff --git a/hugegraph-client/src/main/java/org/apache/hugegraph/api/graphs/GraphsAPI.java b/hugegraph-client/src/main/java/org/apache/hugegraph/api/graphs/GraphsAPI.java
index 17d0a53..030cf12 100644
--- a/hugegraph-client/src/main/java/org/apache/hugegraph/api/graphs/GraphsAPI.java
+++ b/hugegraph-client/src/main/java/org/apache/hugegraph/api/graphs/GraphsAPI.java
@@ -74,7 +74,8 @@
@SuppressWarnings("unchecked")
public Map<String, String> create(String name, String cloneGraphName, String configText) {
this.client.checkApiVersion("0.67", "dynamic graph add");
- RestHeaders headers = new RestHeaders().add(RestHeaders.CONTENT_TYPE, "text/plain");
+ RestHeaders headers = new RestHeaders().add(RestHeaders.CONTENT_TYPE,
+ RestHeaders.APPLICATION_JSON);
Map<String, Object> params = null;
if (StringUtils.isNotEmpty(cloneGraphName)) {
params = ImmutableMap.of("clone_graph_name", cloneGraphName);
diff --git a/hugegraph-client/src/test/java/org/apache/hugegraph/api/BatchUpdateElementApiTest.java b/hugegraph-client/src/test/java/org/apache/hugegraph/api/BatchUpdateElementApiTest.java
index 88a9088..4604f68 100644
--- a/hugegraph-client/src/test/java/org/apache/hugegraph/api/BatchUpdateElementApiTest.java
+++ b/hugegraph-client/src/test/java/org/apache/hugegraph/api/BatchUpdateElementApiTest.java
@@ -330,7 +330,7 @@
vertexAPI.update(req5);
}, e -> {
String expect = "Property type must be Set or List for " +
- "strategy INTERSECTION, but got type Date, Long";
+ "strategy INTERSECTION, but got type Date, String";
Assert.assertContains(expect, e.getMessage());
});
@@ -622,7 +622,7 @@
edgeAPI.update(req5);
}, e -> {
String expect = "Property type must be Set or List for " +
- "strategy INTERSECTION, but got type Date, Long";
+ "strategy INTERSECTION, but got type Date, String";
Assert.assertContains(expect, e.getMessage());
});
diff --git a/hugegraph-client/src/test/java/org/apache/hugegraph/api/GraphsApiTest.java b/hugegraph-client/src/test/java/org/apache/hugegraph/api/GraphsApiTest.java
index a60b2a8..5947cd5 100644
--- a/hugegraph-client/src/test/java/org/apache/hugegraph/api/GraphsApiTest.java
+++ b/hugegraph-client/src/test/java/org/apache/hugegraph/api/GraphsApiTest.java
@@ -33,19 +33,17 @@
import org.apache.hugegraph.structure.gremlin.ResultSet;
import org.apache.hugegraph.testutil.Assert;
import org.junit.After;
-import org.junit.Ignore;
import org.junit.Test;
import com.google.common.collect.ImmutableSet;
-//@Ignore
public class GraphsApiTest extends BaseApiTest {
private static final String GRAPH2 = "hugegraph2";
- private static final String CONFIG2_PATH = "src/test/resources/hugegraph-create.properties";
+ private static final String CONFIG2_PATH = "src/test/resources/hugegraph-create.json";
private static final String GRAPH3 = "hugegraph3";
- private static final String CONFIG3_PATH = "src/test/resources/hugegraph-clone.properties";
+ private static final String CONFIG3_PATH = "src/test/resources/hugegraph-clone.json";
protected static void initPropertyKey(HugeClient client) {
SchemaManager schema = client.schema();
@@ -118,10 +116,6 @@
}
}
- // FIXME: This test fails due to NullPointerException in server's metaManager.graphConfigs()
- // when calling graphsAPI.list(). Need to update and fix after server metaManager is fixed.
- // See: GraphManager.graphs() line 2055 in hugegraph-server
- @Ignore("Temporarily disabled due to server metaManager NullPointerException")
@Test
public void testCreateAndDropGraph() {
int initialGraphNumber = graphsAPI.list().size();
@@ -136,7 +130,6 @@
CONFIG2_PATH);
}
Map<String, String> result = graphsAPI.create(GRAPH2, null, config);
- Assert.assertEquals(2, result.size());
Assert.assertEquals(GRAPH2, result.get("name"));
Assert.assertEquals("rocksdb", result.get("backend"));
@@ -193,10 +186,6 @@
Assert.assertEquals(initialGraphNumber, graphsAPI.list().size());
}
- // FIXME: This test fails due to NullPointerException in server's metaManager.graphConfigs()
- // when calling graphsAPI.list(). Need to update and fix after server metaManager is fixed.
- // See: GraphManager.graphs() line 2055 in hugegraph-server
- @Ignore("Temporarily disabled due to server metaManager NullPointerException")
@Test
public void testCloneAndDropGraph() {
int initialGraphNumber = graphsAPI.list().size();
@@ -212,13 +201,12 @@
}
Map<String, String> result = graphsAPI.create(GRAPH3, "hugegraph",
config);
- Assert.assertEquals(2, result.size());
Assert.assertEquals(GRAPH3, result.get("name"));
Assert.assertEquals("rocksdb", result.get("backend"));
Assert.assertEquals(initialGraphNumber + 1, graphsAPI.list().size());
- HugeClient client = new HugeClient(baseClient(), DEFAULT_GRAPHSPACE, GRAPH3);
+ HugeClient client = new HugeClient(baseClient(), GRAPHSPACE, GRAPH3);
// Insert graph schema and data
initPropertyKey(client);
initVertexLabel(client);
@@ -269,10 +257,6 @@
Assert.assertEquals(initialGraphNumber, graphsAPI.list().size());
}
- // FIXME: This test fails due to NullPointerException in server's metaManager.graphConfigs()
- // when calling graphsAPI.list(). Need to update and fix after server metaManager is fixed.
- // See: GraphManager.graphs() line 2055 in hugegraph-server
- @Ignore("Temporarily disabled due to server metaManager NullPointerException")
@Test
public void testCloneAndDropGraphWithoutConfig() {
int initialGraphNumber = graphsAPI.list().size();
@@ -281,7 +265,6 @@
String config = null;
Map<String, String> result = graphsAPI.create(GRAPH3, "hugegraph",
config);
- Assert.assertEquals(2, result.size());
Assert.assertEquals(GRAPH3, result.get("name"));
Assert.assertEquals("rocksdb", result.get("backend"));
diff --git a/hugegraph-client/src/test/java/org/apache/hugegraph/unit/GraphsAPITest.java b/hugegraph-client/src/test/java/org/apache/hugegraph/unit/GraphsAPITest.java
new file mode 100644
index 0000000..d10f84f
--- /dev/null
+++ b/hugegraph-client/src/test/java/org/apache/hugegraph/unit/GraphsAPITest.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hugegraph.unit;
+
+import java.util.Map;
+
+import org.apache.hugegraph.api.graphs.GraphsAPI;
+import org.apache.hugegraph.client.RestClient;
+import org.apache.hugegraph.rest.RestHeaders;
+import org.apache.hugegraph.rest.RestResult;
+import org.apache.hugegraph.testutil.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+
+public class GraphsAPITest extends BaseUnitTest {
+
+ private RestClient mockClient;
+ private GraphsAPI graphsAPI;
+
+ @Before
+ public void setup() {
+ this.mockClient = Mockito.mock(RestClient.class);
+ Mockito.when(this.mockClient.apiVersionLt(Mockito.anyString()))
+ .thenReturn(false);
+ this.graphsAPI = new GraphsAPI(this.mockClient, "DEFAULT");
+ }
+
+ @Test
+ public void testCreateGraphUsesJsonContentType() {
+ RestResult mockResult = Mockito.mock(RestResult.class);
+ Mockito.when(mockResult.readObject(Map.class))
+ .thenReturn(null);
+
+ ArgumentCaptor<String> pathCaptor =
+ ArgumentCaptor.forClass(String.class);
+ ArgumentCaptor<Object> bodyCaptor =
+ ArgumentCaptor.forClass(Object.class);
+ ArgumentCaptor<RestHeaders> headersCaptor =
+ ArgumentCaptor.forClass(RestHeaders.class);
+ @SuppressWarnings("unchecked")
+ ArgumentCaptor<Map<String, Object>> paramsCaptor =
+ ArgumentCaptor.forClass(Map.class);
+
+ Mockito.when(this.mockClient.post(
+ pathCaptor.capture(),
+ bodyCaptor.capture(),
+ headersCaptor.capture(),
+ paramsCaptor.capture()
+ )).thenReturn(mockResult);
+
+ this.graphsAPI.create("test-graph", null, "{}");
+
+ RestHeaders capturedHeaders = headersCaptor.getValue();
+ Assert.assertEquals("application/json",
+ capturedHeaders.get(RestHeaders.CONTENT_TYPE));
+
+ Assert.assertTrue(
+ pathCaptor.getValue().contains("test-graph"));
+ Assert.assertEquals("{}", bodyCaptor.getValue());
+ Assert.assertNull(paramsCaptor.getValue());
+ }
+
+ @Test
+ public void testCloneGraphUsesJsonContentTypeAndParams() {
+ RestResult mockResult = Mockito.mock(RestResult.class);
+ Mockito.when(mockResult.readObject(Map.class))
+ .thenReturn(null);
+
+ ArgumentCaptor<RestHeaders> headersCaptor =
+ ArgumentCaptor.forClass(RestHeaders.class);
+ @SuppressWarnings("unchecked")
+ ArgumentCaptor<Map<String, Object>> paramsCaptor =
+ ArgumentCaptor.forClass(Map.class);
+
+ Mockito.when(this.mockClient.post(
+ Mockito.anyString(),
+ Mockito.any(),
+ headersCaptor.capture(),
+ paramsCaptor.capture()
+ )).thenReturn(mockResult);
+
+ this.graphsAPI.create("new-graph", "source-graph", "{}");
+
+ RestHeaders capturedHeaders = headersCaptor.getValue();
+ Assert.assertEquals("application/json",
+ capturedHeaders.get(RestHeaders.CONTENT_TYPE));
+
+ Map<String, Object> capturedParams = paramsCaptor.getValue();
+ Assert.assertNotNull(capturedParams);
+ Assert.assertEquals("source-graph",
+ capturedParams.get("clone_graph_name"));
+ }
+}
diff --git a/hugegraph-client/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java b/hugegraph-client/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java
index c4abd46..5ddb23a 100644
--- a/hugegraph-client/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java
+++ b/hugegraph-client/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java
@@ -28,6 +28,7 @@
BatchElementRequestTest.class,
PropertyKeyTest.class,
IndexLabelTest.class,
+ GraphsAPITest.class,
CommonUtilTest.class,
IdUtilTest.class,
SplicingIdGeneratorTest.class
diff --git a/hugegraph-client/src/test/resources/hugegraph-clone.json b/hugegraph-client/src/test/resources/hugegraph-clone.json
new file mode 100644
index 0000000..0fa1458
--- /dev/null
+++ b/hugegraph-client/src/test/resources/hugegraph-clone.json
@@ -0,0 +1,5 @@
+{
+ "store": "hugegraph3",
+ "rocksdb.data_path": "rocksdb-data/data_hugegraph3",
+ "rocksdb.wal_path": "rocksdb-data/wal_hugegraph3"
+}
diff --git a/hugegraph-client/src/test/resources/hugegraph-clone.properties b/hugegraph-client/src/test/resources/hugegraph-clone.properties
deleted file mode 100644
index e0a8c87..0000000
--- a/hugegraph-client/src/test/resources/hugegraph-clone.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with this
-# work for additional information regarding copyright ownership. The ASF
-# licenses this file to You under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-#
-
-store=hugegraph3
-rocksdb.data_path=./hg3
-rocksdb.wal_path=./hg3
diff --git a/hugegraph-client/src/test/resources/hugegraph-create.json b/hugegraph-client/src/test/resources/hugegraph-create.json
new file mode 100644
index 0000000..d0913ea
--- /dev/null
+++ b/hugegraph-client/src/test/resources/hugegraph-create.json
@@ -0,0 +1,8 @@
+{
+ "gremlin.graph": "org.apache.hugegraph.auth.HugeFactoryAuthProxy",
+ "backend": "rocksdb",
+ "serializer": "binary",
+ "store": "hugegraph2",
+ "rocksdb.data_path": "rocksdb-data/data_hugegraph2",
+ "rocksdb.wal_path": "rocksdb-data/wal_hugegraph2"
+}
diff --git a/hugegraph-client/src/test/resources/hugegraph-create.properties b/hugegraph-client/src/test/resources/hugegraph-create.properties
deleted file mode 100644
index 882b5bf..0000000
--- a/hugegraph-client/src/test/resources/hugegraph-create.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with this
-# work for additional information regarding copyright ownership. The ASF
-# licenses this file to You under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-#
-
-gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy
-backend=rocksdb
-serializer=binary
-store=hugegraph2
-rocksdb.data_path=./hg2
-rocksdb.wal_path=./hg2
diff --git a/pom.xml b/pom.xml
index f64ad72..714440e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -99,8 +99,7 @@
<properties>
<revision>1.7.0</revision>
- <!-- TODO: upgrade common later -->
- <hugegraph.common.version>1.5.0</hugegraph.common.version>
+ <hugegraph.common.version>1.7.0</hugegraph.common.version>
<release.name>${project.artifactId}</release.name>
<final.name>apache-${release.name}-${project.version}</final.name>
<assembly.dir>${project.basedir}/assembly</assembly.dir>