package org.sculptor.examples.library.person.domain; import static org.sculptor.examples.library.person.domain.PersonProperties.name; import static org.sculptor.examples.library.person.domain.PersonProperties.sex; import static org.sculptor.examples.library.person.domain.PersonProperties.ssn; import static org.sculptor.examples.library.person.domain.Ssn.ssn; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.sculptor.framework.accessapi.ConditionalCriteriaBuilder.criteriaFor; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.sculptor.examples.library.person.domain.Country; import org.sculptor.examples.library.person.domain.Gender; import org.sculptor.examples.library.person.domain.PersonName; import org.sculptor.examples.library.person.domain.PersonRepository; import org.sculptor.examples.library.person.domain.Ssn; import org.sculptor.examples.library.person.exception.PersonNotFoundException; import org.junit.Test; import org.sculptor.examples.library.person.domain.Person; 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 PersonRepositoryTest extends AbstractDbUnitJpaTests { private PersonRepository personRepository; @Autowired public void setPersonRepository(PersonRepository personRepository) { this.personRepository = personRepository; } @Override protected String getDataSetFile() { return "dbunit/PersonRepositoryTest.xml"; } @Test public void shouldFindByNamedQuery() throws Exception { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("country", Country.SWEDEN); List<Person> persons = personRepository.findByQuery("Person.findByCountry", parameters); assertNotNull(persons); assertEquals(1, persons.size()); assertEquals(Country.SWEDEN, persons.get(0).getSsn().getCountry()); } @Test public void shouldFindByPagedNamedQuery() throws Exception { // there are 7 persons from Norway PagingParameter pagingParameter = PagingParameter.pageAccess(3, 1, true); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("country", Country.NORWAY); PagedResult<Person> pagedResult = personRepository.findByQuery("Person.findByCountry", parameters, pagingParameter); assertEquals(3, pagedResult.getValues().size()); assertTrue(pagedResult.isTotalCounted()); assertEquals(3, pagedResult.getTotalPages()); assertEquals(7, pagedResult.getTotalRows()); } @Test public void shouldFindByDynamicQuery() throws Exception { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("country", Country.SWEDEN); List<Person> persons = personRepository.findByQuery("select e from Person e where e.ssn.country = :country", parameters); assertNotNull(persons); assertEquals(1, persons.size()); assertEquals(Country.SWEDEN, persons.get(0).getSsn().getCountry()); } @Test public void shouldFindBySimplePropertyCondition() throws Exception { List<ConditionalCriteria> conditionalCriteria = criteriaFor(Person.class).withProperty(sex()).eq(Gender.FEMALE) .build(); List<Person> persons = personRepository.findByCondition(conditionalCriteria); assertEquals(2, persons.size()); } @Test public void shouldFindByNestedPropertyCondition() throws Exception { List<ConditionalCriteria> conditionalCriteria = criteriaFor(Person.class).withProperty(ssn().country()).eq( Country.SWEDEN).orderBy(name().last()).build(); List<Person> persons = personRepository.findByCondition(conditionalCriteria); assertEquals(1, persons.size()); assertEquals(Country.SWEDEN, persons.get(0).getSsn().getCountry()); } @Test public void shouldFindByOrCondition() throws Exception { List<ConditionalCriteria> conditionalCriteria = criteriaFor(Person.class).withProperty(name().first()).eq( "Aaaa").or().withProperty(name().last()).eq("Dddd").orderBy(name().last()).build(); List<Person> persons = personRepository.findByCondition(conditionalCriteria); assertEquals(2, persons.size()); assertEquals("123456", persons.get(0).getSsn().getNumber()); assertEquals("987654", persons.get(1).getSsn().getNumber()); } @Test public void shouldFindByGroupedCondition() throws Exception { List<ConditionalCriteria> conditionalCriteria = criteriaFor(Person.class).withProperty(sex()).eq(Gender.FEMALE) .and().lbrace().withProperty(name().first()).eq("Aaaa").or().withProperty(name().last()).eq("Dddd") .rbrace().orderBy(name().last()).build(); List<Person> persons = personRepository.findByCondition(conditionalCriteria); assertEquals(1, persons.size()); assertEquals("987654", persons.get(0).getSsn().getNumber()); } @Test public void shouldFindByKey() throws Exception { Person found = personRepository.findByKey(ssn("123456", Country.DENMARK)); assertNotNull(found); assertEquals(Country.DENMARK, found.getSsn().getCountry()); } @Test(expected = PersonNotFoundException.class) public void shouldNotFindByKey() throws Exception { personRepository.findByKey(ssn("123456", Country.NORWAY)); } @Test public void shouldFindByNaturalKeys() throws Exception { Set<Ssn> keys = new HashSet<Ssn>(); Ssn ssn1 = new Ssn("123456", Country.DENMARK); keys.add(ssn1); Ssn ssn2 = new Ssn("987654", Country.DENMARK); keys.add(ssn2); Ssn ssn3 = new Ssn("999999", Country.SWEDEN); keys.add(ssn3); Map<Ssn, Person> persons = personRepository.findByNaturalKeys(keys); assertEquals(2, persons.size()); assertNull(persons.get(ssn3)); assertEquals("Aaaa", persons.get(ssn1).getName().getFirst()); assertEquals(Gender.MALE, persons.get(ssn1).getSex()); assertEquals("Cccc", persons.get(ssn2).getName().getFirst()); // strange. running all test this assert fails (works if you run only this test file). // TODO: find reason. if (!JpaHelper.isJpaProviderDataNucleus(getEntityManager())) { assertEquals(Gender.FEMALE, persons.get(ssn2).getSex()); } } @Test public void shouldFindAllFirstPage() throws Exception { // thera are 10 persons PagingParameter pagingParameter = PagingParameter.pageAccess(3, 1, true); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(1, pagedResult.getPage()); assertEquals(3, pagedResult.getPageSize()); assertEquals(3, pagedResult.getValues().size()); assertTrue(pagedResult.isTotalCounted()); assertEquals(4, pagedResult.getTotalPages()); assertEquals(10, pagedResult.getTotalRows()); } @Test public void shouldFindAllSecondPage() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(3, 2); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(2, pagedResult.getPage()); assertEquals(3, pagedResult.getPageSize()); assertEquals(3, pagedResult.getValues().size()); assertFalse(pagedResult.isTotalCounted()); } @Test public void shouldFindAllThirdPage() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(3, 3); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(3, pagedResult.getPage()); assertEquals(3, pagedResult.getPageSize()); assertEquals(3, pagedResult.getValues().size()); assertFalse(pagedResult.isTotalCounted()); assertFalse(pagedResult.isAddionalResultCounted()); } @Test public void shouldFindAllLastPage() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(3, 4); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(4, pagedResult.getPage()); assertEquals(3, pagedResult.getPageSize()); assertEquals(1, pagedResult.getValues().size()); // when end reached last page we get the total, even though we didn't // ask for it assertTrue(pagedResult.isTotalCounted()); assertEquals(4, pagedResult.getTotalPages()); assertEquals(10, pagedResult.getTotalRows()); } @Test public void shouldNotFindAllWhenPageNumberTooBig() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(3, 17); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(17, pagedResult.getPage()); assertEquals(3, pagedResult.getPageSize()); assertEquals(0, pagedResult.getValues().size()); // when end reached last page we get the total, even though we didn't // ask for it // but only if it's really last page (some rows was fetched) assertFalse(pagedResult.isTotalCounted()); assertFalse(pagedResult.isAddionalResultCounted()); } @Test public void shouldFindAllFillAddionalResultRows() throws Exception { PagingParameter pagingParameter = PagingParameter.rowAccess(4, 6, 3); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(-1, pagedResult.getPage()); assertEquals(-1, pagedResult.getPageSize()); assertEquals(2, pagedResult.getValues().size()); assertFalse(pagedResult.isTotalCounted()); assertEquals(-1, pagedResult.getTotalPages()); assertEquals(-1, pagedResult.getTotalRows()); assertTrue(pagedResult.isAddionalResultCounted()); assertEquals(-1, pagedResult.getAdditionalResultPages()); assertEquals(3, pagedResult.getAdditionalResultRows()); } @Test public void shouldFindAllFillAddionalResultPage2() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(3, 2, 2); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(2, pagedResult.getPage()); assertEquals(3, pagedResult.getPageSize()); assertEquals(3, pagedResult.getValues().size()); assertFalse(pagedResult.isTotalCounted()); assertEquals(-1, pagedResult.getTotalPages()); assertEquals(-1, pagedResult.getTotalRows()); assertTrue(pagedResult.isAddionalResultCounted()); assertEquals(2, pagedResult.getAdditionalResultPages()); assertEquals(4, pagedResult.getAdditionalResultRows()); } @Test public void shouldFindAllFillCountPage3() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(3, 3, 2); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(3, pagedResult.getPage()); assertEquals(3, pagedResult.getPageSize()); assertEquals(3, pagedResult.getValues().size()); // when end reached last page we get the total, even though we didn't // ask for it assertTrue(pagedResult.isTotalCounted()); assertEquals(4, pagedResult.getTotalPages()); assertEquals(10, pagedResult.getTotalRows()); assertTrue(pagedResult.isAddionalResultCounted()); assertEquals(1, pagedResult.getAdditionalResultPages()); assertEquals(1, pagedResult.getAdditionalResultRows()); } @Test public void shouldFindAllFillCountPage4() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(3, 4, 2); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(4, pagedResult.getPage()); assertEquals(3, pagedResult.getPageSize()); assertEquals(1, pagedResult.getValues().size()); // when end reached last page we get the total, even though we didn't // ask for it assertTrue(pagedResult.isTotalCounted()); assertEquals(4, pagedResult.getTotalPages()); assertEquals(10, pagedResult.getTotalRows()); assertTrue(pagedResult.isAddionalResultCounted()); assertEquals(0, pagedResult.getAdditionalResultPages()); assertEquals(0, pagedResult.getAdditionalResultRows()); } @Test public void shouldCalculateMaxPagesWhenSmallPageSize() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(3, 1, true); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(4, pagedResult.getTotalPages()); } @Test public void shouldCalculateMaxPagesWhenPageSizeEqualToCount() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(10, 1, true); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(1, pagedResult.getTotalPages()); } @Test public void shouldCalculateMaxPagesWhenHalfPageSizeToCount() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(5, 1, true); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(2, pagedResult.getTotalPages()); } @Test public void shouldCalculateMaxPagesWhenLargePageSize() throws Exception { PagingParameter pagingParameter = PagingParameter.pageAccess(100, 1, true); PagedResult<Person> pagedResult = personRepository.findAll(pagingParameter); assertEquals(1, pagedResult.getTotalPages()); } @Test public void shouldFetchAllWithRowAccess() throws Exception { Set<Person> all = new HashSet<Person>(); int row = 0; while (row < 20) { PagingParameter pagingParameter = PagingParameter.rowAccess(row, row + 3, 1); PagedResult<Person> result = personRepository.findAll(pagingParameter); all.addAll(result.getValues()); if (result.getAdditionalResultRows() <= 0) { break; } row = result.getEndRow(); } assertEquals(10, all.size()); } @Test public void shouldFetchAllWithPageAccess() throws Exception { Set<Person> all = new HashSet<Person>(); for (int page = 1; page < 20; page++) { PagingParameter pagingParameter = PagingParameter.pageAccess(3, page, 1); PagedResult<Person> result = personRepository.findAll(pagingParameter); all.addAll(result.getValues()); if (result.getAdditionalResultPages() <= 0) { break; } } assertEquals(10, all.size()); } @Test public void shouldFetchAllWithNextPageAccess() throws Exception { Set<Person> all = new HashSet<Person>(); PagedResult<Person> result = null; while (true) { PagingParameter pagingParameter; if (result == null) { pagingParameter = PagingParameter.pageAccess(3, 1); } else { pagingParameter = PagingParameter.getNextPage(result); } result = personRepository.findAll(pagingParameter); if (result.getValues().isEmpty()) { break; } all.addAll(result.getValues()); } assertEquals(10, all.size()); } @Test public void shouldFindByExample() throws Exception { List<Person> list = null; Person person = new Person(); list = personRepository.findByExample(person); assertEquals(10, list.size()); person = new Person(Gender.FEMALE, null); list = personRepository.findByExample(person); assertEquals(2, list.size()); person = new Person(Gender.MALE, ssn("123456", Country.DENMARK)); list = personRepository.findByExample(person); assertEquals(1, list.size()); } @Test public void shouldFindByCriteria() throws Exception { Map<String, Object> restrictions = new HashMap<String, Object>(); restrictions.put("ssn.number", "123456"); PagingParameter pagingParameter = PagingParameter.pageAccess(3, 1, true); PagedResult<Person> pagedResult = personRepository.findByCriteria(restrictions, pagingParameter); assertEquals(2, pagedResult.getRowCount()); } @Test public void shouldSaveNickNames() throws Exception { int before = countRowsInTable("PERSON_NICKNAME"); Person person = personRepository.findByKey(ssn("123456", Country.DENMARK)); assertNotNull(person); person.getNicknames().add("Nick"); personRepository.save(person); assertEquals(before + 1, countRowsInTable("PERSON_NICKNAME")); } @Test public void shouldSave() throws Exception { int before = countRowsInTable("PERSON"); Person person = new Person(Gender.MALE, new Ssn("0815", Country.US)); person.setBirthDate(new Date(0)); person.setName(new PersonName("test", "test")); personRepository.save(person); assertEquals(before + 1, countRowsInTable("PERSON")); } }