package org.sculptor.examples.library.media.domain;
import static org.junit.Assert.assertEquals;
import static org.sculptor.framework.accessapi.ConditionalCriteriaBuilder.criteriaFor;
import java.util.ArrayList;
import java.util.List;
import org.sculptor.examples.library.media.domain.PhysicalMedia;
import org.sculptor.examples.library.media.domain.PhysicalMediaProperties;
import org.sculptor.examples.library.media.domain.PhysicalMediaRepository;
import org.junit.Assume;
import org.junit.Test;
import org.sculptor.framework.accessapi.ConditionalCriteria;
import org.sculptor.framework.accessimpl.jpa.JpaHelper;
import org.sculptor.framework.domain.PagedResult;
import org.sculptor.framework.domain.PagingParameter;
import org.sculptor.framework.test.AbstractDbUnitJpaTests;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Spring based transactional test with DbUnit support.
*/
public class PhysicalMediaRepositoryTest extends AbstractDbUnitJpaTests {
private PhysicalMediaRepository physicalMediaRepository;
@Autowired
public void setPhysicalMediaRepository(PhysicalMediaRepository physicalMediaRepository) {
this.physicalMediaRepository = physicalMediaRepository;
}
@Override
protected String getDataSetFile() {
if (JpaHelper.isJpaProviderEclipselink(getEntityManager())) {
return "dbunit/LibraryServiceTest_eclipselink.xml";
}
// datanucleus bug. PrimaryKeyJoinColumn is not working correctly for entities inherited from mappedsuperclass
// TODO: report to datanucleus issue tracker
else if (JpaHelper.isJpaProviderDataNucleus(getEntityManager())) {
return "dbunit/LibraryServiceTest_datanucleus.xml";
}
return "dbunit/LibraryServiceTest.xml";
}
@Test
public void testFindByNestedCondition() throws Exception {
List<ConditionalCriteria> conditionalCriteria = criteriaFor(PhysicalMedia.class).withProperty(
PhysicalMediaProperties.library().name()).eq("LibraryServiceTest").build();
PagingParameter pParam = PagingParameter.rowAccess(0, 100);
PagedResult<PhysicalMedia> pResult = physicalMediaRepository.findByCondition(conditionalCriteria, pParam);
assertEquals(2, pResult.getValues().size());
}
@Test
public void testFindByNestedCondition2() throws Exception {
List<ConditionalCriteria> conditionalCriteria = criteriaFor(PhysicalMedia.class).withProperty(
PhysicalMediaProperties.library().name()).eq("LibraryServiceTest").and().withProperty(
PhysicalMediaProperties.status()).eq("A").build();
PagingParameter pParam = PagingParameter.rowAccess(0, 100);
PagedResult<PhysicalMedia> pResult = physicalMediaRepository.findByCondition(conditionalCriteria, pParam);
assertEquals(2, pResult.getValues().size());
}
@Test
public void testFindByNestedCondition3() throws Exception {
ConditionalCriteria condition1 = criteriaFor(PhysicalMedia.class).withProperty(
PhysicalMediaProperties.library().name()).eq("LibraryServiceTest").buildSingle();
ConditionalCriteria condition2 = criteriaFor(PhysicalMedia.class)
.withProperty(PhysicalMediaProperties.status()).eq("A").buildSingle();
ArrayList<ConditionalCriteria> conditionalCriteria = new ArrayList<ConditionalCriteria>();
conditionalCriteria.add(condition1);
conditionalCriteria.add(condition2);
PagingParameter pParam = PagingParameter.rowAccess(0, 100);
PagedResult<PhysicalMedia> pResult = physicalMediaRepository.findByCondition(conditionalCriteria, pParam);
assertEquals(2, pResult.getValues().size());
}
@Test
public void testFindByNestedCondition3WithCount() throws Exception {
// TODO: possible solution is to use JoinFetch to optimize query execution (didn't get it to work until now)
Assume.assumeTrue(!JpaHelper.isJpaProviderEclipselink(getEntityManager()));
ConditionalCriteria condition1 = criteriaFor(PhysicalMedia.class).withProperty(
PhysicalMediaProperties.library().name()).eq("LibraryServiceTest").buildSingle();
ConditionalCriteria condition2 = criteriaFor(PhysicalMedia.class)
.withProperty(PhysicalMediaProperties.status()).eq("A").buildSingle();
ArrayList<ConditionalCriteria> conditionalCriteria = new ArrayList<ConditionalCriteria>();
conditionalCriteria.add(condition1);
conditionalCriteria.add(condition2);
PagingParameter pParam = PagingParameter.rowAccess(0, 1, true);
PagedResult<PhysicalMedia> pResult = physicalMediaRepository.findByCondition(conditionalCriteria, pParam);
assertEquals(1, pResult.getValues().size());
assertEquals(2, pResult.getTotalRows());
}
@Test
public void testFindByNestedCondition4() throws Exception {
// hibernate seems not to support this nested condition
// TODO: watch hibernate issue HHH-5948
Assume.assumeTrue(!JpaHelper.isJpaProviderHibernate(getEntityManager()));
// datanucleus seems not to support this nested condition
Assume.assumeTrue(!JpaHelper.isJpaProviderDataNucleus(getEntityManager()));
// need a distinct query for openjpa and eclipselink to get the correct results
List<ConditionalCriteria> conditionalCriteria = criteriaFor(PhysicalMedia.class).withProperty(
PhysicalMediaProperties.library().media().status()).eq("A").distinctRoot().build();
PagingParameter pParam = PagingParameter.rowAccess(0, 1, true);
PagedResult<PhysicalMedia> pResult = physicalMediaRepository.findByCondition(conditionalCriteria, pParam);
assertEquals(6, pResult.getTotalRows());
}
}