Author: athimel Date: 2014-05-22 17:24:46 +0200 (Thu, 22 May 2014) New Revision: 3129 Url: http://forge.nuiton.org/projects/topia/repository/revisions/3129 Log: refs #3208 Add tests on PaginationParameter interpretation by ToPIA Modified: trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java Modified: trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java =================================================================== --- trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java 2014-05-22 14:53:11 UTC (rev 3128) +++ trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java 2014-05-22 15:24:46 UTC (rev 3129) @@ -24,8 +24,10 @@ * #L% */ +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import org.hamcrest.CoreMatchers; import org.junit.Assert; @@ -36,12 +38,17 @@ import org.nuiton.topia.it.legacy.TopiaItLegacyTopiaPersistenceContext; import org.nuiton.topia.it.legacy.test.entities.Person; import org.nuiton.topia.it.legacy.test.entities.PersonTopiaDao; +import org.nuiton.topia.persistence.TopiaDao; +import org.nuiton.topia.persistence.TopiaEntities; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.util.pagination.PaginationParameter; +import com.google.common.base.Function; import com.google.common.base.Strings; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import org.nuiton.topia.persistence.TopiaDao; -import org.nuiton.topia.persistence.TopiaException; +import com.google.common.collect.Sets; /** * Test on {@link TopiaDao}. @@ -103,7 +110,7 @@ createPersons(1); - Iterable<Person> persons = dao.forNameEquals("toto0").findAllLazy(); + Iterable<Person> persons = dao.forNameEquals("toto00").findAllLazy(); Assert.assertTrue(persons.iterator().hasNext()); } @@ -208,7 +215,8 @@ protected void createPersons(int number) throws TopiaException { for (int i = 0; i < number; i++) { - createPerson("toto" + i); + String name = "toto" + Strings.padStart(String.valueOf(i), 2, '0'); + createPerson(name); } context.commit(); @@ -232,4 +240,103 @@ Assert.assertTrue(!Strings.isNullOrEmpty(person.getTopiaId())); } + @Test + public void testFindUsingPagination() throws TopiaException { + + createPersons(17); + + List<Person> excepted = dao.findAll(); + Assert.assertEquals(17, excepted.size()); + + { + PaginationParameter page = PaginationParameter.of(0, -1); + List<Person> list = dao.find(dao.newFromClause(), new HashMap<String, Object>(), page); + Assert.assertEquals(17, list.size()); + } + + Set<String> alreadyLoaded = Sets.newHashSet(); + { + PaginationParameter page = PaginationParameter.of(0, 6); + List<Person> list = dao.find(dao.newFromClause(), new HashMap<String, Object>(), page); + Assert.assertEquals(6, list.size()); + + // Now make sure that a same entity is not in several pages + Set<String> newlyLoaded = Sets.newHashSet(Iterables.transform(list, TopiaEntities.getTopiaIdFunction())); + Assert.assertTrue(Sets.intersection(alreadyLoaded, newlyLoaded).isEmpty()); + alreadyLoaded.addAll(newlyLoaded); + } + + { + PaginationParameter page = PaginationParameter.of(1, 6); + List<Person> list = dao.find(dao.newFromClause(), new HashMap<String, Object>(), page); + Assert.assertEquals(6, list.size()); + + // Now make sure that a same entity is not in several pages + Set<String> newlyLoaded = Sets.newHashSet(Iterables.transform(list, TopiaEntities.getTopiaIdFunction())); + Assert.assertTrue(Sets.intersection(alreadyLoaded, newlyLoaded).isEmpty()); + alreadyLoaded.addAll(newlyLoaded); + } + + { + PaginationParameter page = PaginationParameter.of(2, 6); + List<Person> list = dao.find(dao.newFromClause(), new HashMap<String, Object>(), page); + Assert.assertEquals(5, list.size()); + + // Now make sure that a same entity is not in several pages + Set<String> newlyLoaded = Sets.newHashSet(Iterables.transform(list, TopiaEntities.getTopiaIdFunction())); + Assert.assertTrue(Sets.intersection(alreadyLoaded, newlyLoaded).isEmpty()); + alreadyLoaded.addAll(newlyLoaded); + } + + Assert.assertEquals(17, alreadyLoaded.size()); + + } + + @Test + public void testFindUsingPaginationOrderClauses() throws TopiaException { + + createPersons(15); + + List<Person> excepted = dao.findAll(); + Assert.assertEquals(15, excepted.size()); + + Set<String> setAsc = Sets.newHashSet(); + Set<String> setDesc = Sets.newHashSet(); + + Function<Person, String> getNameFunction = new Function<Person, String>() { + @Override + public String apply(Person input) { + return input.getName(); + } + }; + + { + PaginationParameter page = PaginationParameter.of(0, 8, Person.PROPERTY_NAME, false); + List<Person> list = dao.find(dao.newFromClause(), new HashMap<String, Object>(), page); + Assert.assertEquals(8, list.size()); + + Set<String> newlyLoaded = Sets.newHashSet(Iterables.transform(list, getNameFunction)); + setAsc.addAll(newlyLoaded); + } + + { + PaginationParameter page = PaginationParameter.of(0, 8, Person.PROPERTY_NAME, true); + List<Person> list = dao.find(dao.newFromClause(), new HashMap<String, Object>(), page); + Assert.assertEquals(8, list.size()); + + Set<String> newlyLoaded = Sets.newHashSet(Iterables.transform(list, getNameFunction)); + setDesc.addAll(newlyLoaded); + } + + Sets.SetView<String> intersection = Sets.intersection(setAsc, setDesc); + + // Sorting a list of 15 elements asc and desc by 8-elements pages, intersection will be the middle one (toto7) + // <---------ASC-page-0----------><-------ASC-page-1----------> + // 00 01 02 03 04 05 06 |7| 8 9 10 11 12 13 14 + // <---------DESC-page-1--------><--------DESC-page-0--------> + + Assert.assertEquals(1, intersection.size()); + Assert.assertTrue(intersection.contains("toto07")); + } + }