package org.richfaces.photoalbum.test;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.transaction.UserTransaction;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.richfaces.photoalbum.model.MetaTag;
import org.richfaces.photoalbum.model.event.SimpleEvent;
import org.richfaces.photoalbum.util.ApplicationUtils;
@RunWith(Arquillian.class)
public class MetaTagTest {
@Deployment
public static Archive<?> createDeployment() {
return ShrinkWrap.create(WebArchive.class, "test.war").addPackage(MetaTag.class.getPackage()).addClass(PhotoAlbumTestHelper.class)
.addClasses(ApplicationUtils.class, SimpleEvent.class)
.addAsResource("META-INF/test-persistence.xml", "META-INF/persistence.xml")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") // important
.addAsWebInfResource("test-ds.xml");
}
private static final String[] TAG_NAMES = { "Tag 1", "TAG2", "Tag Three" };
@Inject
EntityManager em;
@Inject
UserTransaction utx;
@Before
public void preparePersistenceTest() throws Exception {
clearData();
insertData();
startTransaction();
}
private void clearData() throws Exception {
utx.begin();
em.joinTransaction();
System.out.println("Dumping old records...");
em.createQuery("delete from MetaTag").executeUpdate();
utx.commit();
}
private void insertData() throws Exception {
utx.begin();
em.joinTransaction();
System.out.println("Inserting records...");
for (String tag : TAG_NAMES) {
MetaTag m = new MetaTag();
m.setTag(tag);
em.persist(m);
}
utx.commit();
// clear the persistence context (first-level cache)
em.clear();
}
private void startTransaction() throws Exception {
utx.begin();
em.joinTransaction();
}
@After
public void commitTransaction() throws Exception {
utx.commit();
}
@Test
public void shouldFindAllMetaTagsUsingJpqlQuery() throws Exception {
// given
String fetchingAllMetaTagsInJpql = "select m from MetaTag m order by m.id";
// when
System.out.println("Selecting (using JPQL)...");
List<MetaTag> metaTags = em.createQuery(fetchingAllMetaTagsInJpql, MetaTag.class).getResultList();
// then
System.out.println("Found " + metaTags.size() + " tags (using JPQL):");
assertContainsAllMetaTags(metaTags);
}
private static void assertContainsAllMetaTags(Collection<MetaTag> retrievedMetaTags) {
Assert.assertEquals(TAG_NAMES.length, retrievedMetaTags.size());
final Set<String> retrievedMetaTagTitles = new HashSet<String>();
for (MetaTag m : retrievedMetaTags) {
retrievedMetaTagTitles.add(m.getTag());
}
Assert.assertTrue(retrievedMetaTagTitles.containsAll(Arrays.asList(TAG_NAMES)));
}
@Test
public void idsShouldBeUnique() throws Exception {
String fetchingAllMetaTagsInJpql = "select m from MetaTag m order by m.id";
// when
System.out.println("Selecting (using JPQL)...");
List<MetaTag> metaTags = em.createQuery(fetchingAllMetaTagsInJpql, MetaTag.class).getResultList();
assertUniqueIds(metaTags);
}
private static void assertUniqueIds(Collection<MetaTag> retrievedMetaTags) {
final Set<Long> metaTagIds = new HashSet<Long>();
for (MetaTag m : retrievedMetaTags) {
metaTagIds.add(m.getId());
}
Assert.assertTrue(metaTagIds.size() == retrievedMetaTags.size());
}
}