package com.google.sitebricks.persist.sql;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.sitebricks.persist.EntityStore;
import com.google.sitebricks.persist.PersistAopModule;
import com.google.sitebricks.persist.Persister;
import com.google.sitebricks.persist.Work;
import com.jolbox.bonecp.BoneCPConfig;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import javax.inject.Inject;
import javax.inject.Provider;
import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertTrue;
/**
* @author dhanji@gmail.com (Dhanji R. Prasanna)
*/
public class SqlMultipleStoreIntegrationTest {
public static final String A_NAME = "Jason Van Zyl";
private static final String ANOTHER_NAME = "Jason";
public static class SqlSaver {
@Inject @Db1
Provider<Sql> sql1;
@Inject @Db2
Provider<Sql> sql2;
@Work @Db2
public void make() {
sql2.get().execute("insert into my_table (id, name) values (1, @name)",
ImmutableMap.<String, Object>of("name", A_NAME));
}
@Work @Db1
public void make1() {
sql1.get().execute("insert into my_table (id, name) values (1, @name)",
ImmutableMap.<String, Object>of("name", ANOTHER_NAME));
}
@Work @Db2
public String find() {
List<Map<String,Object>> list = sql2.get().list("select * from my_table");
assertFalse(list.isEmpty());
return list.iterator().next().get("name").toString();
}
@Work @Db1
public String find1() {
List<Map<String,Object>> list = sql1.get().list("select * from my_table");
assertFalse(list.isEmpty());
return list.iterator().next().get("name").toString();
}
}
private BoneCPConfig config1;
private BoneCPConfig config2;
@BeforeMethod
public final void pre() {
config1 = new BoneCPConfig();
config1.setJdbcUrl("jdbc:hsqldb:mem:muldb1;sql.syntax_mys=true");
config1.setUsername("sa");
config1.setPassword("");
config1.setPartitionCount(1);
config1.setMaxConnectionsPerPartition(2);
config2 = new BoneCPConfig();
config2.setJdbcUrl("jdbc:hsqldb:mem:muldb2;sql.syntax_mys=true");
config2.setUsername("sa");
config2.setPassword("");
config2.setPartitionCount(1);
config2.setMaxConnectionsPerPartition(2);
}
private static void createTable(Injector injector, Class<? extends Annotation> selector) {
Persister persister = injector.getInstance(Key.get(Persister.class, selector));
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
((Sql) es.delegate()).execute("create table my_table (id integer, name text not null)");
return null;
}
});
final AtomicBoolean tableExists = new AtomicBoolean();
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
tableExists.set(((Sql) es.delegate()).tableExists("my_table"));
return null;
}
});
assertTrue(tableExists.get());
}
@Test
public final void storeAndRetrieve() {
SqlModule db1Module = new SqlModule(Db1.class, config1);
SqlModule db2Module = new SqlModule(Db2.class, config2);
Injector injector = Guice.createInjector(
db2Module,
db1Module,
new PersistAopModule(db2Module),
new PersistAopModule(db1Module));
createTable(injector, Db1.class);
createTable(injector, Db2.class);
SqlSaver saver = injector.getInstance(SqlSaver.class);
saver.make();
saver.make1();
assertEquals(A_NAME, saver.find());
assertEquals(ANOTHER_NAME, saver.find1());
}
}