package com.google.sitebricks.persist.disk;
import com.google.common.collect.ImmutableList;
import com.google.inject.Guice;
import com.google.sitebricks.persist.EntityStore;
import com.google.sitebricks.persist.Persister;
import org.apache.commons.io.FileUtils;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicInteger;
import static com.google.sitebricks.persist.EntityQuery.FieldMatcher.*;
import static org.testng.Assert.*;
import static org.testng.AssertJUnit.assertNull;
/**
* @author dhanji@gmail.com (Dhanji R. Prasanna)
*/
public class DiskStoreIntegrationTest {
public static final String STORE_DIR = "target/storedir";
private static final AtomicInteger testRun = new AtomicInteger();
private Persister persister;
@BeforeMethod
public void pre() throws IOException {
persister = Guice.createInjector(new DiskModule(STORE_DIR + testRun.incrementAndGet()) {
@Override
protected void configurePersistence() {
disableAutoStart();
addPersistent(MyEntity.class);
addPersistent(MyCompositeKeyEntity.class);
}
}).getInstance(Persister.class);
persister.start();
}
@AfterMethod
public void post() throws IOException {
persister.shutdown();
try {
FileUtils.deleteDirectory(new File(STORE_DIR + testRun.get()));
} catch (IOException e) {
e.printStackTrace();
// Can't do much really.
}
}
@Test
public final void storeAndRetrieve() {
final Integer id = 6;
final MyEntity myEntity = new MyEntity();
myEntity.setId(id);
myEntity.setAge(123);
myEntity.setName("Aspod812joijas");
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(myEntity);
return null;
}
});
Object found = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
return es.find(MyEntity.class, id);
}
});
assertEquals(found, myEntity);
}
@Test
public final void storeAndRemove() {
final Integer id = 6;
final MyEntity myEntity = new MyEntity();
myEntity.setId(id);
myEntity.setAge(123);
myEntity.setName("Aspod812joijas");
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(myEntity);
return null;
}
});
Object all = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
return es.all(MyEntity.class);
}
});
assertNotNull(all);
assertEquals(ImmutableList.of(myEntity), all);
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.remove(MyEntity.class, id);
return null;
}
});
Object found = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
return es.find(MyEntity.class, id);
}
});
assertNull(found);
all = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
return es.all(MyEntity.class);
}
});
assertNull(all);
}
@Test
public final void storeAndRetrieveMultiple() {
final Integer id = 6;
final MyEntity myEntity = new MyEntity();
myEntity.setId(id);
myEntity.setAge(123);
myEntity.setName("Aspod812joijas");
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(myEntity);
myEntity.setId(7);
es.save(myEntity);
return null;
}
});
Object found = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
return es.find(MyEntity.class, id + 1);
}
});
assertEquals(found, myEntity);
}
@Test
public final void storeAndRetrieveCompositeKey() {
final MyCompositeKeyEntity myEntity = new MyCompositeKeyEntity();
final MyCompositeKeyEntity.CompositeKey key = new MyCompositeKeyEntity.CompositeKey();
key.setKeyPart1("pokqspokda");
key.setKeyPart2("01012930");
final MyCompositeKeyEntity.CompositeKey key2 = new MyCompositeKeyEntity.CompositeKey();
key2.setKeyPart1("asijdia");
key2.setKeyPart2("aopskdpok");
myEntity.setId(key);
myEntity.setAge(123);
myEntity.setName("Aspod812joijas");
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(myEntity);
myEntity.setId(key2);
es.save(myEntity);
return null;
}
});
Object found = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
return es.find(MyCompositeKeyEntity.class, key2);
}
});
assertEquals(found, myEntity);
}
@Test
public final void storeAndQuery() {
final Integer id = 6;
final MyEntity myEntity = new MyEntity();
myEntity.setId(id);
myEntity.setAge(123);
myEntity.setName("Jason");
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(myEntity);
myEntity.setId(15);
es.save(myEntity);
return null;
}
});
Object found = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
MyEntity my = es.topic(MyEntity.class);
return es.from(my)
.where(my.getName(), is("Jason"))
.and(my.getId(), below(10))
.list();
}
});
assertNotNull(found);
assertTrue(found instanceof Collection);
@SuppressWarnings("unchecked") // by above check.
Collection<MyEntity> results = (Collection<MyEntity>) found;
assertEquals(results.size(), 1);
// Compare with old entity.
myEntity.setId(id);
assertEquals(results.iterator().next(), myEntity);
}
@Test
public final void storeAndQueryLike() {
final Integer id = 6;
final MyEntity myEntity = new MyEntity();
myEntity.setId(id);
myEntity.setAge(123);
myEntity.setName("Jason");
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(myEntity);
myEntity.setId(15);
es.save(myEntity);
return null;
}
});
Object found = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
MyEntity my = es.topic(MyEntity.class);
return es.from(my)
.where(my.getName(), like("Ja"))
.and(my.getId(), below(100))
.list();
}
});
assertNotNull(found);
assertTrue(found instanceof Collection);
@SuppressWarnings("unchecked") // by above check.
Collection<MyEntity> results = (Collection<MyEntity>) found;
assertEquals(results.size(), 2);
for (MyEntity result : results) {
assertEquals(result.getName(), myEntity.getName());
}
}
@Test
public final void storeAndQueryBetweenText() {
final Integer id = 6;
final MyEntity myEntity = new MyEntity();
myEntity.setId(id);
myEntity.setAge(123);
myEntity.setName("Jason");
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(myEntity);
myEntity.setId(15);
es.save(myEntity);
return null;
}
});
Object found = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
MyEntity my = es.topic(MyEntity.class);
return es.from(my)
.where(my.getName(), between("Aida", "Zaxon"))
.and(my.getId(), below(100))
.list();
}
});
assertNotNull(found);
assertTrue(found instanceof Collection);
@SuppressWarnings("unchecked") // by above check.
Collection<MyEntity> results = (Collection<MyEntity>) found;
assertEquals(results.size(), 2);
for (MyEntity result : results) {
assertEquals(result.getName(), myEntity.getName());
}
}
@Test
public final void storeAndQueryFuzzyString() {
final Integer id = 6;
final MyEntity myEntity = new MyEntity();
myEntity.setId(id);
myEntity.setAge(123);
myEntity.setName("Jason");
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(myEntity);
myEntity.setId(15);
myEntity.setName("Poopy");
es.save(myEntity);
return null;
}
});
Object found = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
MyEntity my = es.topic(MyEntity.class);
return es.from(my)
.where(my.getName(), similarTo("Jasin", 0.5))
.and(my.getId(), below(100))
.list();
}
});
assertNotNull(found);
assertTrue(found instanceof Collection);
@SuppressWarnings("unchecked") // by above check.
Collection<MyEntity> results = (Collection<MyEntity>) found;
assertEquals(results.size(), 1);
for (MyEntity result : results) {
assertEquals(result.getName(), "Jason");
}
}
@Test
public final void storeAndDeleteWithQuery() {
final Integer id = 6;
final MyEntity myEntity = new MyEntity();
myEntity.setId(id);
myEntity.setAge(123);
myEntity.setName("Jason");
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(myEntity);
myEntity.setId(15);
es.save(myEntity);
return null;
}
});
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
MyEntity my = es.topic(MyEntity.class);
es.from(my)
.where(my.getName(), similarTo("Jasin", 0.5))
.remove();
return null;
}
});
Object found = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
MyEntity my = es.topic(MyEntity.class);
return es.from(my)
.where(my.getName(), similarTo("Jasin", 0.5))
.list();
}
});
assertNull(found);
}
}