package com.acme.jpa; import static org.junit.Assert.assertEquals; import java.util.List; import javax.ejb.EJB; import org.jboss.arquillian.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(Arquillian.class) public class RepositoryTestCase { @Deployment public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClasses(Record.class, LineItem.class, PersistenceService.class, PersistenceServiceBean.class, Repository.class, RepositoryBean.class) .addAsManifestResource("test-persistence.xml", "persistence.xml"); } @EJB PersistenceService service; @EJB Repository repository; private static List<Record> seedRecords; private static long idOfFirstRecord; @Before public void seed_database() { // emulate @BeforeClass on instance // nice if this was supported in Arquillian // sucks that seedRecords has to be static if (seedRecords == null) { seedRecords = service.seed(true); idOfFirstRecord = seedRecords.get(0).getId(); } } @Test public void entity_should_be_managed_outside_of_active_ejb() { Record record = repository.retrieveById(Record.class, idOfFirstRecord); repository.isManaging(record); } @Test public void lazy_load_should_succeed_outside_of_active_ejb() { Record record = repository.retrieveById(Record.class, idOfFirstRecord); int numLineItems = 1; try { numLineItems = record.getLineItems().size(); } catch (Exception e) { } assertEquals(1, numLineItems); } @Test public void lazy_load_should_fail_outside_of_removed_ejb() { Record record = repository.retrieveById(Record.class, idOfFirstRecord); repository.close(); // Some JPA providers (EclipseLink) allow LAZY relationships to be accessed after session is closed int expected = service.isLazyLoadingPermittedOnClosedSession() ? 1 : 0; int numLineItems = 0; try { numLineItems = record.getLineItems().size(); } catch (Exception e) { } assertEquals(expected, numLineItems); } @Test public void dirty_change_should_be_flushed_by_transactional_method_on_managing_ejb() { Record record = repository.retrieveById(Record.class, idOfFirstRecord); String name = record.getName(); record.setName(name + "-renamed"); repository.update(record); List<Record> results = repository.retrieveByQuery(Record.class, "select r from Record r where r.name = ?1", name + "-renamed"); assertEquals(1, results.size()); } @Test public void dirty_change_should_be_flushed_by_transactional_method_on_another_ejb() { Record record = repository.retrieveById(Record.class, idOfFirstRecord); String name = record.getName(); record.setName(name + "-renamed"); service.transact(); List<Record> results = repository.retrieveByQuery(Record.class, "select r from Record r where r.name = ?1", name + "-renamed"); assertEquals(1, results.size()); } }