package org.deephacks.confit.test.integration; import org.deephacks.confit.ConfigChanges; import org.deephacks.confit.ConfigChanges.ConfigChange; import org.deephacks.confit.ConfigContext; import org.deephacks.confit.ConfigObserver; import org.deephacks.confit.admin.AdminContext; import org.deephacks.confit.test.ConfigTestData; import org.deephacks.confit.test.ConfigTestData.Child; import org.deephacks.confit.test.ConfigTestData.Grandfather; import org.deephacks.confit.test.ConfigTestData.Parent; import org.deephacks.confit.test.FeatureTestsRunner; import org.junit.Test; import org.junit.runner.RunWith; import java.util.Arrays; import java.util.Collection; import static org.hamcrest.core.Is.is; import static org.junit.Assert.*; import static org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals; import static org.unitils.reflectionassert.ReflectionComparatorMode.LENIENT_ORDER; @RunWith(FeatureTestsRunner.class) public class IntegrationNotificationTests { private static ConfigContext config = ConfigContext.lookup(); private static AdminContext admin = AdminContext.lookup(); private static TestConfigObserver observer = new TestConfigObserver(); static { config.register(Grandfather.class, Parent.class, Child.class); config.registerObserver(observer); } @Test public void test_simple_create_notification() { Grandfather grandfather = ConfigTestData.getGrandfather("1"); admin.createObject(grandfather); assertThat(observer.getChanges().size(), is(1)); for (ConfigChange<Grandfather> change : observer.getChanges(Grandfather.class)) { assertFalse(change.before().isPresent()); assertTrue(change.after().isPresent()); assertReflectionEquals(change.after().get(), grandfather, LENIENT_ORDER); } } @Test public void test_simple_delete_notification() { Parent parent = ConfigTestData.getParent("1"); admin.createObject(parent); assertThat(observer.getChanges().size(), is(1)); admin.deleteObject(parent); assertThat(observer.getChanges().size(), is(1)); for (ConfigChange<Parent> change : observer.getChanges(Parent.class)) { assertTrue(change.before().isPresent()); assertFalse(change.after().isPresent()); assertReflectionEquals(change.before().get(), parent, LENIENT_ORDER); } } @Test public void test_simple_set_notification() { Parent before = ConfigTestData.getParent("1"); Parent after = ConfigTestData.getParent("1"); admin.createObject(before); assertThat(observer.getChanges().size(), is(1)); after.setProp1("new"); admin.setObject(after); for (ConfigChange<Parent> change : observer.getChanges(Parent.class)) { assertTrue(change.before().isPresent()); assertTrue(change.after().isPresent()); Parent beforeChange = change.before().get(); Parent afterChange = change.after().get(); assertReflectionEquals(beforeChange, before, LENIENT_ORDER); assertReflectionEquals(afterChange, after, LENIENT_ORDER); } } @Test public void test_simple_merge_notification() { Parent before = ConfigTestData.getParent("1"); Parent after = new Parent("1"); admin.createObject(before); assertThat(observer.getChanges().size(), is(1)); after.setProp1("new"); admin.mergeObject(after); for (ConfigChange<Parent> change : observer.getChanges(Parent.class)) { assertTrue(change.before().isPresent()); assertTrue(change.after().isPresent()); Parent beforeChange = change.before().get(); Parent afterChange = change.after().get(); assertReflectionEquals(beforeChange, before, LENIENT_ORDER); assertReflectionEquals(afterChange, after, LENIENT_ORDER); } } @Test public void test_advanced_create_notification() { Grandfather grandfather = ConfigTestData.getGrandfather("1"); Parent parent = ConfigTestData.getParent("1"); Child child = ConfigTestData.getChild("1"); parent.add(child); grandfather.add(parent); admin.createObjects(Arrays.asList(grandfather, parent, child)); assertThat(observer.getChanges().size(), is(3)); for (ConfigChange<Grandfather> change : observer.getChanges(Grandfather.class)) { assertFalse(change.before().isPresent()); assertTrue(change.after().isPresent()); assertReflectionEquals(grandfather, change.after().get(), LENIENT_ORDER); } for (ConfigChange<Parent> change : observer.getChanges(Parent.class)) { assertFalse(change.before().isPresent()); assertTrue(change.after().isPresent()); assertReflectionEquals(parent, change.after().get(), LENIENT_ORDER); } for (ConfigChange<Child> change : observer.getChanges(Child.class)) { assertFalse(change.before().isPresent()); assertTrue(change.after().isPresent()); assertReflectionEquals(child, change.after().get(), LENIENT_ORDER); } } @Test public void test_advanced_delete_notification() { Parent p1 = ConfigTestData.getParent("1"); Parent p2 = ConfigTestData.getParent("2"); Parent p3 = ConfigTestData.getParent("3"); admin.createObjects(Arrays.asList(p1, p2, p3)); assertThat(observer.getChanges().size(), is(3)); admin.delete(ConfigTestData.PARENT_SCHEMA_NAME, Arrays.asList("1", "2", "3")); assertThat(observer.getChanges().size(), is(3)); for (ConfigChange<Parent> change : observer.getChanges(Parent.class)) { assertTrue(change.before().isPresent()); assertFalse(change.after().isPresent()); if (change.before().get().getId().equals("1")) { assertReflectionEquals(p1, change.before().get(), LENIENT_ORDER); } else if (change.before().get().getId().equals("2")) { assertReflectionEquals(p2, change.before().get(), LENIENT_ORDER); } else if (change.before().get().getId().equals("3")) { assertReflectionEquals(p3, change.before().get(), LENIENT_ORDER); } else { fail("change not recognized"); } } } @Test public void test_advanced_set_notification() { Grandfather grandfather = ConfigTestData.getGrandfather("1"); Parent parent = ConfigTestData.getParent("1"); Child child = ConfigTestData.getChild("1"); parent.add(child); grandfather.add(parent); Grandfather grandfatherAfter = ConfigTestData.getGrandfather("1"); Parent parentAfter = ConfigTestData.getParent("1"); Child childAfter = ConfigTestData.getChild("1"); parentAfter.add(childAfter); grandfatherAfter.add(parentAfter); admin.createObjects(Arrays.asList(grandfather, parent, child)); assertThat(observer.getChanges().size(), is(3)); grandfatherAfter.setProp1("new"); parentAfter.setProp1("new"); childAfter.setProp1("new"); admin.setObjects(Arrays.asList(grandfatherAfter, parentAfter, childAfter)); assertThat(observer.getChanges().size(), is(3)); for (ConfigChange<Grandfather> change : observer.getChanges(Grandfather.class)) { assertTrue(change.before().isPresent()); assertTrue(change.after().isPresent()); assertReflectionEquals(grandfather, change.before().get(), LENIENT_ORDER); assertReflectionEquals(grandfatherAfter, change.after().get(), LENIENT_ORDER); } for (ConfigChange<Parent> change : observer.getChanges(Parent.class)) { assertTrue(change.before().isPresent()); assertTrue(change.after().isPresent()); assertReflectionEquals(parent, change.before().get(), LENIENT_ORDER); assertReflectionEquals(parentAfter, change.after().get() , LENIENT_ORDER); } for (ConfigChange<Child> change : observer.getChanges(Child.class)) { assertTrue(change.before().isPresent()); assertTrue(change.after().isPresent()); assertReflectionEquals(child, change.before().get(), LENIENT_ORDER); assertReflectionEquals(childAfter, change.after().get(), LENIENT_ORDER); } } @Test public void test_advanced_merge_notification() { Grandfather grandfather = ConfigTestData.getGrandfather("1"); Parent parent = ConfigTestData.getParent("1"); Child child = ConfigTestData.getChild("1"); parent.add(child); grandfather.add(parent); Grandfather grandfatherAfter = ConfigTestData.getGrandfather("1"); Parent parentAfter = ConfigTestData.getParent("1"); Child childAfter = ConfigTestData.getChild("1"); parentAfter.add(childAfter); grandfatherAfter.add(parentAfter); admin.createObjects(Arrays.asList(grandfather, parent, child)); assertThat(observer.getChanges().size(), is(3)); grandfatherAfter.setProp1("new"); parentAfter.setProp1("new"); childAfter.setProp1("new"); admin.mergeObjects(Arrays.asList(grandfatherAfter, parentAfter, childAfter)); assertThat(observer.getChanges().size(), is(3)); for (ConfigChange<Grandfather> change : observer.getChanges(Grandfather.class)) { assertTrue(change.before().isPresent()); assertTrue(change.after().isPresent()); assertReflectionEquals(grandfather, change.before().get(), LENIENT_ORDER); assertReflectionEquals(grandfatherAfter, change.after().get(), LENIENT_ORDER); } for (ConfigChange<Parent> change : observer.getChanges(Parent.class)) { assertTrue(change.before().isPresent()); assertTrue(change.after().isPresent()); assertReflectionEquals(parent, change.before().get(), LENIENT_ORDER); assertReflectionEquals(parentAfter, change.after().get() , LENIENT_ORDER); } for (ConfigChange<Child> change : observer.getChanges(Child.class)) { assertTrue(change.before().isPresent()); assertTrue(change.after().isPresent()); assertReflectionEquals(child, change.before().get(), LENIENT_ORDER); assertReflectionEquals(childAfter, change.after().get(), LENIENT_ORDER); } } public static class TestConfigObserver implements ConfigObserver { private ConfigChanges changes = new ConfigChanges(); @Override public void notify(ConfigChanges changes) { this.changes = changes; } public ConfigChanges getChanges() { return changes; } public <T> Collection<ConfigChange<T>> getChanges(Class<T> cls) { return changes.getChanges(cls); } public <T> ConfigChange<T> getFirstChange(Class<T> cls) { return changes.getChanges(cls).iterator().next(); } public <T> T getFirstAfter(Class<T> cls) { return getFirstChange(cls).after().get(); } public <T> T getFirstBefore(Class<T> cls) { return getFirstChange(cls).before().get(); } public void clear() { changes = new ConfigChanges(); } public <T> boolean isBeforePresent(Class<T> cls) { return getFirstChange(cls).before().isPresent(); } public <T> boolean isAfterPresent(Class<T> cls) { return getFirstChange(cls).after().isPresent(); } } }