package com.buschmais.xo.neo4j.test.delegate;
import static com.buschmais.xo.api.Query.Result;
import static com.buschmais.xo.api.Query.Result.CompositeRowObject;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
import java.net.URISyntaxException;
import java.util.*;
import org.hamcrest.collection.IsMapContaining;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import com.buschmais.xo.api.CompositeObject;
import com.buschmais.xo.api.XOManager;
import com.buschmais.xo.api.bootstrap.XOUnit;
import com.buschmais.xo.neo4j.api.model.Neo4jLabel;
import com.buschmais.xo.neo4j.api.model.Neo4jNode;
import com.buschmais.xo.neo4j.api.model.Neo4jRelationship;
import com.buschmais.xo.neo4j.test.AbstractNeo4jXOManagerTest;
import com.buschmais.xo.neo4j.test.delegate.composite.A;
import com.buschmais.xo.neo4j.test.delegate.composite.A2B;
import com.buschmais.xo.neo4j.test.delegate.composite.B;
@RunWith(Parameterized.class)
public class DelegateTest extends AbstractNeo4jXOManagerTest {
public DelegateTest(XOUnit xoUnit) {
super(xoUnit);
}
@Parameterized.Parameters
public static Collection<Object[]> getXOUnits() throws URISyntaxException {
return xoUnits(A.class, B.class, A2B.class);
}
@Test
public void entity() {
XOManager xoManager = getXoManager();
xoManager.currentTransaction().begin();
Neo4jNode<Neo4jLabel, ?, ?, ?> node = ((CompositeObject) xoManager.create(A.class)).getDelegate();
Iterable<Neo4jLabel> labels = node.getLabels();
Set<String> labelsAsStrings = new HashSet<>();
for (Neo4jLabel label : labels) {
labelsAsStrings.add(label.getName());
}
assertThat(labelsAsStrings.size(), equalTo(1));
assertThat(labelsAsStrings.contains("A"), equalTo(true));
xoManager.currentTransaction().commit();
}
@Test
public void relation() {
XOManager xoManager = getXoManager();
xoManager.currentTransaction().begin();
A a = xoManager.create(A.class);
B b = xoManager.create(B.class);
xoManager.create(a, A2B.class, b);
List<A2B> r = executeQuery("MATCH (a:A)-[r]->(b:B) RETURN r").getColumn("r");
assertThat(r.size(), equalTo(1));
Neo4jRelationship relationship = ((CompositeObject) r.get(0)).getDelegate();
assertThat(relationship.getType().getName(), equalTo("RELATION"));
xoManager.currentTransaction().commit();
}
@Test
public void row() {
XOManager xoManager = getXoManager();
xoManager.currentTransaction().begin();
A a = xoManager.create(A.class);
Result<CompositeRowObject> row = xoManager.createQuery("match (a:A) return a").execute();
Map<String, Object> delegate = row.getSingleResult().getDelegate();
assertThat(delegate, IsMapContaining.<String, Object> hasEntry("a", a));
xoManager.currentTransaction().commit();
}
}