package productcatalog.pages; import common.pages.SelectableLinkData; import io.sphere.sdk.products.ProductProjection; import io.sphere.sdk.queries.PagedResult; import org.junit.Test; import play.api.http.MediaRange; import play.api.mvc.Request; import play.api.mvc.RequestHeader; import play.i18n.Lang; import play.mvc.Http; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.assertThat; public class PaginationDataFactoryTest { private static final String URL_PATH = "www.url.dom/path/to/"; private static final int PAGE_SIZE = 9; @Test public void calculatesProductCountAndTotal() throws Exception { final int page = 2; final int totalPages = 10; final int displayedPages = 5; final PaginationData paginationData = createPaginationData(page, displayedPages, pagedResult(page, totalPages)); assertThat(paginationData.getProductsCount()).isEqualTo(page * PAGE_SIZE); assertThat(paginationData.getTotalProducts()).isEqualTo(totalPages * PAGE_SIZE); } @Test public void calculatesPagination() throws Exception { final int page = 3; final int totalPages = 5; final int displayedPages = 5; final PaginationData paginationData = createPaginationData(page, displayedPages, pagedResult(page, totalPages)); assertThat(paginationData.getPrevPage().getText()).isEqualTo("2"); assertThat(paginationData.getNextPage().getText()).isEqualTo("4"); assertThat(paginationData.getFirstPage()).isNull(); assertThat(paginationData.getLastPage()).isNull(); assertThat(paginationData.getPages()) .extracting(SelectableLinkData::getText) .containsExactly("1", "2", "3", "4", "5"); assertThat(paginationData.getPages()) .extracting(SelectableLinkData::isSelected) .containsExactly(false, false, true, false, false); } @Test public void calculatesPaginationForFirstPage() throws Exception { final int page = 1; final int totalPages = 10; final int displayedPages = 5; final PaginationData paginationData = createPaginationData(page, displayedPages, pagedResult(page, totalPages)); assertThat(paginationData.getPrevPage()).isNull(); assertThat(paginationData.getNextPage().getText()).isEqualTo("2"); assertThat(paginationData.getFirstPage()).isNull(); assertThat(paginationData.getLastPage().getText()).isEqualTo("10"); } @Test public void calculatesPaginationForLastPage() throws Exception { final int page = 10; final int totalPages = 10; final int displayedPages = 5; final PaginationData paginationData = createPaginationData(page, displayedPages, pagedResult(page, totalPages)); assertThat(paginationData.getPrevPage().getText()).isEqualTo("9"); assertThat(paginationData.getNextPage()).isNull(); assertThat(paginationData.getFirstPage().getText()).isEqualTo("1"); assertThat(paginationData.getLastPage()).isNull(); } @Test public void calculatesPaginationForAllFirstPages() throws Exception { final int totalPages = 10; final int displayedPages = 5; IntStream.rangeClosed(1, 3) .forEach(page -> { final PaginationData paginationData = createPaginationData(page, displayedPages, pagedResult(page, totalPages)); assertThat(paginationData.getPages()) .extracting(SelectableLinkData::getText) .containsExactly("1", "2", "3", "4"); }); } @Test public void calculatesPaginationForAllLastPages() throws Exception { final int displayedPages = 5; final int totalPages = 10; IntStream.rangeClosed(8, 10) .forEach(page -> { final PaginationData paginationData = createPaginationData(page, displayedPages, pagedResult(page, totalPages)); assertThat(paginationData.getPages()) .extracting(SelectableLinkData::getText) .containsExactly("7", "8", "9", "10"); }); } private PaginationData createPaginationData(final int currentPage, final int displayedPages, final PagedResult<ProductProjection> searchResult) { return new PaginationDataFactory(request(currentPage), searchResult, currentPage, PAGE_SIZE, displayedPages).create(); } @SuppressWarnings("unchecked") private PagedResult<ProductProjection> pagedResult(final int page, final int totalPages) { final int offset = (page - 1) * PAGE_SIZE; final int totalProducts = totalPages * PAGE_SIZE; final List<ProductProjection> products = Collections.nCopies(PAGE_SIZE, null); return new PagedResult(offset, totalProducts, products) {}; } public Map<String, String[]> buildQueryString(final int currentPage) { final LinkedHashMap<String, String[]> queryString = new LinkedHashMap<>(); queryString.put("foo", new String[] {"bar"}); queryString.put("page", new String[] {String.valueOf(currentPage)}); return queryString; } public Http.Request request(final int currentPage) { return new Http.Request() { @Override public Http.RequestBody body() { return null; } @Override public String username() { return null; } @Override public void setUsername(final String username) { } @Override public Http.Request withUsername(final String username) { return null; } @Override public Request<Http.RequestBody> _underlyingRequest() { return null; } @Override public String uri() { return null; } @Override public String method() { return null; } @Override public String version() { return null; } @Override public String remoteAddress() { return null; } @Override public boolean secure() { return false; } @Override public String host() { return null; } @Override public String path() { return URL_PATH; } @Override public List<Lang> acceptLanguages() { return null; } @Override public List<MediaRange> acceptedTypes() { return null; } @Override public boolean accepts(final String mimeType) { return false; } @Override public Map<String, String[]> queryString() { return buildQueryString(currentPage); } @Override public String getQueryString(final String key) { return null; } @Override public Http.Cookies cookies() { return null; } @Override public Http.Cookie cookie(final String name) { return null; } @Override public Map<String, String[]> headers() { return null; } @Override public String getHeader(final String headerName) { return null; } @Override public boolean hasHeader(final String headerName) { return false; } @Override public RequestHeader _underlyingHeader() { return null; } }; } }