package org.deephacks.confit.internal.jaxrs;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import com.google.common.base.Optional;
import org.deephacks.confit.internal.core.config.DefaultBeanManager;
import org.deephacks.confit.jaxrs.AdminContextJaxrsProxy;
import org.deephacks.confit.model.AbortRuntimeException;
import org.deephacks.confit.model.Bean;
import org.deephacks.confit.model.BeanId;
import org.deephacks.confit.model.Schema;
import org.deephacks.confit.spi.SchemaManager;
import org.deephacks.confit.test.ConfigTestData.*;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import static org.deephacks.confit.model.Events.CFG090;
import static org.deephacks.confit.model.Events.CFG101;
import static org.deephacks.confit.test.ConfigTestData.*;
import static org.deephacks.confit.test.ConversionUtils.toBean;
import static org.deephacks.confit.test.ConversionUtils.toBeans;
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;
public class JaxrsConfigEndpointTest {
static {
Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
root.setLevel(Level.INFO);
}
/** Usually cast to AdminContext, but keep as proxy is nice for test debugging */
private AdminContextJaxrsProxy admin = AdminContextJaxrsProxy.get("localhost", 8080);
private Grandfather g1 = getGrandfather("g1");
private Grandfather g2 = getGrandfather("g2");
private Grandfather g3 = getGrandfather("g3");
private Parent p1 = getParent("p1");
private Parent p2 = getParent("p2");
private Parent p3 = getParent("p3");
private Collection<Grandfather> grandfathers = Arrays.asList(g1, g2, g3);
private Collection<Parent> parents = Arrays.asList(p1, p2, p3);
private Collection<Bean> grandfathersBeans;
private Collection<Bean> parentBeans;
private SchemaManager schemaManager = SchemaManager.lookup();
@BeforeClass
public static void beforeClass(){
JettyServer.start();
}
@Before
public void before(){
DefaultBeanManager.clear();
grandfathersBeans = toBeans(g1, g2, g3);
parentBeans = toBeans(p1, p2, p3);
}
@Test
public void testGetBean() {
Optional<Bean> optional = admin.get(BeanId.create("bogus", "bogus"));
assertFalse(optional.isPresent());
Bean bg1 = toBean(g1);
admin.create(bg1);
Optional<Bean> bean = admin.get(g1.getBeanId());
assertTrue(bean.isPresent());
assertReflectionEquals(bg1, bean.get(), LENIENT_ORDER);
}
@Test
public void testGetSingleton() {
Optional<Singleton> optional = admin.get(Singleton.class);
assertFalse(optional.isPresent());
Singleton s = new Singleton();
Bean bs = toBean(s);
admin.create(bs);
Optional<Bean> bean = admin.get(s.getBeanId());
assertTrue(bean.isPresent());
assertReflectionEquals(bs, bean.get(), LENIENT_ORDER);
}
@Test
public void testGetObject() {
Optional<Grandfather> optional = admin.get(Grandfather.class, "g1");
assertFalse(optional.isPresent());
admin.createObject(g1);
optional = admin.get(Grandfather.class, "g1");
assertTrue(optional.isPresent());
assertReflectionEquals(toBean(g1), toBean(optional.get()), LENIENT_ORDER);
}
@Test
public void testListBean(){
List<Bean> beans = admin.list(GRANDFATHER_SCHEMA_NAME);
assertThat(beans.size(), is(0));
admin.create(grandfathersBeans);
beans = admin.list(GRANDFATHER_SCHEMA_NAME);
assertThat(beans.size(), is(3));
assertReflectionEquals(grandfathersBeans, beans, LENIENT_ORDER);
try {
admin.list("bogus");
fail("Cannot list unregistered schema");
} catch (AbortRuntimeException e) {
assertThat(e.getEvent().getCode(), is(CFG101));
}
}
@Test
public void testListObjects() {
Collection<Parent> objects = admin.list(Parent.class);
assertThat(objects.size(), is(0));
admin.createObjects(parents);
objects = admin.list(Parent.class);
assertThat(objects.size(), is(3));
assertReflectionEquals(parentBeans, toBeans(objects.toArray(new Object[objects.size()])), LENIENT_ORDER);
try {
admin.list(String.class);
fail("Cannot list unregistered schema");
} catch (AbortRuntimeException e) {
assertThat(e.getEvent().getCode(), is(CFG101));
}
}
@Test
public void testListBeans() {
try {
admin.list("schemaName", Arrays.asList("c1", "c2"));
fail("Cannot list unregistered schema");
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response, hence CFG090 and not CFG101/CDG304
assertThat(e.getEvent().getCode(), is(CFG090));
}
admin.create(grandfathersBeans);
Collection<Bean> beans = admin.list(GRANDFATHER_SCHEMA_NAME, Arrays.asList("g1", "g2"));
assertThat(beans.size(), is(2));
Collection<Bean> expected = toBeans(g1, g2);
assertReflectionEquals(expected, beans, LENIENT_ORDER);
}
@Test
public void testCreateBean() {
// tested from lookup tests
}
@Test
public void testCreateObject() {
// tested from lookup tests
}
@Test
public void testCreateBeans() {
// tested from list tests
}
@Test
public void testCreateObjects() {
// tested from list tests
}
@Test
public void testSetBean() {
try {
admin.set(Bean.create(BeanId.create("bogus", "bogus")));
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response, hence CFG090 and not CFG101/CDG304
assertThat(e.getEvent().getCode(), is(CFG090));
}
Grandfather g1 = new Grandfather("g1");
Bean bg1 = toBean(g1);
admin.create(bg1);
bg1.setProperty("prop1", "testSetBean");
admin.set(bg1);
Optional<Bean> optional = admin.get(bg1.getId());
assertTrue(optional.isPresent());
// assert new value
String value = optional.get().getSingleValue("prop1");
assertThat(value, is("testSetBean"));
// assert that other values have been reset
assertThat(optional.get().getSingleValue("prop9"), is("0"));
assertNull(optional.get().getSingleValue("prop2"));
}
@Test
public void testSetObject() {
try {
admin.setObject("");
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response
assertThat(e.getEvent().getCode(), is(CFG090));
}
assertFalse(admin.get(Grandfather.class, "g1").isPresent());
admin.createObject(g1);
g1 = new Grandfather("g1");
g1.setProp1("testSetObject");
admin.setObject(g1);
Optional<Grandfather> optional = admin.get(Grandfather.class, "g1");
assertTrue(optional.isPresent());
assertThat(optional.get().getProp1(), is("testSetObject"));
assertThat(optional.get().getProp9(), is(0L));
assertNull(optional.get().getProp2());
}
@Test
public void testSetBeans() {
try {
admin.set(Arrays.asList(Bean.create(BeanId.create("bogus", "bogus"))));
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response, hence CFG090 and not CFG101/CDG304
assertThat(e.getEvent().getCode(), is(CFG090));
}
admin.create(grandfathersBeans);
// assert successful create
Optional<Bean> optional = admin.get(BeanId.create("g1", GRANDFATHER_SCHEMA_NAME));
assertTrue(optional.isPresent());
assertNotNull(optional.get().getSingleValue("prop9"));
assertNotNull(optional.get().getSingleValue("prop2"));
Grandfather g1 = new Grandfather("g1");
g1.setProp1("testSetBeans1");
Grandfather g2 = new Grandfather("g2");
g2.setProp1("testSetBeans2");
Collection<Bean> beans = toBeans(g1, g2);
admin.set(beans);
// test g1
optional = admin.get(BeanId.create("g1", GRANDFATHER_SCHEMA_NAME));
assertTrue(optional.isPresent());
// assert that new value have been set
assertThat(optional.get().getSingleValue("prop1"), is("testSetBeans1"));
// assert that previously set value have been reset
assertThat(optional.get().getSingleValue("prop9"), is("0"));
// test g2
optional = admin.get(BeanId.create("g2", GRANDFATHER_SCHEMA_NAME));
assertTrue(optional.isPresent());
// assert that new value have been set
assertThat(optional.get().getSingleValue("prop1"), is("testSetBeans2"));
// assert that previously set value have been reset
assertNull(optional.get().getSingleValue("prop2"));
}
@Test
public void testSetObjects() {
try {
admin.setObjects(Arrays.asList(new Grandfather("bogus")));
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response, hence CFG090 and not CFG101/CDG304
assertThat(e.getEvent().getCode(), is(CFG090));
}
admin.createObjects(grandfathers);
// assert successful create
Optional<Grandfather> optional = admin.get(Grandfather.class, "g1");
assertTrue(optional.isPresent());
Grandfather g1 = new Grandfather("g1");
g1.setProp1("testSetObjects1");
Grandfather g2 = new Grandfather("g2");
g2.setProp1("testSetObjects2");
admin.setObjects(Arrays.asList(g1, g2));
// test g1
optional = admin.get(Grandfather.class, "g1");
assertTrue(optional.isPresent());
// assert that new value have been set
assertThat(optional.get().getProp1(), is("testSetObjects1"));
// assert that previously set value have been reset
assertThat(optional.get().getProp9(), is(0L));
// test g2
optional = admin.get(Grandfather.class, "g2");
assertTrue(optional.isPresent());
// assert that new value have been set
assertThat(optional.get().getProp1(), is("testSetObjects2"));
// assert that previously set value have been reset
assertNull(optional.get().getProp2());
}
@Test
public void testMergeBean() {
try {
admin.merge(Bean.create(BeanId.create("bogus", "bogus")));
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response, hence CFG090 and not CFG101/CDG304
assertThat(e.getEvent().getCode(), is(CFG090));
}
Grandfather g1 = getGrandfather("g1");
Bean bg1 = toBean(g1);
admin.create(bg1);
// merge in a single property
g1 = new Grandfather("g1");
bg1 = toBean(g1);
bg1.setProperty("prop1", "testMergeBean");
admin.merge(bg1);
Optional<Bean> optional = admin.get(bg1.getId());
assertTrue(optional.isPresent());
// assert new value
String value = optional.get().getSingleValue("prop1");
assertThat(value, is("testMergeBean"));
// assert that other values are untouched
assertNotNull(optional.get().getSingleValue("prop9"));
assertNotNull(optional.get().getSingleValue("prop2"));
}
@Test
public void mergeObject() {
try {
admin.mergeObject("");
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response
assertThat(e.getEvent().getCode(), is(CFG090));
}
assertFalse(admin.get(Grandfather.class, "g1").isPresent());
admin.createObject(g1);
g1 = new Grandfather("g1");
g1.setProp1("testSetObject");
admin.mergeObject(g1);
Optional<Grandfather> optional = admin.get(Grandfather.class, "g1");
assertTrue(optional.isPresent());
assertThat(optional.get().getProp1(), is("testSetObject"));
assertNotNull(optional.get().getProp9());
assertNotNull(optional.get().getProp2());
}
@Test
public void testMergeBeans() {
try {
admin.merge(Bean.create(BeanId.create("bogus", "bogus")));
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response, hence CFG090 and not CFG101/CDG304
assertThat(e.getEvent().getCode(), is(CFG090));
}
admin.create(grandfathersBeans);
// assert successful create
Optional<Bean> optional = admin.get(BeanId.create("g1", GRANDFATHER_SCHEMA_NAME));
assertTrue(optional.isPresent());
String prop9 = optional.get().getSingleValue("prop9");
String prop2 = optional.get().getSingleValue("prop2");
Grandfather g1 = new Grandfather("g1");
g1.setProp1("testMergeBean1");
Grandfather g2 = new Grandfather("g2");
g2.setProp1("testMergeBean2");
Collection<Bean> beans = toBeans(g1, g2);
admin.merge(beans);
// test g1
optional = admin.get(BeanId.create("g1", GRANDFATHER_SCHEMA_NAME));
assertTrue(optional.isPresent());
// assert that new value have been set
assertThat(optional.get().getSingleValue("prop1"), is("testMergeBean1"));
// assert that previous values are untouched
assertThat(optional.get().getSingleValue("prop9"), is("0"));
assertThat(optional.get().getSingleValue("prop2"), is(prop2));
// test g2
optional = admin.get(BeanId.create("g2", GRANDFATHER_SCHEMA_NAME));
assertTrue(optional.isPresent());
// assert that new value have been set
assertThat(optional.get().getSingleValue("prop1"), is("testMergeBean2"));
// assert that previous values are untouched
assertThat(optional.get().getSingleValue("prop9"), is("0"));
assertThat(optional.get().getSingleValue("prop2"), is(prop2));
}
@Test
public void testMergeObjects() {
try {
admin.mergeObjects(Arrays.asList(new Grandfather("bogus")));
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response, hence CFG090 and not CFG101/CDG304
assertThat(e.getEvent().getCode(), is(CFG090));
}
admin.createObjects(grandfathers);
// assert successful create
Optional<Grandfather> optional = admin.get(Grandfather.class, "g1");
assertTrue(optional.isPresent());
Grandfather g1 = new Grandfather("g1");
g1.setProp1("testSetObjects1");
Grandfather g2 = new Grandfather("g2");
g2.setProp1("testSetObjects2");
admin.mergeObjects(Arrays.asList(g1, g2));
// test g1
optional = admin.get(Grandfather.class, "g1");
assertTrue(optional.isPresent());
// assert that new value have been set
assertThat(optional.get().getProp1(), is("testSetObjects1"));
// assert that previously set value have been reset
assertNotNull(optional.get().getProp9());
// test g2
optional = admin.get(Grandfather.class, "g2");
assertTrue(optional.isPresent());
// assert that new value have been set
assertThat(optional.get().getProp1(), is("testSetObjects2"));
// assert that previously set value have been reset
assertNotNull(optional.get().getProp2());
}
@Test
public void testDeleteBean() {
BeanId id = BeanId.create("g1", GRANDFATHER_SCHEMA_NAME);
try {
admin.delete(id);
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response, hence CFG090 and not CFG101/CDG304
assertThat(e.getEvent().getCode(), is(CFG090));
}
admin.create(toBean(g1));
Optional<Bean> optional = admin.get(id);
assertTrue(optional.isPresent());
admin.delete(id);
optional = admin.get(id);
assertFalse(optional.isPresent());
}
@Test
public void testDeleteBeans() {
try {
admin.delete(GRANDFATHER_SCHEMA_NAME, Arrays.asList("g1", "g2"));
} catch (AbortRuntimeException e) {
// don't know if schema or instances were invalid from
// a HTTP 404 response, hence CFG090 and not CFG101/CDG304
assertThat(e.getEvent().getCode(), is(CFG090));
}
admin.create(grandfathersBeans);
Collection<Bean> beans = admin.list(GRANDFATHER_SCHEMA_NAME);
assertThat(beans.size(), is(grandfathersBeans.size()));
admin.delete(GRANDFATHER_SCHEMA_NAME, Arrays.asList("g1", "g2"));
Optional<Bean> optional = admin.get(BeanId.create("g1", GRANDFATHER_SCHEMA_NAME));
assertFalse(optional.isPresent());
optional = admin.get(BeanId.create("g2", GRANDFATHER_SCHEMA_NAME));
assertFalse(optional.isPresent());
optional = admin.get(BeanId.create("g3", GRANDFATHER_SCHEMA_NAME));
assertTrue(optional.isPresent());
}
@Test
public void testGetSchemas() {
final Map<String,Schema> schemas = admin.getSchemas();
assertThat(schemas.values().size(), is(5));
for (Schema schema : schemas.values()) {
Schema expected = schemaManager.getSchema(schema.getClassType());
assertReflectionEquals(expected, schema, LENIENT_ORDER);
}
}
@Test
public void testGetSchema() {
Optional<Schema> optional = admin.getSchema("bogus");
assertFalse(optional.isPresent());
optional = admin.getSchema(GRANDFATHER_SCHEMA_NAME);
assertTrue(optional.isPresent());
Schema schema = optional.get();
Schema expected = schemaManager.getSchema(Grandfather.class);
assertReflectionEquals(expected, schema, LENIENT_ORDER);
}
@Test
public void testReferences() {
Grandfather g = new Grandfather();
Parent p1 = new Parent("p1");
Child c1 = new Child("c1");
p1.setProp6(c1);
admin.createObjects(Arrays.asList(c1, p1));
Optional<Parent> p = admin.get(Parent.class, "p1");
System.out.println(p.get().getProp6());
}
@Test
public void testQuery() {
/*
admin.newQuery("bogus").retrieve();
*/
}
}