Skip to content

Commit db54aa4

Browse files
authored
Fixes #4245: Add integration test to check that apache.commons.collections is not present anymore (#4279)
* Fixes #4245: Add integration test to check that apache.commons.collections is not present anymore * fix tests * fix CI error
1 parent 4018479 commit db54aa4

File tree

4 files changed

+224
-59
lines changed

4 files changed

+224
-59
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package apoc.util;
2+
3+
import org.testcontainers.weaviate.WeaviateContainer;
4+
5+
import java.util.Iterator;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
import static apoc.ml.RestAPIConfig.HEADERS_KEY;
10+
import static apoc.util.Util.map;
11+
import static apoc.vectordb.VectorDbTestUtil.EntityType.FALSE;
12+
import static apoc.vectordb.VectorDbTestUtil.assertBerlinResult;
13+
import static apoc.vectordb.VectorDbTestUtil.assertLondonResult;
14+
import static apoc.vectordb.VectorDbTestUtil.getAuthHeader;
15+
import static org.junit.Assert.assertNotNull;
16+
17+
public class WeaviateTestUtil {
18+
public static final List<String> FIELDS = List.of("city", "foo");
19+
public static final String ADMIN_KEY = "jane-secret-key";
20+
public static final String READONLY_KEY = "ian-secret-key";
21+
public static final String COLLECTION_NAME = "TestCollection";
22+
23+
public static final WeaviateContainer WEAVIATE_CONTAINER = new WeaviateContainer("semitechnologies/weaviate:1.24.5")
24+
.withEnv("AUTHENTICATION_APIKEY_ENABLED", "true")
25+
.withEnv("AUTHENTICATION_APIKEY_ALLOWED_KEYS", ADMIN_KEY + "," + READONLY_KEY)
26+
.withEnv("AUTHENTICATION_APIKEY_USERS", "[email protected],ian-smith")
27+
.withEnv("AUTHORIZATION_ADMINLIST_ENABLED", "true")
28+
.withEnv("AUTHORIZATION_ADMINLIST_USERS", "[email protected],[email protected]")
29+
.withEnv("AUTHORIZATION_ADMINLIST_READONLY_USERS", "ian-smith,[email protected]");
30+
31+
public static final Map<String, String> ADMIN_AUTHORIZATION = getAuthHeader(ADMIN_KEY);
32+
public static final Map<String, String> READONLY_AUTHORIZATION = getAuthHeader(READONLY_KEY);
33+
public static final Map<String, Object> ADMIN_HEADER_CONF = map(HEADERS_KEY, ADMIN_AUTHORIZATION);
34+
35+
public static final String ID_1 = "8ef2b3a7-1e56-4ddd-b8c3-2ca8901ce308";
36+
public static final String ID_2 = "9ef2b3a7-1e56-4ddd-b8c3-2ca8901ce308";
37+
38+
public static String HOST;
39+
public static final int WEAVIATE_PORT = 8080;
40+
41+
public static final String WEAVIATE_CREATE_COLLECTION_APOC = "CALL apoc.vectordb.weaviate.createCollection($host, 'TestCollection', 'cosine', 4, $conf)";
42+
43+
public static final String WEAVIATE_DELETE_COLLECTION_APOC = "CALL apoc.vectordb.weaviate.deleteCollection($host, $collectionName, $conf)";
44+
45+
public static final String WEAVIATE_QUERY_APOC = "CALL apoc.vectordb.weaviate.query($host, 'TestCollection', [0.2, 0.1, 0.9, 0.7], null, 5, $conf) YIELD score, vector, id, metadata RETURN * ORDER BY id";
46+
47+
public static final String WEAVIATE_DELETE_VECTOR_APOC = "CALL apoc.vectordb.weaviate.delete($host, 'TestCollection', ['7ef2b3a7-1e56-4ddd-b8c3-2ca8901ce308', '7ef2b3a7-1e56-4ddd-b8c3-2ca8901ce309'], $conf)";
48+
49+
public static final String WEAVIATE_UPSERT_QUERY = """
50+
CALL apoc.vectordb.weaviate.upsert($host, 'TestCollection',
51+
[
52+
{id: $id1, vector: [0.05, 0.61, 0.76, 0.74], metadata: {city: "Berlin", foo: "one"}},
53+
{id: $id2, vector: [0.19, 0.81, 0.75, 0.11], metadata: {city: "London", foo: "two"}},
54+
{id: '7ef2b3a7-1e56-4ddd-b8c3-2ca8901ce308', vector: [0.19, 0.81, 0.75, 0.11], metadata: {foo: "baz"}},
55+
{id: '7ef2b3a7-1e56-4ddd-b8c3-2ca8901ce309', vector: [0.19, 0.81, 0.75, 0.11], metadata: {foo: "baz"}}
56+
],
57+
$conf)
58+
""";
59+
60+
public static void queryVectorsAssertions(Iterator<Map<String, Object>> r) {
61+
Map<String, Object> row = r.next();
62+
assertBerlinResult(row, ID_1, FALSE);
63+
assertNotNull(row.get("score"));
64+
assertNotNull(row.get("vector"));
65+
66+
row = r.next();
67+
assertLondonResult(row, ID_2, FALSE);
68+
assertNotNull(row.get("score"));
69+
assertNotNull(row.get("vector"));
70+
}
71+
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package apoc.vectordb;
2+
3+
import apoc.util.MapUtil;
4+
import apoc.util.Neo4jContainerExtension;
5+
import apoc.util.TestContainerUtil;
6+
import apoc.util.WeaviateTestUtil;
7+
import org.junit.AfterClass;
8+
import org.junit.BeforeClass;
9+
import org.junit.ClassRule;
10+
import org.junit.Test;
11+
import org.junit.rules.TemporaryFolder;
12+
import org.neo4j.driver.Session;
13+
import org.testcontainers.containers.Network;
14+
15+
import java.util.List;
16+
import java.util.Map;
17+
18+
import static apoc.ml.RestAPIConfig.HEADERS_KEY;
19+
import static apoc.util.TestContainerUtil.createEnterpriseDB;
20+
import static apoc.util.TestContainerUtil.testCall;
21+
import static apoc.util.TestContainerUtil.testCallEmpty;
22+
import static apoc.util.TestContainerUtil.testResult;
23+
import static apoc.util.Util.map;
24+
import static apoc.util.WeaviateTestUtil.ADMIN_AUTHORIZATION;
25+
import static apoc.util.WeaviateTestUtil.ADMIN_HEADER_CONF;
26+
import static apoc.util.WeaviateTestUtil.COLLECTION_NAME;
27+
import static apoc.util.WeaviateTestUtil.FIELDS;
28+
import static apoc.util.WeaviateTestUtil.HOST;
29+
import static apoc.util.WeaviateTestUtil.ID_1;
30+
import static apoc.util.WeaviateTestUtil.ID_2;
31+
import static apoc.util.WeaviateTestUtil.WEAVIATE_CONTAINER;
32+
import static apoc.util.WeaviateTestUtil.WEAVIATE_CREATE_COLLECTION_APOC;
33+
import static apoc.util.WeaviateTestUtil.WEAVIATE_DELETE_COLLECTION_APOC;
34+
import static apoc.util.WeaviateTestUtil.WEAVIATE_DELETE_VECTOR_APOC;
35+
import static apoc.util.WeaviateTestUtil.WEAVIATE_PORT;
36+
import static apoc.util.WeaviateTestUtil.WEAVIATE_QUERY_APOC;
37+
import static apoc.util.WeaviateTestUtil.WEAVIATE_UPSERT_QUERY;
38+
import static apoc.vectordb.VectorEmbeddingConfig.ALL_RESULTS_KEY;
39+
import static apoc.vectordb.VectorEmbeddingConfig.FIELDS_KEY;
40+
import static org.junit.Assert.assertEquals;
41+
import static org.junit.Assert.assertFalse;
42+
43+
44+
public class WeaviateEnterpriseTest {
45+
46+
@ClassRule
47+
public static TemporaryFolder storeDir = new TemporaryFolder();
48+
private static Neo4jContainerExtension neo4jContainer;
49+
private static Session session;
50+
51+
@BeforeClass
52+
public static void setUp() throws Exception {
53+
Network network = Network.newNetwork();
54+
55+
// We build the project, the artifact will be placed into ./build/libs
56+
neo4jContainer = createEnterpriseDB(List.of(TestContainerUtil.ApocPackage.EXTENDED), true)
57+
.withNetwork(network)
58+
.withNetworkAliases("neo4j");
59+
neo4jContainer.start();
60+
session = neo4jContainer.getSession();
61+
62+
String weaviateAlias = "weaviate";
63+
WEAVIATE_CONTAINER.withNetwork(network)
64+
.withNetworkAliases(weaviateAlias)
65+
.withExposedPorts(WEAVIATE_PORT);
66+
WEAVIATE_CONTAINER.start();
67+
68+
HOST = weaviateAlias + ":" + WEAVIATE_PORT;
69+
70+
testCall(session, WEAVIATE_CREATE_COLLECTION_APOC,
71+
map("host", HOST, "conf", ADMIN_HEADER_CONF),
72+
r -> {
73+
Map value = (Map) r.get("value");
74+
assertEquals("TestCollection", value.get("class"));
75+
});
76+
77+
testResult(session, WEAVIATE_UPSERT_QUERY,
78+
map("host", HOST, "id1", ID_1, "id2", ID_2, "conf", ADMIN_HEADER_CONF),
79+
r -> {
80+
Map<String, Object> row = r.next();
81+
Map<String, Object> value = (Map<String, Object>) row.get("value");
82+
83+
assertEquals(COLLECTION_NAME, value.get("class"));
84+
85+
while (r.hasNext()) {
86+
row = r.next();
87+
value = (Map<String, Object>) row.get("value");
88+
assertEquals(COLLECTION_NAME, value.get("class"));
89+
}
90+
assertFalse(r.hasNext());
91+
});
92+
93+
// -- delete vector
94+
testCall(session, WEAVIATE_DELETE_VECTOR_APOC,
95+
map("host", HOST, "conf", ADMIN_HEADER_CONF),
96+
r -> {
97+
List value = (List) r.get("value");
98+
assertEquals(List.of("7ef2b3a7-1e56-4ddd-b8c3-2ca8901ce308", "7ef2b3a7-1e56-4ddd-b8c3-2ca8901ce309"), value);
99+
});
100+
}
101+
102+
@AfterClass
103+
public static void tearDown() throws Exception {
104+
testCallEmpty(session, WEAVIATE_DELETE_COLLECTION_APOC,
105+
MapUtil.map("host", HOST, "collectionName", COLLECTION_NAME, "conf", ADMIN_HEADER_CONF)
106+
);
107+
session.close();
108+
neo4jContainer.close();
109+
WEAVIATE_CONTAINER.stop();
110+
}
111+
112+
@Test
113+
public void queryVectors() {
114+
testResult(session, WEAVIATE_QUERY_APOC,
115+
map("host", HOST, "conf", map(ALL_RESULTS_KEY, true, FIELDS_KEY, FIELDS, HEADERS_KEY, ADMIN_AUTHORIZATION)),
116+
WeaviateTestUtil::queryVectorsAssertions);
117+
}
118+
}

extended-it/src/test/java/apoc/vectordb/WeaviateTest.java

Lines changed: 34 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package apoc.vectordb;
22

33
import apoc.ml.Prompt;
4-
import apoc.util.ExtendedTestUtil;
54
import apoc.util.MapUtil;
65
import apoc.util.TestUtil;
6+
import apoc.util.WeaviateTestUtil;
77
import org.junit.AfterClass;
88
import org.junit.Before;
99
import org.junit.BeforeClass;
@@ -15,7 +15,6 @@
1515
import org.neo4j.graphdb.GraphDatabaseService;
1616
import org.neo4j.graphdb.ResourceIterator;
1717
import org.neo4j.test.TestDatabaseManagementServiceBuilder;
18-
import org.testcontainers.weaviate.WeaviateContainer;
1918

2019
import java.util.List;
2120
import java.util.Map;
@@ -27,6 +26,21 @@
2726
import static apoc.util.TestUtil.testCallEmpty;
2827
import static apoc.util.TestUtil.testResult;
2928
import static apoc.util.Util.map;
29+
import static apoc.util.WeaviateTestUtil.ADMIN_AUTHORIZATION;
30+
import static apoc.util.WeaviateTestUtil.ADMIN_HEADER_CONF;
31+
import static apoc.util.WeaviateTestUtil.ADMIN_KEY;
32+
import static apoc.util.WeaviateTestUtil.COLLECTION_NAME;
33+
import static apoc.util.WeaviateTestUtil.FIELDS;
34+
import static apoc.util.WeaviateTestUtil.HOST;
35+
import static apoc.util.WeaviateTestUtil.ID_1;
36+
import static apoc.util.WeaviateTestUtil.ID_2;
37+
import static apoc.util.WeaviateTestUtil.READONLY_AUTHORIZATION;
38+
import static apoc.util.WeaviateTestUtil.WEAVIATE_CONTAINER;
39+
import static apoc.util.WeaviateTestUtil.WEAVIATE_CREATE_COLLECTION_APOC;
40+
import static apoc.util.WeaviateTestUtil.WEAVIATE_DELETE_COLLECTION_APOC;
41+
import static apoc.util.WeaviateTestUtil.WEAVIATE_DELETE_VECTOR_APOC;
42+
import static apoc.util.WeaviateTestUtil.WEAVIATE_QUERY_APOC;
43+
import static apoc.util.WeaviateTestUtil.WEAVIATE_UPSERT_QUERY;
3044
import static apoc.vectordb.VectorDbHandler.Type.WEAVIATE;
3145
import static apoc.vectordb.VectorDbTestUtil.EntityType.FALSE;
3246
import static apoc.vectordb.VectorDbTestUtil.EntityType.NODE;
@@ -37,12 +51,18 @@
3751
import static apoc.vectordb.VectorDbTestUtil.assertReadOnlyProcWithMappingResults;
3852
import static apoc.vectordb.VectorDbTestUtil.assertRelsCreated;
3953
import static apoc.vectordb.VectorDbTestUtil.dropAndDeleteAll;
40-
import static apoc.vectordb.VectorDbTestUtil.getAuthHeader;
4154
import static apoc.vectordb.VectorDbTestUtil.ragSetup;
4255
import static apoc.vectordb.VectorEmbeddingConfig.ALL_RESULTS_KEY;
4356
import static apoc.vectordb.VectorEmbeddingConfig.FIELDS_KEY;
4457
import static apoc.vectordb.VectorEmbeddingConfig.MAPPING_KEY;
45-
import static apoc.vectordb.VectorMappingConfig.*;
58+
import static apoc.vectordb.VectorMappingConfig.EMBEDDING_KEY;
59+
import static apoc.vectordb.VectorMappingConfig.ENTITY_KEY;
60+
import static apoc.vectordb.VectorMappingConfig.METADATA_KEY;
61+
import static apoc.vectordb.VectorMappingConfig.MODE_KEY;
62+
import static apoc.vectordb.VectorMappingConfig.MappingMode;
63+
import static apoc.vectordb.VectorMappingConfig.NODE_LABEL;
64+
import static apoc.vectordb.VectorMappingConfig.NO_FIELDS_ERROR_MSG;
65+
import static apoc.vectordb.VectorMappingConfig.REL_TYPE;
4666
import static org.assertj.core.api.Assertions.assertThat;
4767
import static org.junit.Assert.assertEquals;
4868
import static org.junit.Assert.assertFalse;
@@ -54,29 +74,7 @@
5474

5575

5676
public class WeaviateTest {
57-
private static final List<String> FIELDS = List.of("city", "foo");
58-
private static final String ADMIN_KEY = "jane-secret-key";
59-
private static final String READONLY_KEY = "ian-secret-key";
60-
private static final String COLLECTION_NAME = "TestCollection";
61-
62-
private static final WeaviateContainer WEAVIATE_CONTAINER = new WeaviateContainer("semitechnologies/weaviate:1.24.5")
63-
.withEnv("AUTHENTICATION_APIKEY_ENABLED", "true")
64-
.withEnv("AUTHENTICATION_APIKEY_ALLOWED_KEYS", ADMIN_KEY + "," + READONLY_KEY)
65-
.withEnv("AUTHENTICATION_APIKEY_USERS", "[email protected],ian-smith")
66-
67-
.withEnv("AUTHORIZATION_ADMINLIST_ENABLED", "true")
68-
.withEnv("AUTHORIZATION_ADMINLIST_USERS", "[email protected],[email protected]")
69-
.withEnv("AUTHORIZATION_ADMINLIST_READONLY_USERS", "ian-smith,[email protected]");
70-
71-
private static final Map<String, String> ADMIN_AUTHORIZATION = getAuthHeader(ADMIN_KEY);
72-
private static final Map<String, String> READONLY_AUTHORIZATION = getAuthHeader(READONLY_KEY);
73-
private static final Map<String, Object> ADMIN_HEADER_CONF = map(HEADERS_KEY, ADMIN_AUTHORIZATION);
74-
75-
private static final String ID_1 = "8ef2b3a7-1e56-4ddd-b8c3-2ca8901ce308";
76-
private static final String ID_2 = "9ef2b3a7-1e56-4ddd-b8c3-2ca8901ce308";
77-
78-
private static String HOST;
79-
77+
8078
@ClassRule
8179
public static TemporaryFolder storeDir = new TemporaryFolder();
8280

@@ -96,23 +94,14 @@ public static void setUp() throws Exception {
9694

9795
TestUtil.registerProcedure(db, Weaviate.class, VectorDb.class, Prompt.class);
9896

99-
testCall(db, "CALL apoc.vectordb.weaviate.createCollection($host, 'TestCollection', 'cosine', 4, $conf)",
97+
testCall(db, WEAVIATE_CREATE_COLLECTION_APOC,
10098
MapUtil.map("host", HOST, "conf", ADMIN_HEADER_CONF),
10199
r -> {
102100
Map value = (Map) r.get("value");
103101
assertEquals("TestCollection", value.get("class"));
104102
});
105103

106-
testResult(db, """
107-
CALL apoc.vectordb.weaviate.upsert($host, 'TestCollection',
108-
[
109-
{id: $id1, vector: [0.05, 0.61, 0.76, 0.74], metadata: {city: "Berlin", foo: "one"}},
110-
{id: $id2, vector: [0.19, 0.81, 0.75, 0.11], metadata: {city: "London", foo: "two"}},
111-
{id: '7ef2b3a7-1e56-4ddd-b8c3-2ca8901ce308', vector: [0.19, 0.81, 0.75, 0.11], metadata: {foo: "baz"}},
112-
{id: '7ef2b3a7-1e56-4ddd-b8c3-2ca8901ce309', vector: [0.19, 0.81, 0.75, 0.11], metadata: {foo: "baz"}}
113-
],
114-
$conf)
115-
""",
104+
testResult(db, WEAVIATE_UPSERT_QUERY,
116105
MapUtil.map("host", HOST, "id1", ID_1, "id2", ID_2, "conf", ADMIN_HEADER_CONF),
117106
r -> {
118107
ResourceIterator<Map> values = r.columnAs("value");
@@ -124,9 +113,7 @@ public static void setUp() throws Exception {
124113
});
125114

126115
// -- delete vector
127-
testCall(db, "CALL apoc.vectordb.weaviate.delete($host, 'TestCollection', " +
128-
"['7ef2b3a7-1e56-4ddd-b8c3-2ca8901ce308', '7ef2b3a7-1e56-4ddd-b8c3-2ca8901ce309']" +
129-
", $conf) ",
116+
testCall(db, WEAVIATE_DELETE_VECTOR_APOC,
130117
map("host", HOST, "conf", ADMIN_HEADER_CONF),
131118
r -> {
132119
List value = (List) r.get("value");
@@ -136,7 +123,7 @@ public static void setUp() throws Exception {
136123

137124
@AfterClass
138125
public static void tearDown() throws Exception {
139-
testCallEmpty(db, "CALL apoc.vectordb.weaviate.deleteCollection($host, $collectionName, $conf)",
126+
testCallEmpty(db, WEAVIATE_DELETE_COLLECTION_APOC,
140127
MapUtil.map("host", HOST, "collectionName", COLLECTION_NAME, "conf", ADMIN_HEADER_CONF)
141128
);
142129

@@ -209,20 +196,9 @@ public void getVectorsWithoutVectorResult() {
209196

210197
@Test
211198
public void queryVectors() {
212-
testResult(db, "CALL apoc.vectordb.weaviate.query($host, 'TestCollection', [0.2, 0.1, 0.9, 0.7], null, 5, $conf) " +
213-
" YIELD score, vector, id, metadata RETURN * ORDER BY id",
199+
testResult(db, WEAVIATE_QUERY_APOC,
214200
map("host", HOST, "conf", map(ALL_RESULTS_KEY, true, FIELDS_KEY, FIELDS, HEADERS_KEY, ADMIN_AUTHORIZATION)),
215-
r -> {
216-
Map<String, Object> row = r.next();
217-
assertBerlinResult(row, ID_1, FALSE);
218-
assertNotNull(row.get("score"));
219-
assertNotNull(row.get("vector"));
220-
221-
row = r.next();
222-
assertLondonResult(row, ID_2, FALSE);
223-
assertNotNull(row.get("score"));
224-
assertNotNull(row.get("vector"));
225-
});
201+
WeaviateTestUtil::queryVectorsAssertions);
226202
}
227203

228204
@Test
@@ -585,7 +561,7 @@ private static void assertQueryVectorsWithSystemDbStorage(String keyConfig, Stri
585561
db,
586562
query,
587563
params,
588-
"Caused by: java.io.FileNotFoundException: http://127.0.0.1:" + HOST.split(":")[1] + "/v3/graphql"
564+
"Caused by: java.io.FileNotFoundException: http://127.0.0.1:" + HOST.split(":")[1] + "/v3/graphql"
589565
);
590566
return;
591567
}
@@ -634,7 +610,7 @@ MAPPING_KEY, map(EMBEDDING_KEY, "vect",
634610
HEADERS_KEY, ADMIN_AUTHORIZATION));
635611
String query = "CALL apoc.vectordb.weaviate.query($host, 'TestCollection', [0.2, 0.1, 0.9, 0.7], null, 5, $conf) " +
636612
" YIELD score, vector, id, metadata RETURN * ORDER BY id";
637-
ExtendedTestUtil.assertFails(db, query, params, NO_FIELDS_ERROR_MSG);
613+
assertFails(db, query, params, NO_FIELDS_ERROR_MSG);
638614
}
639615

640616
@Test
@@ -662,6 +638,6 @@ MAPPING_KEY, map(EMBEDDING_KEY, "vect",
662638
NODE_LABEL, "Test",
663639
ENTITY_KEY, "myId")));
664640
String query = "CALL apoc.vectordb.weaviate.queryAndUpdate($host, 'TestCollection', [0.2, 0.1, 0.9, 0.7], null, 5, $conf) YIELD score, vector, id, metadata, node RETURN * ORDER BY id";
665-
ExtendedTestUtil.assertFails(db, query, params, NO_FIELDS_ERROR_MSG);
641+
assertFails(db, query, params, NO_FIELDS_ERROR_MSG);
666642
}
667643
}

extended/src/test/java/apoc/vectordb/VectorDbTestUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
public class VectorDbTestUtil {
2121

22-
enum EntityType { NODE, REL, FALSE }
22+
public enum EntityType { NODE, REL, FALSE }
2323

2424
public static void dropAndDeleteAll(GraphDatabaseService db) {
2525
db.executeTransactionally("MATCH (n) DETACH DELETE n");

0 commit comments

Comments
 (0)