From b538a7ca9ac2905a3a2de15a351a4215eb89021c Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Fri, 24 Oct 2025 22:59:35 +0200 Subject: [PATCH 1/9] adapted jnosql-tinkerpop for ArangoDB Tinkerpop provider --- jnosql-tinkerpop/pom.xml | 12 ++-- .../CommunicationEntityConverter.java | 7 ++- .../DefaultTinkerpopGraphDatabaseManager.java | 58 ++++++++++--------- .../TinkerpopGraphDatabaseManager.java | 3 + ...aultTinkerpopGraphDatabaseManagerTest.java | 50 ++++++++-------- .../communication/GraphSupplier.java | 12 +--- .../AbstractTinkerpopTemplateTest.java | 29 +++++----- .../mapping/DefaultEdgeTraversalTest.java | 2 +- .../mapping/DefaultVertexTraversalTest.java | 2 +- .../tinkerpop/mapping/EdgeEntityTest.java | 12 ++-- .../tinkerpop/mapping/GraphProducer.java | 27 ++------- .../mapping/MagazineTemplateTest.java | 7 +++ .../tinkerpop/mapping/entities/Creature.java | 7 +-- .../tinkerpop/mapping/entities/Human.java | 12 ++-- .../mapping/entities/HumanBuilder.java | 4 +- .../tinkerpop/mapping/entities/Magazine.java | 12 ++-- jnosql-tinkerpop/src/test/resources/adb.yaml | 10 ++++ .../test/resources/simplelogger.properties | 12 ++++ 18 files changed, 146 insertions(+), 132 deletions(-) create mode 100644 jnosql-tinkerpop/src/test/resources/adb.yaml create mode 100644 jnosql-tinkerpop/src/test/resources/simplelogger.properties diff --git a/jnosql-tinkerpop/pom.xml b/jnosql-tinkerpop/pom.xml index d9128c0aa..ffbd6325f 100644 --- a/jnosql-tinkerpop/pom.xml +++ b/jnosql-tinkerpop/pom.xml @@ -54,15 +54,15 @@ provided - org.apache.tinkerpop - neo4j-gremlin - ${tinkerpop.version} + com.arangodb + arangodb-tinkerpop-provider + 3.2.1 test - org.neo4j - neo4j-tinkerpop-api-impl - ${neo4j.connector.version} + org.slf4j + slf4j-simple + 1.7.25 test diff --git a/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/CommunicationEntityConverter.java b/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/CommunicationEntityConverter.java index 0396463db..d5e22b3c3 100644 --- a/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/CommunicationEntityConverter.java +++ b/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/CommunicationEntityConverter.java @@ -19,15 +19,16 @@ import java.util.function.Function; -public enum CommunicationEntityConverter implements Function{ - INSTANCE; +import static org.eclipse.jnosql.databases.tinkerpop.communication.TinkerpopGraphDatabaseManager.ID; +public enum CommunicationEntityConverter implements Function { + INSTANCE; @Override public CommunicationEntity apply(Vertex vertex) { var entity = CommunicationEntity.of(vertex.label()); vertex.properties().forEachRemaining(p -> entity.add(p.key(), p.value())); - entity.add(DefaultTinkerpopGraphDatabaseManager.ID_PROPERTY, vertex.id()); + entity.add(ID, vertex.id()); return entity; } } diff --git a/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManager.java b/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManager.java index 9a309e664..cd9393215 100644 --- a/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManager.java +++ b/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManager.java @@ -19,12 +19,14 @@ import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.eclipse.jnosql.communication.CommunicationException; import org.eclipse.jnosql.communication.ValueUtil; import org.eclipse.jnosql.communication.graph.CommunicationEdge; import org.eclipse.jnosql.communication.semistructured.CommunicationEntity; import org.eclipse.jnosql.communication.semistructured.DeleteQuery; +import org.eclipse.jnosql.communication.semistructured.Element; import org.eclipse.jnosql.communication.semistructured.SelectQuery; import java.time.Duration; @@ -52,7 +54,6 @@ */ public class DefaultTinkerpopGraphDatabaseManager implements TinkerpopGraphDatabaseManager { - public static final String ID_PROPERTY = "_id"; private final Graph graph; DefaultTinkerpopGraphDatabaseManager(Graph graph) { @@ -71,13 +72,8 @@ public String name() { @Override public CommunicationEntity insert(CommunicationEntity entity) { - Objects.requireNonNull(entity, "entity is required"); - Vertex vertex = graph.addVertex(entity.name()); - entity.elements().forEach(e -> vertex.property(e.name(), ValueUtil.convert(e.value()))); - entity.add(ID_PROPERTY, vertex.id()); - vertex.property(ID_PROPERTY, vertex.id()); - GraphTransactionUtil.transaction(graph); + addVertex(entity); return entity; } @@ -101,14 +97,16 @@ public Iterable insert(Iterable iterab @Override public CommunicationEntity update(CommunicationEntity entity) { Objects.requireNonNull(entity, "entity is required"); - entity.find(ID_PROPERTY).ifPresent(id -> { - Iterator vertices = graph.vertices(id.get()); - if(!vertices.hasNext()) { - throw new EmptyResultException("The entity does not exist with the id: " + id); - } - Vertex vertex = vertices.next(); - entity.elements().forEach(e -> vertex.property(e.name(), ValueUtil.convert(e.value()))); - }); + Object id = entity.find(ID).map(Element::get) + .orElseThrow(() -> new IllegalArgumentException("Entity must have an ID")); + Iterator vertices = graph.vertices(id); + if (!vertices.hasNext()) { + throw new EmptyResultException("The entity does not exist with the id: " + id); + } + Vertex vertex = vertices.next(); + entity.elements().stream() + .filter(it -> !ID.equals(it.name())) + .forEach(e -> vertex.property(e.name(), ValueUtil.convert(e.value()))); GraphTransactionUtil.transaction(graph); return entity; } @@ -198,11 +196,11 @@ public void remove(CommunicationEntity source, String label, CommunicationEntity Objects.requireNonNull(target, "target is required"); Objects.requireNonNull(label, "label is required"); - Vertex sourceVertex = findVertexById(source.find(ID_PROPERTY) + Vertex sourceVertex = findVertexById(source.find(ID) .orElseThrow(() -> new CommunicationException("Source entity must have an ID")).get()) .orElseThrow(() -> new EmptyResultException("Source entity not found")); - Vertex targetVertex = findVertexById(target.find(ID_PROPERTY) + Vertex targetVertex = findVertexById(target.find(ID) .orElseThrow(() -> new CommunicationException("Target entity must have an ID")).get()) .orElseThrow(() -> new EmptyResultException("Target entity not found")); @@ -241,10 +239,10 @@ public Optional findEdgeById(K id) { var edge = traversal.next(); var source = CommunicationEntity.of(edge.outVertex().label()); - source.add(ID_PROPERTY, edge.outVertex().id()); + source.add(ID, edge.outVertex().id()); var target = CommunicationEntity.of(edge.inVertex().label()); - target.add(ID_PROPERTY, edge.inVertex().id()); + target.add(ID, edge.inVertex().id()); Map properties = new HashMap<>(); edge.properties().forEachRemaining(p -> properties.put(p.key(), p.value())); @@ -252,16 +250,22 @@ public Optional findEdgeById(K id) { return Optional.of(new TinkerpopCommunicationEdge(id, source, target, edge.label(), properties)); } + private Vertex addVertex(CommunicationEntity entity) { + Object[] args = Stream.concat( + Stream.of(T.label, entity.name()), + entity.elements().stream().flatMap(it -> ID.equals(it.name()) ? + Stream.of(T.id, it.get()) : + Stream.of(it.name(), ValueUtil.convert(it.value()))) + ).toArray(); + Vertex vertex = graph.addVertex(args); + entity.add(ID, vertex.id()); + return vertex; + } + private Vertex findOrCreateVertex(CommunicationEntity entity) { - return entity.find(ID_PROPERTY) + return entity.find(ID) .flatMap(id -> findVertexById(id.get())) - .orElseGet(() -> { - var newVertex = graph.addVertex(entity.name()); - entity.elements().forEach(e -> newVertex.property(e.name(), ValueUtil.convert(e.value()))); - newVertex.property(ID_PROPERTY, newVertex.id()); - entity.add(ID_PROPERTY, newVertex.id()); - return newVertex; - }); + .orElseGet(() -> addVertex(entity)); } private Optional findVertexById(Object id) { diff --git a/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/TinkerpopGraphDatabaseManager.java b/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/TinkerpopGraphDatabaseManager.java index ddaf5d175..5007ee681 100644 --- a/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/TinkerpopGraphDatabaseManager.java +++ b/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/TinkerpopGraphDatabaseManager.java @@ -15,6 +15,7 @@ package org.eclipse.jnosql.databases.tinkerpop.communication; import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.T; import org.eclipse.jnosql.communication.graph.GraphDatabaseManager; import org.eclipse.jnosql.communication.semistructured.DatabaseManager; @@ -35,6 +36,8 @@ */ public interface TinkerpopGraphDatabaseManager extends GraphDatabaseManager, Supplier { + String ID = T.id.getAccessor(); + /** * Creates a new instance of DefaultGraphDatabaseManager with the specified TinkerPop Graph. * diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java index 0e62930c7..00c6839e8 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java @@ -42,6 +42,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.jnosql.communication.semistructured.DeleteQuery.delete; import static org.eclipse.jnosql.communication.semistructured.SelectQuery.select; +import static org.eclipse.jnosql.databases.tinkerpop.communication.TinkerpopGraphDatabaseManager.ID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -50,7 +51,7 @@ class DefaultTinkerpopGraphDatabaseManagerTest { - public static final String COLLECTION_NAME = "person"; + public static final String COLLECTION_NAME = "Person"; private TinkerpopGraphDatabaseManager entityManager; @@ -80,7 +81,7 @@ void shouldInsertEntity(){ SoftAssertions.assertSoftly(softly -> { softly.assertThat(communicationEntity.find("name", String.class)).get().isEqualTo(name); softly.assertThat(communicationEntity.find("age", int.class)).get().isEqualTo(age); - softly.assertThat(communicationEntity.find(DefaultTinkerpopGraphDatabaseManager.ID_PROPERTY)).isPresent(); + softly.assertThat(communicationEntity.find(ID)).isPresent(); }); } @@ -106,11 +107,11 @@ void shouldInsertEntities(){ softly.assertThat(communicationEntities).hasSize(2); softly.assertThat(communicationEntities.get(0).find("name", String.class)).get().isEqualTo(name); softly.assertThat(communicationEntities.get(0).find("age", int.class)).get().isEqualTo(age); - softly.assertThat(communicationEntities.get(0).find(DefaultTinkerpopGraphDatabaseManager.ID_PROPERTY)).isPresent(); + softly.assertThat(communicationEntities.get(0).find(ID)).isPresent(); softly.assertThat(communicationEntities.get(1).find("name", String.class)).get().isEqualTo(name2); softly.assertThat(communicationEntities.get(1).find("age", int.class)).get().isEqualTo(age2); - softly.assertThat(communicationEntities.get(1).find(DefaultTinkerpopGraphDatabaseManager.ID_PROPERTY)).isPresent(); + softly.assertThat(communicationEntities.get(1).find(ID)).isPresent(); }); } @@ -119,7 +120,7 @@ void shouldInsertEntities(){ void shouldInsert() { var entity = getEntity(); var documentEntity = entityManager.insert(entity); - assertTrue(documentEntity.elements().stream().map(Element::name).anyMatch(s -> s.equals("_id"))); + assertTrue(documentEntity.elements().stream().map(Element::name).anyMatch(s -> s.equals(ID))); } @Test @@ -142,11 +143,11 @@ void shouldUpdate() { void shouldRemoveEntity() { var documentEntity = entityManager.insert(getEntity()); - Optional id = documentEntity.find("_id"); + Optional id = documentEntity.find(ID); var query = select().from(COLLECTION_NAME) - .where("_id").eq(id.orElseThrow().get()) + .where(ID).eq(id.orElseThrow().get()) .build(); - var deleteQuery = delete().from(COLLECTION_NAME).where("_id") + var deleteQuery = delete().from(COLLECTION_NAME).where(ID) .eq(id.get().get()) .build(); @@ -157,10 +158,10 @@ void shouldRemoveEntity() { @Test void shouldFindDocument() { var entity = entityManager.insert(getEntity()); - Optional id = entity.find("_id"); + Optional id = entity.find(ID); var query = select().from(COLLECTION_NAME) - .where("_id").eq(id.orElseThrow().get()) + .where(ID).eq(id.orElseThrow().get()) .build(); var entities = entityManager.select(query).collect(Collectors.toList()); @@ -171,11 +172,12 @@ void shouldFindDocument() { @Test void shouldFindDocument2() { var entity = entityManager.insert(getEntity()); - Optional id = entity.find("_id"); + Optional id = entity.find(ID); var query = select().from(COLLECTION_NAME) .where("name").eq("Poliana") - .and("city").eq("Salvador").and("_id").eq(id.orElseThrow().get()) + .and("city").eq("Salvador") + .and(ID).eq(id.orElseThrow().get()) .build(); List entities = entityManager.select(query).collect(Collectors.toList()); @@ -186,11 +188,11 @@ void shouldFindDocument2() { @Test void shouldFindDocument3() { var entity = entityManager.insert(getEntity()); - Optional id = entity.find("_id"); + Optional id = entity.find(ID); var query = select().from(COLLECTION_NAME) .where("name").eq("Poliana") .or("city").eq("Salvador") - .and(id.orElseThrow().name()).eq(id.get().get()) + .and(ID).eq(id.orElseThrow().get()) .build(); List entities = entityManager.select(query).collect(Collectors.toList()); @@ -426,7 +428,7 @@ void shouldFindAllByFields() { assertEquals(3, entity.size()); SoftAssertions.assertSoftly(softly -> { softly.assertThat(entity.find("name")).isPresent(); - softly.assertThat(entity.find("_id")).isPresent(); + softly.assertThat(entity.find(ID)).isPresent(); softly.assertThat(entity.find("city")).isPresent(); }); } @@ -436,15 +438,15 @@ void shouldCreateEdge() { var person1 = entityManager.insert(getEntity()); var person2 = entityManager.insert(getEntity()); - String label = "FRIEND"; + String label = "friend"; Map properties = Map.of("since", 2023); var edge = entityManager.edge(person1, label, person2, properties); assertNotNull(edge); assertEquals(label, edge.label()); - assertEquals(person1.find("_id").orElseThrow().get(), edge.source().find("_id").orElseThrow().get()); - assertEquals(person2.find("_id").orElseThrow().get(), edge.target().find("_id").orElseThrow().get()); + assertEquals(person1.find(ID).orElseThrow().get(), edge.source().find(ID).orElseThrow().get()); + assertEquals(person2.find(ID).orElseThrow().get(), edge.target().find(ID).orElseThrow().get()); assertEquals(properties, edge.properties()); } @@ -453,9 +455,9 @@ void shouldRemoveEdge() { var person1 = entityManager.insert(getEntity()); var person2 = entityManager.insert(getEntity()); - CommunicationEdge communicationEdge = entityManager.edge(person1, "FRIEND", person2, Map.of()); + CommunicationEdge communicationEdge = entityManager.edge(person1, "friend", person2, Map.of()); - entityManager.remove(person1, "FRIEND", person2); + entityManager.remove(person1, "friend", person2); var edges = entityManager.findEdgeById(communicationEdge.id()); @@ -467,7 +469,7 @@ void shouldDeleteEdgeById() { var person1 = entityManager.insert(getEntity()); var person2 = entityManager.insert(getEntity()); - var edge = entityManager.edge(person1, "FRIEND", person2, Map.of()); + var edge = entityManager.edge(person1, "friend", person2, Map.of()); entityManager.deleteEdge(edge.id()); @@ -480,15 +482,15 @@ void shouldFindEdgeById() { var person1 = entityManager.insert(getEntity()); var person2 = entityManager.insert(getEntity()); - var edge = entityManager.edge(person1, "FRIEND", person2, Map.of("since", 2023)); + var edge = entityManager.edge(person1, "friend", person2, Map.of("since", 2023)); Optional foundEdge = entityManager.findEdgeById(edge.id()); assertTrue(foundEdge.isPresent()); assertEquals(edge.id(), foundEdge.get().id()); assertEquals(edge.label(), foundEdge.get().label()); - assertEquals(edge.source().find("_id").orElseThrow().get(), foundEdge.get().source().find("_id").orElseThrow().get()); - assertEquals(edge.target().find("_id").orElseThrow().get(), foundEdge.get().target().find("_id").orElseThrow().get()); + assertEquals(edge.source().find(ID).orElseThrow().get(), foundEdge.get().source().find(ID).orElseThrow().get()); + assertEquals(edge.target().find(ID).orElseThrow().get(), foundEdge.get().target().find(ID).orElseThrow().get()); } @Test diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java index dcf55743b..9f7a64c8b 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java @@ -14,32 +14,26 @@ */ package org.eclipse.jnosql.databases.tinkerpop.communication; -import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph; import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.util.GraphFactory; -import java.io.File; import java.util.function.Supplier; import java.util.logging.Logger; -import static java.lang.System.currentTimeMillis; - public enum GraphSupplier implements Supplier { INSTANCE; private static final Logger LOGGER = Logger.getLogger(GraphSupplier.class.getName()); - private final String directory; - private final Graph graph; { - this.directory = new File("").getAbsolutePath() + "/target/jnosql-communication-graph/" + currentTimeMillis() + "/"; - graph = Neo4jGraph.open(directory); + graph = GraphFactory.open("src/test/resources/adb.yaml"); } @Override public Graph get() { - LOGGER.info("Starting Graph database at directory: " + directory); + LOGGER.info("Starting Graph database"); return graph; } } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/AbstractTinkerpopTemplateTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/AbstractTinkerpopTemplateTest.java index 295956616..ee84d2813 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/AbstractTinkerpopTemplateTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/AbstractTinkerpopTemplateTest.java @@ -42,6 +42,7 @@ import static java.util.stream.Collectors.toList; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assume.assumeTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -119,7 +120,7 @@ void shouldMergeOnInsert() { @Test void shouldGetErrorWhenIdIsNullWhenUpdate() { - assertThrows(EmptyResultException.class, () -> { + assertThrows(IllegalArgumentException.class, () -> { Human human = Human.builder().withAge() .withName("Otavio").build(); getGraphTemplate().update(human); @@ -130,7 +131,7 @@ void shouldGetErrorWhenIdIsNullWhenUpdate() { void shouldGetErrorWhenEntityIsNotSavedYet() { assertThrows(EmptyResultException.class, () -> { Human human = Human.builder().withAge() - .withId(10L) + .withId("10L") .withName("Otavio").build(); getGraphTemplate().update(human); @@ -212,7 +213,7 @@ void shouldFindAnEntity() { @Test void shouldNotFindAnEntity() { - Optional personFound = getGraphTemplate().find(0L); + Optional personFound = getGraphTemplate().find("0L"); assertFalse(personFound.isPresent()); } @@ -275,12 +276,12 @@ void shouldReturnErrorWhenGetEdgesIdHasNullId() { @Test void shouldReturnErrorWhenGetEdgesIdHasNullDirection() { - assertThrows(NullPointerException.class, () -> getGraphTemplate().edgesById(10, null)); + assertThrows(NullPointerException.class, () -> getGraphTemplate().edgesById("10", null)); } @Test void shouldReturnEmptyWhenVertexDoesNotExist() { - Collection edges = getGraphTemplate().edgesById(10, Direction.BOTH); + Collection edges = getGraphTemplate().edgesById("10", Direction.BOTH); assertTrue(edges.isEmpty()); } @@ -349,7 +350,7 @@ void shouldReturnErrorWhenGetEdgesHasNullId() { @Test void shouldReturnErrorWhenGetEdgesHasNullId2() { - Human otavio = Human.builder().withId(0L).withAge().withName("Otavio").build(); + Human otavio = Human.builder().withId("0L").withAge().withName("Otavio").build(); Collection edges = getGraphTemplate().edges(otavio, Direction.BOTH); assertThat(edges).isEmpty(); } @@ -365,7 +366,7 @@ void shouldReturnErrorWhenGetEdgesHasNullDirection() { @Test void shouldReturnEmptyWhenEntityDoesNotExist() { - Human otavio = Human.builder().withAge().withName("Otavio").withId(10L).build(); + Human otavio = Human.builder().withAge().withName("Otavio").withId("10L").build(); Collection edges = getGraphTemplate().edges(otavio, Direction.BOTH); assertTrue(edges.isEmpty()); } @@ -399,6 +400,7 @@ void shouldReturnEdges() { @Test void shouldGetTransaction() { + assumeTrue("transactions not supported", getGraph().features().graph().supportsTransactions()); Transaction transaction = getGraphTemplate().transaction(); assertNotNull(transaction); } @@ -430,7 +432,7 @@ void shouldExecuteQueryWithParameter() { @Test void shouldReturnEmpty() { - Optional person = getGraphTemplate().gremlinSingleResult("g.V().hasLabel('Person')"); + Optional person = getGraphTemplate().gremlinSingleResult("g.V().hasLabel('person')"); assertFalse(person.isPresent()); } @@ -541,8 +543,7 @@ void shouldDeleteAll() { @Test void shouldReturnEmptyWhenFindByIdNotFound() { - - final Optional person = getGraphTemplate().find(Human.class, -2L); + final Optional person = getGraphTemplate().find(Human.class, "-2L"); assertNotNull(person); assertFalse(person.isPresent()); } @@ -567,12 +568,12 @@ void shouldCreateEdgeByGraphAPI() { final Human poliana = getGraphTemplate().insert(Human.builder().withAge() .withName("Poliana").build()); - var edge = org.eclipse.jnosql.mapping.graph.Edge.source(otavio).label("LOVES").target(poliana).build(); + var edge = org.eclipse.jnosql.mapping.graph.Edge.source(otavio).label("loves").target(poliana).build(); var edgeEntity = getGraphTemplate().edge(edge); SoftAssertions.assertSoftly(softly -> { softly.assertThat(edgeEntity).isNotNull(); - softly.assertThat(edgeEntity.label()).isEqualTo("LOVES"); + softly.assertThat(edgeEntity.label()).isEqualTo("loves"); softly.assertThat(edgeEntity.source()).isEqualTo(otavio); softly.assertThat(edgeEntity.target()).isEqualTo(poliana); }); @@ -587,7 +588,7 @@ void shouldCreateEdgeByGraphAPIWithProperties() { .withName("Poliana").build()); var edge = org.eclipse.jnosql.mapping.graph.Edge.source(otavio) - .label("LOVES") + .label("loves") .target(poliana) .property("when", "2017") .property("where", "Brazil") @@ -596,7 +597,7 @@ void shouldCreateEdgeByGraphAPIWithProperties() { SoftAssertions.assertSoftly(softly -> { softly.assertThat(edgeEntity).isNotNull(); - softly.assertThat(edgeEntity.label()).isEqualTo("LOVES"); + softly.assertThat(edgeEntity.label()).isEqualTo("loves"); softly.assertThat(edgeEntity.source()).isEqualTo(otavio); softly.assertThat(edgeEntity.target()).isEqualTo(poliana); softly.assertThat(edgeEntity.properties()).hasSize(2); diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultEdgeTraversalTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultEdgeTraversalTest.java index 296829c1f..310675a22 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultEdgeTraversalTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultEdgeTraversalTest.java @@ -489,7 +489,7 @@ void shouldReturnErrorWhenThereAreMoreThanOneInGetSingleResult() { @Test void shouldReturnOptionalEmptyWhenThereIsNotResultInSingleResult() { - Optional entity = tinkerpopTemplate.traversalEdge(-1L).singleResult(); + Optional entity = tinkerpopTemplate.traversalEdge("-1L").singleResult(); assertFalse(entity.isPresent()); } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultVertexTraversalTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultVertexTraversalTest.java index 11dfeea01..04bd02886 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultVertexTraversalTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultVertexTraversalTest.java @@ -100,7 +100,7 @@ void shouldNext() { @Test void shouldEmptyNext() { - Optional next = tinkerpopTemplate.traversalVertex(-12).next(); + Optional next = tinkerpopTemplate.traversalVertex("-12").next(); assertFalse(next.isPresent()); } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/EdgeEntityTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/EdgeEntityTest.java index 67fcbb453..3fd796e9f 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/EdgeEntityTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/EdgeEntityTest.java @@ -83,7 +83,7 @@ void shouldReturnErrorWhenLabelIsNull() { @Test void shouldReturnNullWhenInboundIdIsNull() { Assertions.assertThrows(EmptyResultException.class, () -> { - Human human = Human.builder().withId(-5).withName("Poliana").withAge().build(); + Human human = Human.builder().withId("-5").withName("Poliana").withAge().build(); Magazine magazine = tinkerpopTemplate.insert(Magazine.builder().withAge(2007).withName("The Shack").build()); tinkerpopTemplate.edge(human, "reads", magazine); }); @@ -102,7 +102,7 @@ void shouldReturnNullWhenOutboundIdIsNull() { @Test void shouldReturnEntityNotFoundWhenOutBoundDidNotFound() { Assertions.assertThrows( EmptyResultException.class, () -> { - Human human = Human.builder().withId(-10L).withName("Poliana").withAge().build(); + Human human = Human.builder().withId("-10L").withName("Poliana").withAge().build(); Magazine magazine = tinkerpopTemplate.insert(Magazine.builder().withAge(2007).withName("The Shack").build()); tinkerpopTemplate.edge(human, "reads", magazine); }); @@ -112,7 +112,7 @@ void shouldReturnEntityNotFoundWhenOutBoundDidNotFound() { void shouldReturnEntityNotFoundWhenInBoundDidNotFound() { Assertions.assertThrows( EmptyResultException.class, () -> { Human human = tinkerpopTemplate.insert(Human.builder().withName("Poliana").withAge().build()); - Magazine magazine = Magazine.builder().withId(10L).withAge(2007).withName("The Shack").build(); + Magazine magazine = Magazine.builder().withId("10L").withAge(2007).withName("The Shack").build(); tinkerpopTemplate.edge(human, "reads", magazine); }); } @@ -141,10 +141,10 @@ void shouldGetId() { assertEquals(magazine, edge.incoming()); assertTrue(edge.isEmpty()); assertNotNull(edge.id()); - final Long id = edge.id(Long.class); + final String id = edge.id(String.class); assertNotNull(id); - assertEquals(id, edge.id(Integer.class).longValue()); + assertEquals(id, edge.id(String.class)); } @@ -352,7 +352,7 @@ void shouldFindAnEdge() { @Test void shouldNotFindAnEdge() { - Optional edgeEntity = tinkerpopTemplate.edge(-12L); + Optional edgeEntity = tinkerpopTemplate.edge("-12L"); assertFalse(edgeEntity.isPresent()); } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java index e93101c3f..544741264 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java @@ -21,23 +21,17 @@ import jakarta.enterprise.inject.Disposes; import jakarta.enterprise.inject.Produces; import jakarta.interceptor.Interceptor; -import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.util.GraphFactory; import org.eclipse.jnosql.mapping.Database; import org.eclipse.jnosql.mapping.DatabaseType; import org.mockito.Mockito; -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Collections; -import java.util.Comparator; import java.util.function.Supplier; import java.util.logging.Logger; -import static java.lang.System.currentTimeMillis; import static java.util.Collections.singleton; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -51,13 +45,9 @@ public class GraphProducer implements Supplier { private Graph graph; - private String directory; - @PostConstruct public void init() { - this.directory = new File("").getAbsolutePath() + "/target/jnosql-graph/" + currentTimeMillis() + "/"; - LOGGER.info("Starting Graph database at directory: " + directory); - this.graph = Neo4jGraph.open(directory); + graph = GraphFactory.open("src/test/resources/adb.yaml"); LOGGER.info("Graph database created"); } @@ -77,8 +67,8 @@ public Graph getGraphMock() { Graph graphMock = mock(Graph.class); Vertex vertex = mock(Vertex.class); when(vertex.label()).thenReturn("Person"); - when(vertex.id()).thenReturn(10L); - when(graphMock.vertices(10L)).thenReturn(Collections.emptyIterator()); + when(vertex.id()).thenReturn("10L"); + when(graphMock.vertices("10L")).thenReturn(Collections.emptyIterator()); when(vertex.keys()).thenReturn(singleton("name")); when(vertex.value("name")).thenReturn("nameMock"); when(graphMock.addVertex(Mockito.anyString())).thenReturn(vertex); @@ -89,15 +79,6 @@ public Graph getGraphMock() { public void dispose(@Disposes Graph graph) throws Exception { LOGGER.info("Graph database closing"); graph.close(); - final Path path = Paths.get(directory); - if (Files.exists(path)) { - LOGGER.info("Removing directory graph database: " + directory); - Files.walk(path) - .sorted(Comparator.reverseOrder()) - .map(Path::toFile) - .forEach(File::delete); - LOGGER.info("Graph directory exists?: " + Files.exists(path)); - } LOGGER.info("Graph Database closed"); } } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/MagazineTemplateTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/MagazineTemplateTest.java index bc5bbcf22..05ac3e04d 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/MagazineTemplateTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/MagazineTemplateTest.java @@ -34,6 +34,7 @@ import static org.apache.tinkerpop.gremlin.structure.Transaction.Status.COMMIT; import static org.apache.tinkerpop.gremlin.structure.Transaction.Status.ROLLBACK; +import static org.junit.Assume.assumeTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; @@ -53,6 +54,8 @@ class MagazineTemplateTest { @Test void shouldSaveWithTransaction() { + assumeTrue("transactions not supported", graph.features().graph().supportsTransactions()); + AtomicReference status = new AtomicReference<>(); Magazine magazine = Magazine.builder().withName("The Book").build(); @@ -65,6 +68,8 @@ void shouldSaveWithTransaction() { @Test void shouldSaveWithRollback() { + assumeTrue("transactions not supported", graph.features().graph().supportsTransactions()); + AtomicReference status = new AtomicReference<>(); Magazine magazine = Magazine.builder().withName("The Book").build(); @@ -83,6 +88,8 @@ void shouldSaveWithRollback() { @Test void shouldUseAutomaticNormalTransaction() { + assumeTrue("transactions not supported", graph.features().graph().supportsTransactions()); + AtomicReference status = new AtomicReference<>(); Magazine magazine = Magazine.builder().withName("The Book").build(); diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Creature.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Creature.java index 40fef8e77..f34383769 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Creature.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Creature.java @@ -23,9 +23,8 @@ @Entity public class Creature { - - @Id - private Long id; + @Id("~id") + private String id; @Column private String name; @@ -37,7 +36,7 @@ public Creature(String name) { this.name = name; } - public Long getId() { + public String getId() { return id; } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Human.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Human.java index 0667fcfce..8603d9556 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Human.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Human.java @@ -27,8 +27,8 @@ @MappedSuperclass public class Human { - @Id - private Long id; + @Id("~id") + private String id; @Column private String name; @@ -42,7 +42,7 @@ public class Human { private String ignore; - public Long getId() { + public String getId() { return id; } @@ -69,7 +69,7 @@ public boolean isAdult() { Human() { } - Human(Long id, String name, int age, List phones, String ignore) { + Human(String id, String name, int age, List phones, String ignore) { this.id = id; this.name = name; this.age = age; @@ -79,7 +79,7 @@ public boolean isAdult() { @Override public String toString() { - return "Person{" + "id=" + id + + return "Human{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", phones=" + phones + @@ -96,7 +96,7 @@ public boolean equals(Object o) { return false; } Human human = (Human) o; - return id == human.id && + return Objects.equals(id, human.id) && age == human.age && Objects.equals(name, human.name) && Objects.equals(phones, human.phones); diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/HumanBuilder.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/HumanBuilder.java index 7caaf886d..206d57993 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/HumanBuilder.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/HumanBuilder.java @@ -17,13 +17,13 @@ import java.util.List; public class HumanBuilder { - private Long id; + private String id; private String name; private int age; private List phones; private String ignore; - public HumanBuilder withId(long id) { + public HumanBuilder withId(String id) { this.id = id; return this; } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Magazine.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Magazine.java index 07d03ed95..670ae74fc 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Magazine.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/entities/Magazine.java @@ -23,8 +23,8 @@ @Entity public class Magazine { - @Id - private Long id; + @Id("~id") + private String id; @Column private String name; @@ -36,13 +36,13 @@ public class Magazine { Magazine() { } - Magazine(Long id, String name, Integer age) { + Magazine(String id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } - public Long getId() { + public String getId() { return id; } @@ -86,7 +86,7 @@ public static MagazineBuilder builder() { public static class MagazineBuilder { private String name; private Integer age; - private Long id; + private String id; private MagazineBuilder() { } @@ -101,7 +101,7 @@ public MagazineBuilder withAge(Integer age) { return this; } - public MagazineBuilder withId(Long id) { + public MagazineBuilder withId(String id) { this.id = id; return this; } diff --git a/jnosql-tinkerpop/src/test/resources/adb.yaml b/jnosql-tinkerpop/src/test/resources/adb.yaml new file mode 100644 index 000000000..4dbf67cad --- /dev/null +++ b/jnosql-tinkerpop/src/test/resources/adb.yaml @@ -0,0 +1,10 @@ +gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + graph: + enableDataDefinition: true + driver: + password: "test" + hosts: + - "172.28.0.1:8529" diff --git a/jnosql-tinkerpop/src/test/resources/simplelogger.properties b/jnosql-tinkerpop/src/test/resources/simplelogger.properties new file mode 100644 index 000000000..fff7a68b0 --- /dev/null +++ b/jnosql-tinkerpop/src/test/resources/simplelogger.properties @@ -0,0 +1,12 @@ +org.slf4j.simpleLogger.logFile=System.out +org.slf4j.simpleLogger.showDateTime=true +org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss.SSS +org.slf4j.simpleLogger.showThreadName=true +org.slf4j.simpleLogger.showLogName=true +org.slf4j.simpleLogger.showShortLogName=false + +org.slf4j.simpleLogger.defaultLogLevel=info +org.slf4j.simpleLogger.log.org.testcontainers=warn + +## ArangoDB communication debug level +org.slf4j.simpleLogger.log.com.arangodb.internal.net.Communication=debug From 14444213cb77c5ef86dfb3b721ac6599ccb195e1 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Mon, 27 Oct 2025 12:16:27 +0100 Subject: [PATCH 2/9] start db with test containers --- .../communication/GraphSupplier.java | 23 +++++++++++++++---- .../tinkerpop/mapping/GraphProducer.java | 4 ++-- jnosql-tinkerpop/src/test/resources/adb.yaml | 10 -------- 3 files changed, 20 insertions(+), 17 deletions(-) delete mode 100644 jnosql-tinkerpop/src/test/resources/adb.yaml diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java index 9f7a64c8b..b3d5f1f0b 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java @@ -14,8 +14,12 @@ */ package org.eclipse.jnosql.databases.tinkerpop.communication; +import org.apache.commons.configuration2.BaseConfiguration; +import org.apache.commons.configuration2.Configuration; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.util.GraphFactory; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; import java.util.function.Supplier; import java.util.logging.Logger; @@ -23,17 +27,26 @@ public enum GraphSupplier implements Supplier { INSTANCE; - private static final Logger LOGGER = Logger.getLogger(GraphSupplier.class.getName()); - - private final Graph graph; + private final GenericContainer arangodb = + new GenericContainer<>("arangodb/arangodb:latest") + .withExposedPorts(8529) + .withEnv("ARANGO_NO_AUTH", "1") + .waitingFor(Wait.forHttp("/") + .forStatusCode(200)); { - graph = GraphFactory.open("src/test/resources/adb.yaml"); + arangodb.start(); } + private static final Logger LOGGER = Logger.getLogger(GraphSupplier.class.getName()); + @Override public Graph get() { LOGGER.info("Starting Graph database"); - return graph; + Configuration configuration = new BaseConfiguration(); + configuration.addProperty("gremlin.graph", "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph"); + configuration.addProperty("gremlin.arangodb.conf.graph.enableDataDefinition", true); + configuration.addProperty("gremlin.arangodb.conf.driver.hosts", arangodb.getHost() + ":" + arangodb.getFirstMappedPort()); + return GraphFactory.open(configuration); } } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java index 544741264..c83193460 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java @@ -23,7 +23,7 @@ import jakarta.interceptor.Interceptor; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; -import org.apache.tinkerpop.gremlin.structure.util.GraphFactory; +import org.eclipse.jnosql.databases.tinkerpop.communication.GraphSupplier; import org.eclipse.jnosql.mapping.Database; import org.eclipse.jnosql.mapping.DatabaseType; import org.mockito.Mockito; @@ -47,7 +47,7 @@ public class GraphProducer implements Supplier { @PostConstruct public void init() { - graph = GraphFactory.open("src/test/resources/adb.yaml"); + graph = GraphSupplier.INSTANCE.get(); LOGGER.info("Graph database created"); } diff --git a/jnosql-tinkerpop/src/test/resources/adb.yaml b/jnosql-tinkerpop/src/test/resources/adb.yaml deleted file mode 100644 index 4dbf67cad..000000000 --- a/jnosql-tinkerpop/src/test/resources/adb.yaml +++ /dev/null @@ -1,10 +0,0 @@ -gremlin: - graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" - arangodb: - conf: - graph: - enableDataDefinition: true - driver: - password: "test" - hosts: - - "172.28.0.1:8529" From 5a5fa0eb8d677ef8c8622616e820a22fc1fdeaf8 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Mon, 27 Oct 2025 23:56:25 +0100 Subject: [PATCH 3/9] added Neo4j and TinkerGraph to the test matrix --- jnosql-tinkerpop/pom.xml | 37 +++++++++ .../tinkerpop/cdi/TestGraphSupplier.java | 76 +++++++++++++++++++ .../cdi/arangodb/ArangoDBGraphProducer.java | 59 ++++++++++++++ .../mock/MockGraphProducer.java} | 37 +-------- .../cdi/neo4j/Neo4jGraphProducer.java | 59 ++++++++++++++ .../cdi/tinkergraph/TinkerGraphProducer.java | 46 +++++++++++ ...aultTinkerpopGraphDatabaseManagerTest.java | 30 ++++++-- .../communication/GraphSupplier.java | 52 ------------- .../AbstractTinkerpopTemplateTest.java | 10 +-- .../mapping/DefaultEdgeTraversalTest.java | 20 ++++- ...faultGraphTraversalSourceTemplateTest.java | 19 ++++- .../DefaultTinkerpopTemplateProducerTest.java | 3 +- .../mapping/DefaultValueMapTraversalTest.java | 17 ++++- .../mapping/DefaultVertexTraversalTest.java | 18 ++++- .../tinkerpop/mapping/EdgeEntityTest.java | 23 ++++-- .../tinkerpop/mapping/GraphTemplateTest.java | 18 ++++- .../mapping/MagazineTemplateTest.java | 18 ++++- .../tinkerpop/mapping/PopulationTest.java | 19 ++++- .../TinkerpopTemplateProducerTest.java | 3 +- .../mapping/TinkerpopTemplateTest.java | 3 +- .../configuration/GraphSupplierTest.java | 2 - .../mapping/spi/TinkerpopExtensionTest.java | 9 +-- .../test/resources/simplelogger.properties | 2 +- 23 files changed, 448 insertions(+), 132 deletions(-) create mode 100644 jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java create mode 100644 jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/arangodb/ArangoDBGraphProducer.java rename jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/{mapping/GraphProducer.java => cdi/mock/MockGraphProducer.java} (64%) create mode 100644 jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/neo4j/Neo4jGraphProducer.java create mode 100644 jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/tinkergraph/TinkerGraphProducer.java delete mode 100644 jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java diff --git a/jnosql-tinkerpop/pom.xml b/jnosql-tinkerpop/pom.xml index ffbd6325f..94f7f5e19 100644 --- a/jnosql-tinkerpop/pom.xml +++ b/jnosql-tinkerpop/pom.xml @@ -53,6 +53,30 @@ ${tinkerpop.version} provided + + org.apache.tinkerpop + neo4j-gremlin + ${tinkerpop.version} + test + + + org.neo4j + neo4j-tinkerpop-api-impl + ${neo4j.connector.version} + test + + + org.slf4j + slf4j-nop + + + + + org.apache.tinkerpop + tinkergraph-gremlin + ${tinkerpop.version} + provided + com.arangodb arangodb-tinkerpop-provider @@ -69,6 +93,19 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + + + + + + org.antlr antlr4-maven-plugin diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java new file mode 100644 index 000000000..98e8a0c27 --- /dev/null +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2022 Contributors to the Eclipse Foundation + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. + * + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * + * Otavio Santana + * Michele Rastelli + */ +package org.eclipse.jnosql.databases.tinkerpop.cdi; + +import com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph; +import org.apache.commons.configuration2.BaseConfiguration; +import org.apache.commons.configuration2.Configuration; +import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.util.GraphFactory; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; + +import java.io.File; +import java.util.function.Supplier; +import java.util.logging.Logger; + +import static java.lang.System.currentTimeMillis; + +public enum TestGraphSupplier implements Supplier { + + NEO4J { + private static final Logger LOGGER = Logger.getLogger(TestGraphSupplier.class.getName()); + + @Override + public Graph get() { + String directory = new File("").getAbsolutePath() + "/target/neo4j-graph/" + currentTimeMillis(); + LOGGER.info("Starting Neo4j at directory: " + directory); + return Neo4jGraph.open(directory); + } + }, + + ARANGODB { + private final GenericContainer arangodb = + new GenericContainer<>("arangodb/arangodb:latest") + .withExposedPorts(8529) + .withEnv("ARANGO_NO_AUTH", "1") + .waitingFor(Wait.forHttp("/") + .forStatusCode(200)); + + { + arangodb.start(); + } + + @Override + public Graph get() { + Configuration configuration = new BaseConfiguration(); + configuration.addProperty("gremlin.graph", ArangoDBGraph.class.getName()); + configuration.addProperty("gremlin.arangodb.conf.graph.enableDataDefinition", true); + configuration.addProperty("gremlin.arangodb.conf.driver.hosts", arangodb.getHost() + ":" + arangodb.getFirstMappedPort()); + return GraphFactory.open(configuration); + } + }, + + TINKER_GRAPH { + @Override + public Graph get() { + return TinkerGraph.open(); + } + } + +} diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/arangodb/ArangoDBGraphProducer.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/arangodb/ArangoDBGraphProducer.java new file mode 100644 index 000000000..6919f1a34 --- /dev/null +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/arangodb/ArangoDBGraphProducer.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022 Contributors to the Eclipse Foundation + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. + * + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * + * Otavio Santana + * Michele Rastelli + */ +package org.eclipse.jnosql.databases.tinkerpop.cdi.arangodb; + +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Priority; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Alternative; +import jakarta.enterprise.inject.Disposes; +import jakarta.enterprise.inject.Produces; +import jakarta.interceptor.Interceptor; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.eclipse.jnosql.databases.tinkerpop.cdi.TestGraphSupplier; + +import java.util.function.Supplier; +import java.util.logging.Logger; + +@ApplicationScoped +@Alternative +@Priority(Interceptor.Priority.APPLICATION) +public class ArangoDBGraphProducer implements Supplier { + + private static final Logger LOGGER = Logger.getLogger(ArangoDBGraphProducer.class.getName()); + + private Graph graph; + + @PostConstruct + public void init() { + graph = TestGraphSupplier.ARANGODB.get(); + LOGGER.info("Graph database created"); + } + + @Produces + @ApplicationScoped + @Override + public Graph get() { + return graph; + } + + public void dispose(@Disposes Graph graph) throws Exception { + LOGGER.info("Graph database closing"); + graph.close(); + LOGGER.info("Graph Database closed"); + } + +} diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/mock/MockGraphProducer.java similarity index 64% rename from jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java rename to jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/mock/MockGraphProducer.java index c83193460..97099c958 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphProducer.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/mock/MockGraphProducer.java @@ -12,25 +12,20 @@ * * Otavio Santana */ -package org.eclipse.jnosql.databases.tinkerpop.mapping; +package org.eclipse.jnosql.databases.tinkerpop.cdi.mock; -import jakarta.annotation.PostConstruct; import jakarta.annotation.Priority; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Alternative; -import jakarta.enterprise.inject.Disposes; import jakarta.enterprise.inject.Produces; import jakarta.interceptor.Interceptor; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; -import org.eclipse.jnosql.databases.tinkerpop.communication.GraphSupplier; import org.eclipse.jnosql.mapping.Database; import org.eclipse.jnosql.mapping.DatabaseType; import org.mockito.Mockito; import java.util.Collections; -import java.util.function.Supplier; -import java.util.logging.Logger; import static java.util.Collections.singleton; import static org.mockito.Mockito.mock; @@ -39,36 +34,17 @@ @ApplicationScoped @Alternative @Priority(Interceptor.Priority.APPLICATION) -public class GraphProducer implements Supplier { - - private static final Logger LOGGER = Logger.getLogger(GraphProducer.class.getName()); - - private Graph graph; - - @PostConstruct - public void init() { - graph = GraphSupplier.INSTANCE.get(); - LOGGER.info("Graph database created"); - } - - @Produces - @ApplicationScoped - @Override - public Graph get() { - return graph; - } - +public class MockGraphProducer { @Produces @ApplicationScoped @Database(value = DatabaseType.GRAPH, provider = "graphRepositoryMock") public Graph getGraphMock() { - Graph graphMock = mock(Graph.class); Vertex vertex = mock(Vertex.class); when(vertex.label()).thenReturn("Person"); - when(vertex.id()).thenReturn("10L"); - when(graphMock.vertices("10L")).thenReturn(Collections.emptyIterator()); + when(vertex.id()).thenReturn("10"); + when(graphMock.vertices("10")).thenReturn(Collections.emptyIterator()); when(vertex.keys()).thenReturn(singleton("name")); when(vertex.value("name")).thenReturn("nameMock"); when(graphMock.addVertex(Mockito.anyString())).thenReturn(vertex); @@ -76,9 +52,4 @@ public Graph getGraphMock() { return graphMock; } - public void dispose(@Disposes Graph graph) throws Exception { - LOGGER.info("Graph database closing"); - graph.close(); - LOGGER.info("Graph Database closed"); - } } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/neo4j/Neo4jGraphProducer.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/neo4j/Neo4jGraphProducer.java new file mode 100644 index 000000000..19904faf1 --- /dev/null +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/neo4j/Neo4jGraphProducer.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022 Contributors to the Eclipse Foundation + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. + * + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * + * Otavio Santana + * Michele Rastelli + */ +package org.eclipse.jnosql.databases.tinkerpop.cdi.neo4j; + +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Priority; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Alternative; +import jakarta.enterprise.inject.Disposes; +import jakarta.enterprise.inject.Produces; +import jakarta.interceptor.Interceptor; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.eclipse.jnosql.databases.tinkerpop.cdi.TestGraphSupplier; + +import java.util.function.Supplier; +import java.util.logging.Logger; + +@ApplicationScoped +@Alternative +@Priority(Interceptor.Priority.APPLICATION) +public class Neo4jGraphProducer implements Supplier { + + private static final Logger LOGGER = Logger.getLogger(Neo4jGraphProducer.class.getName()); + + private Graph graph; + + @PostConstruct + public void init() { + graph = TestGraphSupplier.NEO4J.get(); + LOGGER.info("Graph database created"); + } + + @Produces + @ApplicationScoped + @Override + public Graph get() { + return graph; + } + + public void dispose(@Disposes Graph graph) throws Exception { + LOGGER.info("Graph database closing"); + graph.close(); + LOGGER.info("Graph Database closed"); + } + +} diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/tinkergraph/TinkerGraphProducer.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/tinkergraph/TinkerGraphProducer.java new file mode 100644 index 000000000..7a135ae3c --- /dev/null +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/tinkergraph/TinkerGraphProducer.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022 Contributors to the Eclipse Foundation + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. + * + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * + * Otavio Santana + * Michele Rastelli + */ +package org.eclipse.jnosql.databases.tinkerpop.cdi.tinkergraph; + +import jakarta.annotation.Priority; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Alternative; +import jakarta.enterprise.inject.Disposes; +import jakarta.enterprise.inject.Produces; +import jakarta.interceptor.Interceptor; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.eclipse.jnosql.databases.tinkerpop.cdi.TestGraphSupplier; + +import java.util.function.Supplier; + + +@ApplicationScoped +@Alternative +@Priority(Interceptor.Priority.APPLICATION) +public class TinkerGraphProducer implements Supplier { + + @Produces + @ApplicationScoped + @Override + public Graph get() { + return TestGraphSupplier.TINKER_GRAPH.get(); + } + + public void dispose(@Disposes Graph graph) throws Exception { + graph.close(); + } + +} diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java index 00c6839e8..87c7edea1 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java @@ -25,9 +25,14 @@ import org.eclipse.jnosql.communication.semistructured.Element; import org.eclipse.jnosql.communication.semistructured.Elements; import org.eclipse.jnosql.communication.semistructured.SelectQuery; +import org.eclipse.jnosql.databases.tinkerpop.cdi.TestGraphSupplier; import org.eclipse.jnosql.mapping.semistructured.MappingQuery; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.Parameter; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.provider.EnumSource; import java.time.Duration; import java.util.Collections; @@ -35,6 +40,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -49,18 +55,22 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -class DefaultTinkerpopGraphDatabaseManagerTest { +@ParameterizedClass +@EnumSource(TestGraphSupplier.class) +public class DefaultTinkerpopGraphDatabaseManagerTest { - public static final String COLLECTION_NAME = "Person"; + static final String COLLECTION_NAME = "Person"; private TinkerpopGraphDatabaseManager entityManager; private final Faker faker = new Faker(); + @Parameter + private Supplier graphSupplier; + @BeforeEach - void setUp(){ - Graph graph = GraphSupplier.INSTANCE.get(); - this.entityManager = TinkerpopGraphDatabaseManager.of(graph); + void setUp() { + this.entityManager = TinkerpopGraphDatabaseManager.of(graphSupplier.get()); } @BeforeEach @@ -68,8 +78,13 @@ void beforeEach() { delete().from(COLLECTION_NAME).delete(entityManager); } + @AfterEach + void close() { + entityManager.close(); + } + @Test - void shouldInsertEntity(){ + void shouldInsertEntity() { String name = faker.name().fullName(); var age = faker.number().randomDigit(); var entity = CommunicationEntity.of("Person"); @@ -86,7 +101,7 @@ void shouldInsertEntity(){ } @Test - void shouldInsertEntities(){ + void shouldInsertEntities() { String name = faker.name().fullName(); var age = faker.number().randomDigit(); var entity = CommunicationEntity.of("Person"); @@ -306,7 +321,6 @@ void shouldFindDocumentBetween() { }); - } @Test diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java deleted file mode 100644 index b3d5f1f0b..000000000 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/GraphSupplier.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2022 Contributors to the Eclipse Foundation - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. - * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html - * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. - * - * You may elect to redistribute this code under either of these licenses. - * - * Contributors: - * - * Otavio Santana - */ -package org.eclipse.jnosql.databases.tinkerpop.communication; - -import org.apache.commons.configuration2.BaseConfiguration; -import org.apache.commons.configuration2.Configuration; -import org.apache.tinkerpop.gremlin.structure.Graph; -import org.apache.tinkerpop.gremlin.structure.util.GraphFactory; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; - -import java.util.function.Supplier; -import java.util.logging.Logger; - -public enum GraphSupplier implements Supplier { - INSTANCE; - - private final GenericContainer arangodb = - new GenericContainer<>("arangodb/arangodb:latest") - .withExposedPorts(8529) - .withEnv("ARANGO_NO_AUTH", "1") - .waitingFor(Wait.forHttp("/") - .forStatusCode(200)); - - { - arangodb.start(); - } - - private static final Logger LOGGER = Logger.getLogger(GraphSupplier.class.getName()); - - @Override - public Graph get() { - LOGGER.info("Starting Graph database"); - Configuration configuration = new BaseConfiguration(); - configuration.addProperty("gremlin.graph", "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph"); - configuration.addProperty("gremlin.arangodb.conf.graph.enableDataDefinition", true); - configuration.addProperty("gremlin.arangodb.conf.driver.hosts", arangodb.getHost() + ":" + arangodb.getFirstMappedPort()); - return GraphFactory.open(configuration); - } -} diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/AbstractTinkerpopTemplateTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/AbstractTinkerpopTemplateTest.java index ee84d2813..bb6af7b8a 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/AbstractTinkerpopTemplateTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/AbstractTinkerpopTemplateTest.java @@ -131,7 +131,7 @@ void shouldGetErrorWhenIdIsNullWhenUpdate() { void shouldGetErrorWhenEntityIsNotSavedYet() { assertThrows(EmptyResultException.class, () -> { Human human = Human.builder().withAge() - .withId("10L") + .withId("10") .withName("Otavio").build(); getGraphTemplate().update(human); @@ -213,7 +213,7 @@ void shouldFindAnEntity() { @Test void shouldNotFindAnEntity() { - Optional personFound = getGraphTemplate().find("0L"); + Optional personFound = getGraphTemplate().find("0"); assertFalse(personFound.isPresent()); } @@ -350,7 +350,7 @@ void shouldReturnErrorWhenGetEdgesHasNullId() { @Test void shouldReturnErrorWhenGetEdgesHasNullId2() { - Human otavio = Human.builder().withId("0L").withAge().withName("Otavio").build(); + Human otavio = Human.builder().withId("0").withAge().withName("Otavio").build(); Collection edges = getGraphTemplate().edges(otavio, Direction.BOTH); assertThat(edges).isEmpty(); } @@ -366,7 +366,7 @@ void shouldReturnErrorWhenGetEdgesHasNullDirection() { @Test void shouldReturnEmptyWhenEntityDoesNotExist() { - Human otavio = Human.builder().withAge().withName("Otavio").withId("10L").build(); + Human otavio = Human.builder().withAge().withName("Otavio").withId("10").build(); Collection edges = getGraphTemplate().edges(otavio, Direction.BOTH); assertTrue(edges.isEmpty()); } @@ -543,7 +543,7 @@ void shouldDeleteAll() { @Test void shouldReturnEmptyWhenFindByIdNotFound() { - final Optional person = getGraphTemplate().find(Human.class, "-2L"); + final Optional person = getGraphTemplate().find(Human.class, "-2"); assertNotNull(person); assertFalse(person.isPresent()); } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultEdgeTraversalTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultEdgeTraversalTest.java index 310675a22..bdb8c8d02 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultEdgeTraversalTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultEdgeTraversalTest.java @@ -18,6 +18,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.structure.T; import org.assertj.core.api.SoftAssertions; +import org.eclipse.jnosql.databases.tinkerpop.cdi.arangodb.ArangoDBGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.neo4j.Neo4jGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.tinkergraph.TinkerGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Creature; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Human; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Magazine; @@ -51,10 +54,21 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class}) -@AddPackages(GraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class}) -class DefaultEdgeTraversalTest extends AbstractTraversalTest { +abstract class DefaultEdgeTraversalTest extends AbstractTraversalTest { + + @AddPackages(ArangoDBGraphProducer.class) + static class ArangoDBTest extends DefaultEdgeTraversalTest { + } + + @AddPackages(Neo4jGraphProducer.class) + static class Neo4jTest extends DefaultEdgeTraversalTest { + } + + @AddPackages(TinkerGraphProducer.class) + static class TinkerGraphTest extends DefaultEdgeTraversalTest { + } @Test void shouldReturnErrorWhenEdgeIdIsNull() { @@ -489,7 +503,7 @@ void shouldReturnErrorWhenThereAreMoreThanOneInGetSingleResult() { @Test void shouldReturnOptionalEmptyWhenThereIsNotResultInSingleResult() { - Optional entity = tinkerpopTemplate.traversalEdge("-1L").singleResult(); + Optional entity = tinkerpopTemplate.traversalEdge("-1").singleResult(); assertFalse(entity.isPresent()); } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultGraphTraversalSourceTemplateTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultGraphTraversalSourceTemplateTest.java index eb815435e..73d696b0e 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultGraphTraversalSourceTemplateTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultGraphTraversalSourceTemplateTest.java @@ -16,6 +16,9 @@ import jakarta.inject.Inject; import org.apache.tinkerpop.gremlin.structure.Graph; +import org.eclipse.jnosql.databases.tinkerpop.cdi.arangodb.ArangoDBGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.neo4j.Neo4jGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.tinkergraph.TinkerGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.spi.TinkerpopExtension; import org.eclipse.jnosql.mapping.core.Converters; import org.eclipse.jnosql.mapping.reflection.Reflections; @@ -27,9 +30,21 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, Transactional.class}) -@AddPackages({MagazineRepository.class, Reflections.class, GraphProducer.class}) +@AddPackages({MagazineRepository.class, Reflections.class}) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class}) -class DefaultGraphTraversalSourceTemplateTest extends AbstractTinkerpopTemplateTest { +abstract class DefaultGraphTraversalSourceTemplateTest extends AbstractTinkerpopTemplateTest { + + @AddPackages(ArangoDBGraphProducer.class) + static class ArangoDBTest extends DefaultGraphTraversalSourceTemplateTest { + } + + @AddPackages(Neo4jGraphProducer.class) + static class Neo4jTest extends DefaultGraphTraversalSourceTemplateTest { + } + + @AddPackages(TinkerGraphProducer.class) + static class TinkerGraphTest extends DefaultGraphTraversalSourceTemplateTest { + } @Inject private TinkerpopTemplate graphTemplate; diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultTinkerpopTemplateProducerTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultTinkerpopTemplateProducerTest.java index 57f2cde58..27e38e602 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultTinkerpopTemplateProducerTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultTinkerpopTemplateProducerTest.java @@ -16,6 +16,7 @@ import jakarta.inject.Inject; import org.apache.tinkerpop.gremlin.structure.Graph; +import org.eclipse.jnosql.databases.tinkerpop.cdi.mock.MockGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.spi.TinkerpopExtension; import org.eclipse.jnosql.mapping.core.Converters; import org.eclipse.jnosql.mapping.reflection.Reflections; @@ -33,7 +34,7 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class}) -@AddPackages(GraphProducer.class) +@AddPackages(MockGraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class}) class DefaultGraphTemplateProducerTest { diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultValueMapTraversalTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultValueMapTraversalTest.java index cf24e051b..0aecc3610 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultValueMapTraversalTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultValueMapTraversalTest.java @@ -15,6 +15,9 @@ package org.eclipse.jnosql.databases.tinkerpop.mapping; import jakarta.data.exceptions.NonUniqueResultException; +import org.eclipse.jnosql.databases.tinkerpop.cdi.arangodb.ArangoDBGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.neo4j.Neo4jGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.tinkergraph.TinkerGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Human; import org.eclipse.jnosql.databases.tinkerpop.mapping.spi.TinkerpopExtension; import org.eclipse.jnosql.mapping.core.Converters; @@ -40,11 +43,21 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class}) -@AddPackages(GraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class}) -class DefaultValueMapTraversalTest extends AbstractTraversalTest { +abstract class DefaultValueMapTraversalTest extends AbstractTraversalTest { + @AddPackages(ArangoDBGraphProducer.class) + static class ArangoDBTest extends DefaultValueMapTraversalTest { + } + + @AddPackages(Neo4jGraphProducer.class) + static class Neo4jTest extends DefaultValueMapTraversalTest { + } + + @AddPackages(TinkerGraphProducer.class) + static class TinkerGraphTest extends DefaultValueMapTraversalTest { + } @Test void shouldCount() { diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultVertexTraversalTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultVertexTraversalTest.java index 04bd02886..20c63c54d 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultVertexTraversalTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/DefaultVertexTraversalTest.java @@ -17,6 +17,9 @@ import jakarta.data.exceptions.NonUniqueResultException; import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.structure.T; +import org.eclipse.jnosql.databases.tinkerpop.cdi.arangodb.ArangoDBGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.neo4j.Neo4jGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.tinkergraph.TinkerGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Creature; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Human; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Magazine; @@ -52,11 +55,21 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class}) -@AddPackages(GraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class}) -class DefaultVertexTraversalTest extends AbstractTraversalTest { +abstract class DefaultVertexTraversalTest extends AbstractTraversalTest { + @AddPackages(ArangoDBGraphProducer.class) + static class ArangoDBTest extends DefaultVertexTraversalTest { + } + + @AddPackages(Neo4jGraphProducer.class) + static class Neo4jTest extends DefaultVertexTraversalTest { + } + + @AddPackages(TinkerGraphProducer.class) + static class TinkerGraphTest extends DefaultVertexTraversalTest { + } @Test void shouldReturnErrorWhenVertexIdIsNull() { @@ -515,5 +528,4 @@ void shouldDedup() { assertEquals(3, people.size()); } - } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/EdgeEntityTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/EdgeEntityTest.java index 3fd796e9f..22ba6ad18 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/EdgeEntityTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/EdgeEntityTest.java @@ -18,6 +18,9 @@ import jakarta.inject.Inject; import org.eclipse.jnosql.communication.Value; import org.eclipse.jnosql.communication.semistructured.Element; +import org.eclipse.jnosql.databases.tinkerpop.cdi.arangodb.ArangoDBGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.neo4j.Neo4jGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.tinkergraph.TinkerGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Human; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Magazine; import org.eclipse.jnosql.databases.tinkerpop.mapping.spi.TinkerpopExtension; @@ -43,11 +46,21 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class}) -@AddPackages(GraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class}) -class EdgeEntityTest { +abstract class EdgeEntityTest { + @AddPackages(ArangoDBGraphProducer.class) + static class ArangoDBTest extends EdgeEntityTest { + } + + @AddPackages(Neo4jGraphProducer.class) + static class Neo4jTest extends EdgeEntityTest { + } + + @AddPackages(TinkerGraphProducer.class) + static class TinkerGraphTest extends EdgeEntityTest { + } @Inject private TinkerpopTemplate tinkerpopTemplate; @@ -102,7 +115,7 @@ void shouldReturnNullWhenOutboundIdIsNull() { @Test void shouldReturnEntityNotFoundWhenOutBoundDidNotFound() { Assertions.assertThrows( EmptyResultException.class, () -> { - Human human = Human.builder().withId("-10L").withName("Poliana").withAge().build(); + Human human = Human.builder().withId("-10").withName("Poliana").withAge().build(); Magazine magazine = tinkerpopTemplate.insert(Magazine.builder().withAge(2007).withName("The Shack").build()); tinkerpopTemplate.edge(human, "reads", magazine); }); @@ -112,7 +125,7 @@ void shouldReturnEntityNotFoundWhenOutBoundDidNotFound() { void shouldReturnEntityNotFoundWhenInBoundDidNotFound() { Assertions.assertThrows( EmptyResultException.class, () -> { Human human = tinkerpopTemplate.insert(Human.builder().withName("Poliana").withAge().build()); - Magazine magazine = Magazine.builder().withId("10L").withAge(2007).withName("The Shack").build(); + Magazine magazine = Magazine.builder().withId("10").withAge(2007).withName("The Shack").build(); tinkerpopTemplate.edge(human, "reads", magazine); }); } @@ -352,7 +365,7 @@ void shouldFindAnEdge() { @Test void shouldNotFindAnEdge() { - Optional edgeEntity = tinkerpopTemplate.edge("-12L"); + Optional edgeEntity = tinkerpopTemplate.edge("-12"); assertFalse(edgeEntity.isPresent()); } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphTemplateTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphTemplateTest.java index 6d71a979c..91a22e0fd 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphTemplateTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/GraphTemplateTest.java @@ -16,6 +16,9 @@ import jakarta.inject.Inject; import jakarta.nosql.Template; +import org.eclipse.jnosql.databases.tinkerpop.cdi.arangodb.ArangoDBGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.neo4j.Neo4jGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.tinkergraph.TinkerGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.spi.TinkerpopExtension; import org.eclipse.jnosql.mapping.Database; import org.eclipse.jnosql.mapping.core.Converters; @@ -34,10 +37,21 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class, GraphTemplate.class}) -@AddPackages(GraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class, GraphExtension.class}) -class GraphTemplateTest { +abstract class GraphTemplateTest { + + @AddPackages(ArangoDBGraphProducer.class) + static class ArangoDBTest extends GraphTemplateTest { + } + + @AddPackages(Neo4jGraphProducer.class) + static class Neo4jTest extends GraphTemplateTest { + } + + @AddPackages(TinkerGraphProducer.class) + static class TinkerGraphTest extends GraphTemplateTest { + } @Inject private Template template; diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/MagazineTemplateTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/MagazineTemplateTest.java index 05ac3e04d..7ca01fb44 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/MagazineTemplateTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/MagazineTemplateTest.java @@ -18,6 +18,9 @@ import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Transaction; import org.apache.tinkerpop.gremlin.structure.Transaction.Status; +import org.eclipse.jnosql.databases.tinkerpop.cdi.arangodb.ArangoDBGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.neo4j.Neo4jGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.tinkergraph.TinkerGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Magazine; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.MagazineTemplate; import org.eclipse.jnosql.databases.tinkerpop.mapping.spi.TinkerpopExtension; @@ -41,10 +44,21 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class}) -@AddPackages(GraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class}) -class MagazineTemplateTest { +abstract class MagazineTemplateTest { + + @AddPackages(ArangoDBGraphProducer.class) + static class ArangoDBTest extends MagazineTemplateTest { + } + + @AddPackages(Neo4jGraphProducer.class) + static class Neo4jTest extends MagazineTemplateTest { + } + + @AddPackages(TinkerGraphProducer.class) + static class TinkerGraphTest extends MagazineTemplateTest { + } @Inject private MagazineTemplate template; diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/PopulationTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/PopulationTest.java index c2d51d81b..3200cbb0a 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/PopulationTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/PopulationTest.java @@ -16,8 +16,10 @@ import jakarta.inject.Inject; -import org.apache.tinkerpop.gremlin.process.traversal.Order; import org.assertj.core.api.SoftAssertions; +import org.eclipse.jnosql.databases.tinkerpop.cdi.arangodb.ArangoDBGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.neo4j.Neo4jGraphProducer; +import org.eclipse.jnosql.databases.tinkerpop.cdi.tinkergraph.TinkerGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Human; import org.eclipse.jnosql.databases.tinkerpop.mapping.spi.TinkerpopExtension; import org.eclipse.jnosql.mapping.core.Converters; @@ -36,10 +38,21 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class, GraphTemplate.class}) -@AddPackages(GraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class, GraphExtension.class}) -public class PopulationTest { +abstract class PopulationTest { + + @AddPackages(ArangoDBGraphProducer.class) + static class ArangoDBTest extends PopulationTest { + } + + @AddPackages(Neo4jGraphProducer.class) + static class Neo4jTest extends PopulationTest { + } + + @AddPackages(TinkerGraphProducer.class) + static class TinkerGraphTest extends PopulationTest { + } @Inject private Population population; diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/TinkerpopTemplateProducerTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/TinkerpopTemplateProducerTest.java index d14ad4c3b..1eb3040b4 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/TinkerpopTemplateProducerTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/TinkerpopTemplateProducerTest.java @@ -16,6 +16,7 @@ import jakarta.inject.Inject; import org.apache.tinkerpop.gremlin.structure.Graph; +import org.eclipse.jnosql.databases.tinkerpop.cdi.mock.MockGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.spi.TinkerpopExtension; import org.eclipse.jnosql.mapping.core.Converters; import org.eclipse.jnosql.mapping.reflection.Reflections; @@ -32,7 +33,7 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class}) -@AddPackages(GraphProducer.class) +@AddPackages(MockGraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class}) class GraphTemplateProducerTest { diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/TinkerpopTemplateTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/TinkerpopTemplateTest.java index 2f6885b10..cae8863e4 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/TinkerpopTemplateTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/TinkerpopTemplateTest.java @@ -16,6 +16,7 @@ import jakarta.inject.Inject; import jakarta.nosql.Template; +import org.eclipse.jnosql.databases.tinkerpop.cdi.mock.MockGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.spi.TinkerpopExtension; import org.eclipse.jnosql.mapping.Database; import org.eclipse.jnosql.mapping.core.Converters; @@ -34,7 +35,7 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class, GraphTemplate.class}) -@AddPackages(GraphProducer.class) +@AddPackages(MockGraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class, GraphExtension.class}) class TinkerpopTemplateTest { diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/configuration/GraphSupplierTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/configuration/GraphSupplierTest.java index 0973315d8..f5b35ef82 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/configuration/GraphSupplierTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/configuration/GraphSupplierTest.java @@ -17,7 +17,6 @@ import jakarta.inject.Inject; import org.apache.tinkerpop.gremlin.structure.Graph; import org.eclipse.jnosql.databases.tinkerpop.communication.DatabaseConfigurationAdapter; -import org.eclipse.jnosql.databases.tinkerpop.mapping.GraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.TinkerpopTemplate; import org.eclipse.jnosql.databases.tinkerpop.mapping.spi.TinkerpopExtension; import org.eclipse.jnosql.mapping.core.Converters; @@ -37,7 +36,6 @@ @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class}) -@AddPackages(GraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class}) class GraphSupplierTest { diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/spi/TinkerpopExtensionTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/spi/TinkerpopExtensionTest.java index 9683d70cd..cbafb65f4 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/spi/TinkerpopExtensionTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/mapping/spi/TinkerpopExtensionTest.java @@ -15,9 +15,8 @@ package org.eclipse.jnosql.databases.tinkerpop.mapping.spi; import jakarta.inject.Inject; -import org.eclipse.jnosql.databases.tinkerpop.mapping.GraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.TinkerpopTemplate; -import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.Human; +import org.eclipse.jnosql.databases.tinkerpop.cdi.mock.MockGraphProducer; import org.eclipse.jnosql.databases.tinkerpop.mapping.entities.HumanRepository; import org.eclipse.jnosql.mapping.Database; import org.eclipse.jnosql.mapping.DatabaseType; @@ -33,17 +32,15 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; @EnableAutoWeld @AddPackages(value = {Converters.class, EntityConverter.class, TinkerpopTemplate.class, GraphTemplate.class}) -@AddPackages(GraphProducer.class) +@AddPackages(MockGraphProducer.class) @AddPackages(Reflections.class) @AddExtensions({ReflectionEntityMetadataExtension.class, TinkerpopExtension.class, GraphExtension.class}) class TinkerpopExtensionTest { - @Inject @Database(value = DatabaseType.GRAPH) private HumanRepository repository; @@ -69,7 +66,7 @@ void shouldInitiate() { } @Test - void shouldUseMock(){ + void shouldUseMock() { assertNotNull(repositoryMock); } diff --git a/jnosql-tinkerpop/src/test/resources/simplelogger.properties b/jnosql-tinkerpop/src/test/resources/simplelogger.properties index fff7a68b0..9268538a1 100644 --- a/jnosql-tinkerpop/src/test/resources/simplelogger.properties +++ b/jnosql-tinkerpop/src/test/resources/simplelogger.properties @@ -9,4 +9,4 @@ org.slf4j.simpleLogger.defaultLogLevel=info org.slf4j.simpleLogger.log.org.testcontainers=warn ## ArangoDB communication debug level -org.slf4j.simpleLogger.log.com.arangodb.internal.net.Communication=debug +#org.slf4j.simpleLogger.log.com.arangodb.internal.net.Communication=debug From 51b4bebfb1bde5925e573b0e614fd1877324a0e6 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 28 Oct 2025 10:25:26 +0100 Subject: [PATCH 4/9] fix tests for Junit 5 --- ...aultTinkerpopGraphDatabaseManagerTest.java | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java index 87c7edea1..d91b42362 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManagerTest.java @@ -30,9 +30,6 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.Parameter; -import org.junit.jupiter.params.ParameterizedClass; -import org.junit.jupiter.params.provider.EnumSource; import java.time.Duration; import java.util.Collections; @@ -40,7 +37,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -55,9 +51,28 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -@ParameterizedClass -@EnumSource(TestGraphSupplier.class) -public class DefaultTinkerpopGraphDatabaseManagerTest { +abstract class DefaultTinkerpopGraphDatabaseManagerTest { + + static class ArangoDBTest extends DefaultTinkerpopGraphDatabaseManagerTest { + @Override + Graph graph() { + return TestGraphSupplier.ARANGODB.get(); + } + } + + static class Neo4jTest extends DefaultTinkerpopGraphDatabaseManagerTest { + @Override + Graph graph() { + return TestGraphSupplier.NEO4J.get(); + } + } + + static class TinkerGraphTest extends DefaultTinkerpopGraphDatabaseManagerTest { + @Override + Graph graph() { + return TestGraphSupplier.TINKER_GRAPH.get(); + } + } static final String COLLECTION_NAME = "Person"; @@ -65,12 +80,11 @@ public class DefaultTinkerpopGraphDatabaseManagerTest { private final Faker faker = new Faker(); - @Parameter - private Supplier graphSupplier; + abstract Graph graph(); @BeforeEach void setUp() { - this.entityManager = TinkerpopGraphDatabaseManager.of(graphSupplier.get()); + this.entityManager = TinkerpopGraphDatabaseManager.of(graph()); } @BeforeEach From 2e68f1279a9e184d384e41354de375a487b3391b Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 28 Oct 2025 10:49:45 +0100 Subject: [PATCH 5/9] fix TinkerGraph tests --- .../tinkerpop/cdi/ArangoDeployment.java | 23 +++++++++++++++++++ .../tinkerpop/cdi/TestGraphSupplier.java | 20 +++++----------- 2 files changed, 29 insertions(+), 14 deletions(-) create mode 100644 jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/ArangoDeployment.java diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/ArangoDeployment.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/ArangoDeployment.java new file mode 100644 index 000000000..c4f786934 --- /dev/null +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/ArangoDeployment.java @@ -0,0 +1,23 @@ +package org.eclipse.jnosql.databases.tinkerpop.cdi; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; + +enum ArangoDeployment { + INSTANCE; + + private final GenericContainer arangodb = + new GenericContainer<>("arangodb/arangodb:latest") + .withExposedPorts(8529) + .withEnv("ARANGO_NO_AUTH", "1") + .waitingFor(Wait.forHttp("/") + .forStatusCode(200)); + + { + arangodb.start(); + } + + public GenericContainer getContainer() { + return arangodb; + } +} diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java index 98e8a0c27..a86d3760c 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java @@ -23,7 +23,6 @@ import org.apache.tinkerpop.gremlin.structure.util.GraphFactory; import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import java.io.File; import java.util.function.Supplier; @@ -45,23 +44,13 @@ public Graph get() { }, ARANGODB { - private final GenericContainer arangodb = - new GenericContainer<>("arangodb/arangodb:latest") - .withExposedPorts(8529) - .withEnv("ARANGO_NO_AUTH", "1") - .waitingFor(Wait.forHttp("/") - .forStatusCode(200)); - - { - arangodb.start(); - } - @Override public Graph get() { + GenericContainer container = ArangoDeployment.INSTANCE.getContainer(); Configuration configuration = new BaseConfiguration(); configuration.addProperty("gremlin.graph", ArangoDBGraph.class.getName()); configuration.addProperty("gremlin.arangodb.conf.graph.enableDataDefinition", true); - configuration.addProperty("gremlin.arangodb.conf.driver.hosts", arangodb.getHost() + ":" + arangodb.getFirstMappedPort()); + configuration.addProperty("gremlin.arangodb.conf.driver.hosts", container.getHost() + ":" + container.getFirstMappedPort()); return GraphFactory.open(configuration); } }, @@ -69,7 +58,10 @@ public Graph get() { TINKER_GRAPH { @Override public Graph get() { - return TinkerGraph.open(); + Configuration configuration = new BaseConfiguration(); + configuration.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, TinkerGraph.DefaultIdManager.STRING.name()); + configuration.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, TinkerGraph.DefaultIdManager.STRING.name()); + return TinkerGraph.open(configuration); } } From d46e2392c300da5e7820574d8f4e984ac5475501 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 28 Oct 2025 11:06:06 +0100 Subject: [PATCH 6/9] added TinkerGraph transaction tests --- .../jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java index a86d3760c..32dadc08e 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java @@ -22,6 +22,7 @@ import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.util.GraphFactory; import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerTransactionGraph; import org.testcontainers.containers.GenericContainer; import java.io.File; @@ -61,7 +62,8 @@ public Graph get() { Configuration configuration = new BaseConfiguration(); configuration.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, TinkerGraph.DefaultIdManager.STRING.name()); configuration.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, TinkerGraph.DefaultIdManager.STRING.name()); - return TinkerGraph.open(configuration); + configuration.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_PROPERTY_ID_MANAGER, TinkerGraph.DefaultIdManager.STRING.name()); + return TinkerTransactionGraph.open(configuration); } } From 0385e2288ecead9f57a331fcabc62a71017e231f Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 28 Oct 2025 11:22:18 +0100 Subject: [PATCH 7/9] fix transaction on addVertex --- .../DefaultTinkerpopGraphDatabaseManager.java | 1 + .../databases/tinkerpop/cdi/ArangoDeployment.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManager.java b/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManager.java index cd9393215..ceb6a828c 100644 --- a/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManager.java +++ b/jnosql-tinkerpop/src/main/java/org/eclipse/jnosql/databases/tinkerpop/communication/DefaultTinkerpopGraphDatabaseManager.java @@ -259,6 +259,7 @@ private Vertex addVertex(CommunicationEntity entity) { ).toArray(); Vertex vertex = graph.addVertex(args); entity.add(ID, vertex.id()); + GraphTransactionUtil.transaction(graph); return vertex; } diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/ArangoDeployment.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/ArangoDeployment.java index c4f786934..4b7affb65 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/ArangoDeployment.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/ArangoDeployment.java @@ -1,3 +1,17 @@ +/* + * Copyright (c) 2022 Contributors to the Eclipse Foundation + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. + * + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * + * Otavio Santana + */ package org.eclipse.jnosql.databases.tinkerpop.cdi; import org.testcontainers.containers.GenericContainer; From 9dbb73778a0288ccc1f679fe195f4bd36a04ee43 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 28 Oct 2025 12:37:19 +0100 Subject: [PATCH 8/9] fix deps scope --- jnosql-tinkerpop/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jnosql-tinkerpop/pom.xml b/jnosql-tinkerpop/pom.xml index 94f7f5e19..fac780ba8 100644 --- a/jnosql-tinkerpop/pom.xml +++ b/jnosql-tinkerpop/pom.xml @@ -75,7 +75,7 @@ org.apache.tinkerpop tinkergraph-gremlin ${tinkerpop.version} - provided + test com.arangodb From 60a0df52f89faf48d7f4dc3092af16e080844422 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 28 Oct 2025 12:52:15 +0100 Subject: [PATCH 9/9] test with ArangoDB complex graph type --- .../databases/tinkerpop/cdi/TestGraphSupplier.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java index 32dadc08e..598b1f81b 100644 --- a/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java +++ b/jnosql-tinkerpop/src/test/java/org/eclipse/jnosql/databases/tinkerpop/cdi/TestGraphSupplier.java @@ -16,6 +16,7 @@ package org.eclipse.jnosql.databases.tinkerpop.cdi; import com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph; +import com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraphConfig; import org.apache.commons.configuration2.BaseConfiguration; import org.apache.commons.configuration2.Configuration; import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph; @@ -26,6 +27,7 @@ import org.testcontainers.containers.GenericContainer; import java.io.File; +import java.util.List; import java.util.function.Supplier; import java.util.logging.Logger; @@ -51,6 +53,15 @@ public Graph get() { Configuration configuration = new BaseConfiguration(); configuration.addProperty("gremlin.graph", ArangoDBGraph.class.getName()); configuration.addProperty("gremlin.arangodb.conf.graph.enableDataDefinition", true); + configuration.addProperty("gremlin.arangodb.conf.graph.type", ArangoDBGraphConfig.GraphType.COMPLEX.name()); + configuration.addProperty("gremlin.arangodb.conf.graph.edgeDefinitions", List.of( + "reads:[Human]->[Magazine]", + "knows:[Person]->[Person]", + "eats:[Creature]->[Creature]", + "loves:[Human]->[Human]", + "likes:[Human]->[Creature]", + "friend:[Person]->[Person]" + )); configuration.addProperty("gremlin.arangodb.conf.driver.hosts", container.getHost() + ":" + container.getFirstMappedPort()); return GraphFactory.open(configuration); }