package com.venky.swf.sql;
import static junit.framework.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.venky.swf.db.Database;
import com.venky.swf.db.Database.Transaction;
import com.venky.swf.db.model.User;
import com.venky.swf.db.model.reflection.ModelReflector;
import com.venky.swf.db.table.Table;
import com.venky.swf.routing.Router;
import com.venky.swf.test.db.model.SomeTransactionModel;
public class SelectTest {
@BeforeClass
public static void beforeAllTests(){
Router.instance().setLoader(SelectTest.class.getClassLoader());
Database.getTable(SomeTransactionModel.class).truncate();
Database.getInstance().getCurrentTransaction().commit();
Database.getInstance().close();
}
@Before
public void setup(){
User root = new Select().from(User.class).where(new Expression("NAME",Operator.EQ,"root")).execute(User.class).get(0);
Database.getInstance().open(root);
}
@After
public void tearDown(){
Database.getInstance().getCurrentTransaction().rollback(null);
Database.getInstance().close();
}
@Test
public void testCacheRollback() {
Transaction t2 = Database.getInstance().createTransaction();
Transaction t3 = Database.getInstance().createTransaction();
assertEquals(t3,Database.getInstance().getCurrentTransaction());
ModelReflector<SomeTransactionModel> ref = ModelReflector.instance(SomeTransactionModel.class);
Select sel = new Select().from(SomeTransactionModel.class);
assertEquals(0,sel.execute().size());
Table<SomeTransactionModel> t = Database.getTable(SomeTransactionModel.class);
SomeTransactionModel r = t.newRecord();
r.setSomeInt(0);
r.save();
assertEquals(1,sel.execute().size());
assertEquals(1,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, true).size());
assertEquals(1,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, false).size());
t3.rollback(null);
assertEquals(t2,Database.getInstance().getCurrentTransaction());
assertNull(Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, false));
assertEquals(0,sel.execute().size());
assertEquals(0,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, false).size());
t2.rollback(null);
}
@Test
public void testCacheCommit() {
ModelReflector<SomeTransactionModel> ref = ModelReflector.instance(SomeTransactionModel.class);
Select sel = new Select().from(SomeTransactionModel.class);
Table<SomeTransactionModel> t = Database.getTable(SomeTransactionModel.class);
t.truncate();
Transaction t2 = Database.getInstance().createTransaction();
assertEquals(t2,Database.getInstance().getCurrentTransaction());
assertEquals(0,sel.execute().size());
SomeTransactionModel r = t.newRecord();
r.setSomeInt(0);
r.save();
assertEquals(1,sel.execute().size());
assertEquals(1,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, true).size());
assertEquals(1,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, false).size());
Transaction t3 = Database.getInstance().createTransaction();
assertEquals(t3,Database.getInstance().getCurrentTransaction());
assertEquals(1,sel.execute().size());
assertEquals(1,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, true).size());
assertEquals(1,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, false).size());
SomeTransactionModel m2 = t.newRecord();
m2.setSomeInt(0);
m2.save();
assertEquals(2,sel.execute().size());
assertEquals(2,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, true).size());
assertEquals(2,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, false).size());
t3.commit();
assertEquals(t2,Database.getInstance().getCurrentTransaction());
assertNotNull(Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, true));
assertEquals(2,sel.execute().size());
assertEquals(2,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, true).size());
assertEquals(2,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, false).size());
t2.commit();
assertNotNull(Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, true));
assertEquals(2,sel.execute().size());
assertEquals(2,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, true).size());
assertEquals(2,Database.getInstance().getCurrentTransaction().getCache(ref).getCachedResult(null, 0, false).size());
}
}