package siena.base.test;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import siena.Model;
import siena.PersistenceManager;
import siena.PersistenceManagerFactory;
import siena.Query;
import siena.base.test.model.RelatedManyChild;
import siena.base.test.model.RelatedSeveralQueryChild;
import siena.base.test.model.RelatedSeveralQueryNoAsChild;
import siena.base.test.model.RelatedManyParent;
import siena.base.test.model.RelatedSeveralQueryParent;
import siena.base.test.model.RelatedSeveralQueryNoAsParent;
import siena.base.test.model.RelatedSimpleOwnedParent;
import siena.base.test.model.RelatedSimpleOwnedChild;
import siena.base.test.model.RelatedSimpleReferencedChild;
import siena.base.test.model.RelatedSimpleReferencedParent;
public abstract class BaseRelatedTest extends TestCase {
protected PersistenceManager pm;
public abstract PersistenceManager createPersistenceManager(List<Class<?>> classes) throws Exception;
@Override
protected void setUp() throws Exception {
super.setUp();
List<Class<?>> classes = new ArrayList<Class<?>>();
classes.add(RelatedSimpleReferencedParent.class);
classes.add(RelatedSimpleReferencedChild.class);
pm = createPersistenceManager(classes);
PersistenceManagerFactory.install(pm, classes);
for (Class<?> clazz : classes) {
if(!Modifier.isAbstract(clazz.getModifiers())){
pm.createQuery(clazz).delete();
}
}
}
public void testRelatedSimpleReference() {
RelatedSimpleReferencedChild adam1 = new RelatedSimpleReferencedChild("adam1");
adam1.insert();
RelatedSimpleReferencedParent god = new RelatedSimpleReferencedParent("god");
god.child = adam1;
god.insert();
assertNotNull(god.id);
assertNotNull(god.child.id);
RelatedSimpleReferencedParent godbis = Model.getByKey(RelatedSimpleReferencedParent.class, god.id);
RelatedSimpleReferencedChild adam1bis = Model.getByKey(RelatedSimpleReferencedChild.class, godbis.child.id);
assertEquals(god, godbis);
assertEquals(adam1, adam1bis);
}
public void testRelatedSimpleOwned() {
RelatedSimpleOwnedChild adam1 = new RelatedSimpleOwnedChild("adam1");
RelatedSimpleOwnedParent god = new RelatedSimpleOwnedParent("god");
god.child.set(adam1);
god.insert();
assertNotNull(god.id);
assertEquals(god.id, adam1.owner.id);
RelatedSimpleOwnedParent godbis = Model.getByKey(RelatedSimpleOwnedParent.class, god.id);
assertEquals(god, godbis);
assertEquals(adam1, godbis.child.get());
}
public void testRelatedSimpleOwnedNull() {
RelatedSimpleOwnedChild adam1 = new RelatedSimpleOwnedChild("adam1");
RelatedSimpleOwnedParent god = new RelatedSimpleOwnedParent("god");
god.child.set(null);
god.insert();
assertNotNull(god.id);
assertNull(adam1.owner);
RelatedSimpleOwnedParent godbis = Model.getByKey(RelatedSimpleOwnedParent.class, god.id);
assertEquals(god, godbis);
assertNull(godbis.child.get());
}
public void testRelatedSimpleOwnedUpdate() {
RelatedSimpleOwnedChild adam1 = new RelatedSimpleOwnedChild("adam1");
RelatedSimpleOwnedChild adam2 = new RelatedSimpleOwnedChild("adam2");
RelatedSimpleOwnedParent god = new RelatedSimpleOwnedParent("god");
god.child.set(adam1);
god.insert();
assertNotNull(god.id);
assertEquals(god.id, adam1.owner.id);
RelatedSimpleOwnedParent godbis = Model.getByKey(RelatedSimpleOwnedParent.class, god.id);
adam2.insert();
god.child.set(adam2);
god.update();
RelatedSimpleOwnedParent godbis2 = Model.getByKey(RelatedSimpleOwnedParent.class, godbis.id);
assertEquals(god, godbis2);
assertEquals(adam2, godbis2.child.get());
adam1.get();
assertNull(adam1.owner);
}
public void testRelatedSimpleOwnedUpdate2null() {
RelatedSimpleOwnedChild adam1 = new RelatedSimpleOwnedChild("adam1");
RelatedSimpleOwnedParent god = new RelatedSimpleOwnedParent("god");
god.child.set(adam1);
god.insert();
assertNotNull(god.id);
assertEquals(god.id, adam1.owner.id);
RelatedSimpleOwnedParent godbis = Model.getByKey(RelatedSimpleOwnedParent.class, god.id);
god.child.set(null);
god.update();
RelatedSimpleOwnedParent godbis2 = Model.getByKey(RelatedSimpleOwnedParent.class, godbis.id);
assertEquals(god, godbis2);
assertNull(godbis2.child.get());
}
public void testRelatedSeveralQuery() {
RelatedSeveralQueryParent god = new RelatedSeveralQueryParent("god");
god.insert();
RelatedSeveralQueryChild adam1 = new RelatedSeveralQueryChild("adam1");
adam1.owner = god;
adam1.insert();
RelatedSeveralQueryChild adam2 = new RelatedSeveralQueryChild("adam2");
adam2.owner = god;
adam2.insert();
assertNotNull(god.id);
assertEquals(god.id, adam1.owner.id);
assertEquals(god.id, adam2.owner.id);
RelatedSeveralQueryParent godbis = Model.getByKey(RelatedSeveralQueryParent.class, god.id);
List<RelatedSeveralQueryChild> children = godbis.children.fetch();
assertEquals(god, godbis);
assertEquals(adam1, children.get(0));
assertEquals(adam2, children.get(1));
}
public void testRelatedSeveralQueryLotsPaginate() {
RelatedSeveralQueryParent god = new RelatedSeveralQueryParent("god");
god.insert();
List<RelatedSeveralQueryChild> adams = new ArrayList<RelatedSeveralQueryChild>();
for(int i=0; i<100; i++){
RelatedSeveralQueryChild adam = new RelatedSeveralQueryChild("adam"+i);
adam.owner = god;
adam.insert();
adams.add(adam);
}
RelatedSeveralQueryParent godbis = Model.getByKey(RelatedSeveralQueryParent.class, god.id);
assertEquals(god, godbis);
Query<RelatedSeveralQueryChild> q = godbis.children.paginate(10);
List<RelatedSeveralQueryChild> children = q.fetch();
for(int i=0; i<10; i++){
assertEquals(adams.get(i), children.get(i));
}
children = q.nextPage().fetch();
for(int i=0; i<10; i++){
assertEquals(adams.get(i+10), children.get(i));
}
children = q.nextPage().fetch();
for(int i=0; i<10; i++){
assertEquals(adams.get(i+20), children.get(i));
}
children = q.previousPage().fetch();
for(int i=0; i<10; i++){
assertEquals(adams.get(i+10), children.get(i));
}
}
public void testRelatedSeveralQueryNoAs() {
RelatedSeveralQueryNoAsParent god = new RelatedSeveralQueryNoAsParent("god");
god.insert();
RelatedSeveralQueryNoAsChild adam1 = new RelatedSeveralQueryNoAsChild("adam1");
adam1.owner = god;
adam1.insert();
RelatedSeveralQueryNoAsChild adam2 = new RelatedSeveralQueryNoAsChild("adam2");
adam2.owner = god;
adam2.insert();
assertNotNull(god.id);
assertEquals(god.id, adam1.owner.id);
assertEquals(god.id, adam2.owner.id);
RelatedSeveralQueryNoAsParent godbis = Model.getByKey(RelatedSeveralQueryNoAsParent.class, god.id);
List<RelatedSeveralQueryNoAsChild> children = godbis.children.fetch();
assertEquals(god, godbis);
assertEquals(adam1, children.get(0));
assertEquals(adam2, children.get(1));
}
public void testRelatedManyOldInsertWay() {
RelatedManyParent god = new RelatedManyParent("god");
god.insert();
RelatedManyChild adam1 = new RelatedManyChild("adam1");
adam1.owner = god;
adam1.insert();
RelatedManyChild adam2 = new RelatedManyChild("adam2");
adam2.owner = god;
adam2.insert();
assertNotNull(god.id);
assertEquals(god.id, adam1.owner.id);
assertEquals(god.id, adam2.owner.id);
// tries to forcesync on god
god.children.asList().forceSync();
assertEquals(adam1, god.children.asList().get(0));
assertEquals(adam2, god.children.asList().get(1));
RelatedManyParent godbis = Model.getByKey(RelatedManyParent.class, god.id);
List<RelatedManyChild> children = godbis.children.asQuery().fetch();
assertEquals(god, godbis);
assertEquals(adam1, children.get(0));
assertEquals(adam2, children.get(1));
children = godbis.children.asList();
assertEquals(adam1, children.get(0));
assertEquals(adam2, children.get(1));
}
public void testRelatedManyCascadeInsert() {
RelatedManyParent god = new RelatedManyParent("god");
RelatedManyChild adam1 = new RelatedManyChild("adam1");
RelatedManyChild adam2 = new RelatedManyChild("adam2");
god.children.asList().add(adam1);
god.children.asList().add(adam2);
god.insert();
assertNotNull(god.id);
assertNotNull(adam1.id);
assertNotNull(adam2.id);
assertEquals(god.id, adam1.owner.id);
assertEquals(god.id, adam2.owner.id);
RelatedManyParent godbis = Model.getByKey(RelatedManyParent.class, god.id);
List<RelatedManyChild> children = godbis.children.asQuery().fetch();
assertEquals(god, godbis);
assertEquals(adam1, children.get(0));
assertEquals(adam2, children.get(1));
children = godbis.children.asList();
assertEquals(adam1, children.get(0));
assertEquals(adam2, children.get(1));
}
public void testRelatedManyCascadeInsertFetch() {
RelatedManyParent god = new RelatedManyParent("god");
RelatedManyChild adam1 = new RelatedManyChild("adam1");
RelatedManyChild adam2 = new RelatedManyChild("adam2");
god.children.asList().add(adam1);
god.children.asList().add(adam2);
god.insert();
assertNotNull(god.id);
assertNotNull(adam1.id);
assertNotNull(adam2.id);
assertEquals(god.id, adam1.owner.id);
assertEquals(god.id, adam2.owner.id);
RelatedManyParent godbis = Model.all(RelatedManyParent.class).filter("name", god.name).get();
List<RelatedManyChild> children = godbis.children.asQuery().fetch();
assertEquals(god, godbis);
assertEquals(adam1, children.get(0));
assertEquals(adam2, children.get(1));
children = godbis.children.asList();
assertEquals(adam1, children.get(0));
assertEquals(adam2, children.get(1));
}
public void testRelatedManyCascadeInsertMany() {
RelatedManyParent god = new RelatedManyParent("god");
List<RelatedManyChild> adams = new ArrayList<RelatedManyChild>();
for(int i=0; i<100; i++){
RelatedManyChild adam = new RelatedManyChild("adam"+i);
god.children.asList().add(adam);
adams.add(adam);
}
god.insert();
assertNotNull(god.id);
for(int i=0; i<100; i++){
assertNotNull(adams.get(i).id);
assertEquals(god.id, adams.get(i).owner.id);
}
RelatedManyParent godbis = Model.all(RelatedManyParent.class).filter("name", god.name).get();
List<RelatedManyChild> children = godbis.children.asList();
for(int i=0; i<100; i++){
assertEquals(adams.get(i), children.get(i));
}
children = godbis.children.asQuery().fetch();
assertEquals(god, godbis);
for(int i=0; i<100; i++){
assertEquals(adams.get(i), children.get(i));
}
}
public void testRelatedManyCascadeUpdateMany() {
RelatedManyParent god = new RelatedManyParent("god");
List<RelatedManyChild> adams = new ArrayList<RelatedManyChild>();
for(int i=0; i<100; i++){
RelatedManyChild adam = new RelatedManyChild("adam"+i);
god.children.asList().add(adam);
adams.add(adam);
}
god.insert();
assertNotNull(god.id);
for(int i=0; i<100; i++){
assertNotNull(adams.get(i).id);
assertEquals(god.id, adams.get(i).owner.id);
}
// update
adams.get(57).name = "adam57_modified";
adams.get(57).update();
RelatedManyParent godbis = Model.all(RelatedManyParent.class).filter("name", god.name).get();
List<RelatedManyChild> children = godbis.children.asList();
for(int i=0; i<100; i++){
if(i!=57){
assertEquals(adams.get(i), children.get(i));
}else {
assertEquals("adam57_modified", children.get(i).name);
}
}
RelatedManyChild child57 = godbis.children.asQuery().filter("id", adams.get(57).id).get();
assertEquals("adam57_modified", child57.name);
children = god.children.asList().forceSync();
assertEquals(adams.get(57), children.get(57));
}
public void testRelatedManyCascadeUpdateManyRemove() {
RelatedManyParent god = new RelatedManyParent("god");
List<RelatedManyChild> adams = new ArrayList<RelatedManyChild>();
for(int i=0; i<100; i++){
RelatedManyChild adam = new RelatedManyChild("adam"+i);
god.children.asList().add(adam);
adams.add(adam);
}
god.insert();
assertNotNull(god.id);
for(int i=0; i<100; i++){
assertNotNull(adams.get(i).id);
assertEquals(god.id, adams.get(i).owner.id);
}
// update
god.children.asList().remove(57);
god.update();
RelatedManyParent godbis = Model.all(RelatedManyParent.class).filter("name", god.name).get();
List<RelatedManyChild> children = godbis.children.asList();
for(int i=0; i<99; i++){
if(i<57){
assertEquals(adams.get(i), children.get(i));
}else {
assertEquals(adams.get(i+1), children.get(i));
}
}
RelatedManyChild child57 = RelatedManyChild.all().filter("id", adams.get(57).id).get();
assertNull(child57.owner);
}
public void testRelatedManyCascadeUpdateManyAddEnd() {
RelatedManyParent god = new RelatedManyParent("god");
List<RelatedManyChild> adams = new ArrayList<RelatedManyChild>();
for(int i=0; i<100; i++){
RelatedManyChild adam = new RelatedManyChild("adam"+i);
god.children.asList().add(adam);
adams.add(adam);
}
god.insert();
assertNotNull(god.id);
for(int i=0; i<100; i++){
assertNotNull(adams.get(i).id);
assertEquals(god.id, adams.get(i).owner.id);
}
// add
RelatedManyChild adam100 = new RelatedManyChild("adam100");
god.children.asList().add(adam100);
god.update();
RelatedManyParent godbis = Model.all(RelatedManyParent.class).filter("name", god.name).get();
List<RelatedManyChild> children = godbis.children.asList();
for(int i=0; i<101; i++){
if(i<100){
assertEquals(adams.get(i), children.get(i));
}else {
assertEquals(adam100, children.get(i));
}
}
RelatedManyChild child100 = RelatedManyChild.all().filter("id", adam100.id).get();
assertEquals(god.id, child100.owner.id);
}
public void testRelatedManyCascadeUpdateManyAddMiddle() {
// THIS TEST IS WEIRD...
// if you add a item in the middle of the list, it will go at the end when you fetch it
// due to the ordering by ID when calling asList()
RelatedManyParent god = new RelatedManyParent("god");
List<RelatedManyChild> adams = new ArrayList<RelatedManyChild>();
for(int i=0; i<100; i++){
RelatedManyChild adam = new RelatedManyChild("adam"+i);
god.children.asList().add(adam);
adams.add(adam);
}
god.insert();
assertNotNull(god.id);
for(int i=0; i<100; i++){
assertNotNull(adams.get(i).id);
assertEquals(god.id, adams.get(i).owner.id);
}
// add
RelatedManyChild adam_chboing = new RelatedManyChild("adam_chboing");
god.children.asList().add(57, adam_chboing);
god.update();
RelatedManyParent godbis = Model.all(RelatedManyParent.class).filter("name", god.name).get();
List<RelatedManyChild> children = godbis.children.asList();
for(int i=0; i<101; i++){
if(i<100){
assertEquals(adams.get(i), children.get(i));
}else {
assertEquals(adam_chboing, children.get(i));
}
}
RelatedManyChild adam_chboing_bis = RelatedManyChild.all().filter("id", adam_chboing.id).get();
assertEquals(god.id, adam_chboing_bis.owner.id);
}
}