package org.tests.family;
import io.ebean.BaseTestCase;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.deploy.BeanProperty;
import io.ebeaninternal.server.deploy.BeanPropertyAssocOne;
import org.tests.model.basic.EBasic;
import org.tests.model.family.ChildPerson;
import org.tests.model.family.GrandParentPerson;
import org.tests.model.family.ParentPerson;
import org.junit.Test;
import static org.junit.Assert.*;
public class TestInheritance extends BaseTestCase {
@Test
public void testDescriptor() {
BeanDescriptor<GrandParentPerson> desc = spiEbeanServer().getBeanDescriptor(GrandParentPerson.class);
BeanProperty prop1 = desc.getBeanProperty("someBean");
BeanProperty prop2 = desc.getBeanProperty("effectiveBean");
assertEquals(BeanPropertyAssocOne.class, prop1.getClass());
assertEquals(BeanPropertyAssocOne.class, prop2.getClass());
}
/**
* <pre>
* grandparent1 Josef Foo(65) from Munich
* +- parent1 Maria Bar (40) has someBean1
* | +- child1 Fred(13) has someBean2
* | '- child2 Julia Baz(8)
* +- parent2 Sandra (50) from Berlin
* | '- child3 Roland(36)
* +- parent3 Michael(60)
* </pre>
*/
@Test
public void testInheritance() {
// create some other beans
EBasic someBean1 = new EBasic();
someBean1.setName("A Bean");
server().save(someBean1);
EBasic someBean2 = new EBasic();
someBean2.setName("An other Bean");
server().save(someBean2);
ChildPerson child1 = new ChildPerson();
child1.setAge(13);
child1.setName("Fred");
ChildPerson child2 = new ChildPerson();
child2.setAge(8);
child2.setFamilyName("Baz");
child2.setName("Julia");
ChildPerson child3 = new ChildPerson();
child3.setAge(36);
child3.setName("Roland");
ParentPerson parent1 = new ParentPerson();
parent1.setAge(40);
parent1.setName("Maria");
parent1.setFamilyName("Bar");
parent1.setSomeBean(someBean1);
child1.setSomeBean(someBean2);
parent1.getChildren().add(child1);
parent1.getChildren().add(child2);
ParentPerson parent2 = new ParentPerson();
parent2.setAge(50);
parent2.setName("Sandra");
parent2.getChildren().add(child3);
parent2.setAddress("Berlin");
ParentPerson parent3 = new ParentPerson();
parent3.setAge(60);
parent3.setName("Michael");
GrandParentPerson grandparent1 = new GrandParentPerson();
grandparent1.setAge(65);
grandparent1.setName("Josef");
grandparent1.setFamilyName("Foo");
grandparent1.setAddress("Munich");
grandparent1.getChildren().add(parent1);
grandparent1.getChildren().add(parent2);
grandparent1.getChildren().add(parent3);
server().save(grandparent1);
// Test setup complete, so retrieve bean from db
//grandparent1 = server().find(GrandParentPerson.class).setId(grandparent1.getIdentifier()).where()
// .in("effectiveBean.id",2,null) // geht nicht!
// .findUnique();
parent1 = server().find(ParentPerson.class).setId(1).fetch("someBean").findUnique();
assertEquals("A Bean", parent1.getSomeBean().getName());
grandparent1 = server().find(GrandParentPerson.class)
.fetch("children", "*") // FIXME If I do not fetch childrenBean, I will get an exception
.fetch("children.effectiveBean", "*")
.fetch("children.children", "*")
.fetch("children.children.effectiveBean", "*")
.setId(grandparent1.getIdentifier()).where()
.or()
.in("effectiveBean.id", 1)
.isNull("effectiveBean.id")
.endOr()
.findUnique();
assertNotNull(grandparent1);
// check if aggregation works
assertEquals(3, grandparent1.getChildCount().intValue());
assertEquals(150, grandparent1.getTotalAge().intValue());
// check normal properties
assertEquals("Josef", grandparent1.getName());
assertEquals("Foo", grandparent1.getFamilyName());
assertEquals("Munich", grandparent1.getAddress());
assertEquals(1, grandparent1.getEffectiveBean().getId().intValue());
// now check children of grandparent
parent1 = grandparent1.getChildren().get(0);
parent2 = grandparent1.getChildren().get(1);
parent3 = grandparent1.getChildren().get(2);
assertNotNull(parent1);
assertNotNull(parent2);
assertNotNull(parent3);
// parent1
assertEquals("Maria", parent1.getName());
assertEquals("Bar", parent1.getFamilyName()); // overwritten family name
assertEquals("Bar", parent1.getEffectiveFamilyName()); // test inheritance
assertNull(parent1.getAddress()); // no alternative address set
assertEquals("Munich", parent1.getEffectiveAddress()); // -> inherit munich
assertEquals(2, parent1.getChildCount().intValue());
assertEquals(21, parent1.getTotalAge().intValue());
assertEquals("A Bean", parent1.getEffectiveBean().getName());
// parent2
assertEquals("Sandra", parent2.getName());
assertNull(parent2.getFamilyName());
assertEquals("Foo", parent2.getEffectiveFamilyName());
assertEquals("Berlin", parent2.getAddress());
assertEquals("Berlin", parent2.getEffectiveAddress());
assertEquals(1, parent2.getChildCount().intValue());
assertEquals(36, parent2.getTotalAge().intValue());
assertNull(parent2.getEffectiveBean());
// parent3
assertEquals("Michael", parent3.getName());
assertNull(parent3.getFamilyName());
assertEquals("Foo", parent3.getEffectiveFamilyName());
assertNull(parent3.getAddress());
assertEquals("Munich", parent3.getEffectiveAddress());
assertEquals(0, parent3.getChildCount().intValue());
assertEquals(0, parent3.getTotalAge().intValue());
assertNull(parent3.getEffectiveBean());
child1 = parent1.getChildren().get(0);
child2 = parent1.getChildren().get(1);
child3 = parent2.getChildren().get(0);
assertNotNull(child1);
assertNotNull(child2);
assertNotNull(child3);
assertEquals("Bar", child1.getEffectiveFamilyName());
assertEquals("Munich", child1.getEffectiveAddress());
assertEquals("An other Bean", child1.getSomeBean().getName());
assertEquals("An other Bean", child1.getEffectiveBean().getName());
assertTrue(child1.getSomeBean() == child1.getEffectiveBean());
assertEquals("Baz", child2.getEffectiveFamilyName());
assertEquals("Munich", child2.getEffectiveAddress());
assertNull(child2.getSomeBean());
assertEquals("A Bean", child2.getEffectiveBean().getName());
assertEquals("Foo", child3.getEffectiveFamilyName());
assertEquals("Berlin", child3.getEffectiveAddress());
assertNull(child3.getEffectiveBean());
// Now start from bottom up
child2 = server().find(ChildPerson.class).where().eq("name", "Julia").select("parent.name").findUnique();
assertEquals("Baz", child2.getEffectiveFamilyName());
assertEquals("Munich", child2.getEffectiveAddress());
assertNull(child2.getSomeBean());
assertEquals("A Bean", child2.getEffectiveBean().getName());
parent1 = child2.getParent();
assertEquals("Maria", parent1.getName());
assertEquals("Bar", parent1.getFamilyName()); // overwritten family name
assertEquals("Bar", parent1.getEffectiveFamilyName()); // test inheritance
assertNull(parent1.getAddress()); // no alternative address set
assertEquals("Munich", parent1.getEffectiveAddress()); // -> inherit munich
assertEquals(2, parent1.getChildCount().intValue());
assertEquals(21, parent1.getTotalAge().intValue());
assertEquals("A Bean", parent1.getEffectiveBean().getName());
grandparent1 = parent1.getParent();
// check if aggregation works
assertEquals(3, grandparent1.getChildCount().intValue());
assertEquals(150, grandparent1.getTotalAge().intValue());
// check normal properties
assertEquals("Josef", grandparent1.getName());
assertEquals("Foo", grandparent1.getFamilyName());
assertEquals("Munich", grandparent1.getAddress());
assertEquals(1, grandparent1.getEffectiveBean().getId().intValue());
}
}