package com.buschmais.xo.neo4j.test.instancelistener; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.core.IsCollectionContaining.hasItems; import static org.junit.Assert.assertThat; import java.net.URISyntaxException; import java.util.Arrays; import java.util.Collection; import org.hamcrest.core.IsCollectionContaining; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import com.buschmais.xo.api.ConcurrencyMode; import com.buschmais.xo.api.Transaction; import com.buschmais.xo.api.ValidationMode; import com.buschmais.xo.api.XOManager; import com.buschmais.xo.api.bootstrap.XOUnit; import com.buschmais.xo.neo4j.test.AbstractNeo4jXOManagerTest; import com.buschmais.xo.neo4j.test.instancelistener.composite.*; @RunWith(Parameterized.class) public class InstanceListenerTest extends AbstractNeo4jXOManagerTest { public InstanceListenerTest(XOUnit xoUnit) { super(xoUnit); } @Parameterized.Parameters public static Collection<Object[]> getXOUnits() throws URISyntaxException { return xoUnits(Arrays.asList(A.class, B.class, A2B.class), Arrays.<Class<?>>asList(StaticInstanceListener.class), ValidationMode.AUTO, ConcurrencyMode.SINGLETHREADED, Transaction.TransactionAttribute.MANDATORY); } @Before public void reset() { StaticInstanceListener.getPostCreate().clear(); StaticInstanceListener.getPreUpdate().clear(); StaticInstanceListener.getPostUpdate().clear(); StaticInstanceListener.getPreDelete().clear(); StaticInstanceListener.getPostDelete().clear(); StaticInstanceListener.getPostLoad().clear(); StaticInstanceListener.getAggregated().clear(); } @Test public void staticInstanceListener() { XOManager xoManager = getXoManager(); xoManager.currentTransaction().begin(); A a = xoManager.create(A.class); B b = xoManager.create(B.class); A2B a2b = xoManager.create(a, A2B.class, b); assertThat(StaticInstanceListener.getPostCreate(), IsCollectionContaining.<Object>hasItems(a, b, a2b)); assertThat(StaticInstanceListener.getPreUpdate().isEmpty(), equalTo(true)); assertThat(StaticInstanceListener.getPostUpdate().isEmpty(), equalTo(true)); assertThat(StaticInstanceListener.getPreDelete().isEmpty(), equalTo(true)); assertThat(StaticInstanceListener.getPostDelete().isEmpty(), equalTo(true)); assertThat(StaticInstanceListener.getPostLoad().isEmpty(), equalTo(true)); xoManager.currentTransaction().commit(); xoManager.currentTransaction().begin(); assertThat(StaticInstanceListener.getPreUpdate(), IsCollectionContaining.<Object>hasItems(a, b, a2b)); assertThat(StaticInstanceListener.getPostUpdate(), IsCollectionContaining.<Object>hasItems(a, b, a2b)); xoManager.currentTransaction().commit(); closeXOmanager(); xoManager = getXoManager(); xoManager.currentTransaction().begin(); a = xoManager.createQuery("match (a:A) return a", A.class).execute().getSingleResult(); assertThat(StaticInstanceListener.getPostLoad(), IsCollectionContaining.<Object>hasItems(a)); a2b = a.getA2b(); assertThat(StaticInstanceListener.getPostLoad(), IsCollectionContaining.<Object>hasItems(a, a2b)); b = a2b.getB(); assertThat(StaticInstanceListener.getPostLoad(), IsCollectionContaining.<Object>hasItems(a, a2b, b)); StaticInstanceListener.getPreUpdate().clear(); StaticInstanceListener.getPostUpdate().clear(); a.setVersion(1); a2b.setVersion(1); b.setVersion(1); xoManager.flush(); assertThat(StaticInstanceListener.getPreUpdate(), IsCollectionContaining.<Object>hasItems(a, b, a2b)); assertThat(StaticInstanceListener.getPostUpdate(), IsCollectionContaining.<Object>hasItems(a, b, a2b)); xoManager.delete(a2b); xoManager.delete(a); xoManager.delete(b); assertThat(StaticInstanceListener.getPreDelete().size(), equalTo(3)); assertThat(StaticInstanceListener.getPostDelete().size(), equalTo(3)); xoManager.currentTransaction().commit(); } @Test public void aggregatedLifecycleEvents() { XOManager xoManager = getXoManager(); xoManager.currentTransaction().begin(); A a = xoManager.create(A.class); // @PostCreate assertThat(StaticInstanceListener.getAggregated().size(), equalTo(1)); a.setVersion(1); xoManager.currentTransaction().commit(); // @PreUpdate and @PostUpdate assertThat(StaticInstanceListener.getAggregated().size(), equalTo(3)); closeXOmanager(); xoManager = getXoManager(); xoManager.currentTransaction().begin(); a = xoManager.createQuery("match (a:A) return a", A.class).execute().getSingleResult(); // @PostLoad assertThat(StaticInstanceListener.getAggregated().size(), equalTo(4)); xoManager.delete(a); // @PreDelete and @PostDelete assertThat(StaticInstanceListener.getAggregated().size(), equalTo(6)); xoManager.currentTransaction().commit(); } @Test public void typedInstanceListener() { XOManager xoManager = getXoManager(); TypedInstanceListener typedInstanceListener = new TypedInstanceListener(); xoManager.registerInstanceListener(typedInstanceListener); xoManager.currentTransaction().begin(); A a = xoManager.create(A.class); B b = xoManager.create(B.class); A2B a2b = xoManager.create(a, A2B.class, b); assertThat(typedInstanceListener.getListOfA(), hasItems(a)); assertThat(typedInstanceListener.getListOfB(), hasItems(b)); assertThat(typedInstanceListener.getListOfA2B(), hasItems(a2b)); xoManager.currentTransaction().commit(); } }