/* * Copyright (C) 2013-2017 NTT DATA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.terasoluna.gfw.web.pagination; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.StringWriter; import java.util.regex.Pattern; import javax.servlet.jsp.tagext.TagSupport; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.core.serializer.support.SerializationFailedException; import org.springframework.data.domain.Page; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockPageContext; import org.springframework.mock.web.MockServletContext; import org.springframework.util.SerializationUtils; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.tags.form.TagWriter; import org.terasoluna.gfw.web.pagination.PaginationTag; @SuppressWarnings("unchecked") public class PaginationTagTest { protected StringWriter writer; protected MockPageContext pageContext; protected PaginationTag tag; protected MockPageContext createPageContext() { MockServletContext sc = new MockServletContext(); WebApplicationContext wac = mock(WebApplicationContext.class); when(wac.getServletContext()).thenReturn(sc); MockHttpServletRequest request = new MockHttpServletRequest(sc); MockHttpServletResponse response = new MockHttpServletResponse(); sc.setAttribute( WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac); return new MockPageContext(sc, request, response); } @SuppressWarnings("serial") @Before public void setUp() throws Exception { this.writer = new StringWriter(); this.pageContext = createPageContext(); this.tag = new PaginationTag() { @Override TagWriter createTagWriter() { return new TagWriter(writer); } }; tag.setPageContext(pageContext); } @After public void tearDown() throws Exception { } @Test public void testRelease01() throws Exception { tag.release(); } /** * default case 1. * * <pre> * - current page 0 = first page * - page size 10 * - total pages 100 * - total elements 1000 * </pre> */ @Test public void testDoStartTagInternal01() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li class=\"disabled\"><a href=\"javascript:void(0)\"><<</a></li><li class=\"disabled\"><a href=\"javascript:void(0)\"><</a></li><li class=\"active\"><a href=\"javascript:void(0)\">1</a></li><li><a href=\"?page=1&size=10\">2</a></li><li><a href=\"?page=2&size=10\">3</a></li><li><a href=\"?page=3&size=10\">4</a></li><li><a href=\"?page=4&size=10\">5</a></li><li><a href=\"?page=5&size=10\">6</a></li><li><a href=\"?page=6&size=10\">7</a></li><li><a href=\"?page=7&size=10\">8</a></li><li><a href=\"?page=8&size=10\">9</a></li><li><a href=\"?page=9&size=10\">10</a></li><li><a href=\"?page=1&size=10\">></a></li><li><a href=\"?page=99&size=10\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * normal case 2. * * <pre> * - current page 1 > first page * - page size 10 * - total pages 100 * - total elements 1000 * </pre> */ @Test public void testDoStartTagInternal02() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(1); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"?page=0&size=10\"><<</a></li><li><a href=\"?page=0&size=10\"><</a></li><li><a href=\"?page=0&size=10\">1</a></li><li class=\"active\"><a href=\"javascript:void(0)\">2</a></li><li><a href=\"?page=2&size=10\">3</a></li><li><a href=\"?page=3&size=10\">4</a></li><li><a href=\"?page=4&size=10\">5</a></li><li><a href=\"?page=5&size=10\">6</a></li><li><a href=\"?page=6&size=10\">7</a></li><li><a href=\"?page=7&size=10\">8</a></li><li><a href=\"?page=8&size=10\">9</a></li><li><a href=\"?page=9&size=10\">10</a></li><li><a href=\"?page=2&size=10\">></a></li><li><a href=\"?page=99&size=10\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * normal case 3. * * <pre> * - current page 5 = maxDisplayCount/2 * - page size 10 * - total pages 100 * - total elements 1000 * </pre> */ @Test public void testDoStartTagInternal03() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(5); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"?page=0&size=10\"><<</a></li><li><a href=\"?page=4&size=10\"><</a></li><li><a href=\"?page=0&size=10\">1</a></li><li><a href=\"?page=1&size=10\">2</a></li><li><a href=\"?page=2&size=10\">3</a></li><li><a href=\"?page=3&size=10\">4</a></li><li><a href=\"?page=4&size=10\">5</a></li><li class=\"active\"><a href=\"javascript:void(0)\">6</a></li><li><a href=\"?page=6&size=10\">7</a></li><li><a href=\"?page=7&size=10\">8</a></li><li><a href=\"?page=8&size=10\">9</a></li><li><a href=\"?page=9&size=10\">10</a></li><li><a href=\"?page=6&size=10\">></a></li><li><a href=\"?page=99&size=10\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * normal case 4. * * <pre> * - current page 20 > maxDisplayCount * - page size 10 * - total pages 100 * - total elements 1000 * </pre> */ @Test public void testDoStartTagInternal04() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(20); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"?page=0&size=10\"><<</a></li><li><a href=\"?page=19&size=10\"><</a></li><li><a href=\"?page=15&size=10\">16</a></li><li><a href=\"?page=16&size=10\">17</a></li><li><a href=\"?page=17&size=10\">18</a></li><li><a href=\"?page=18&size=10\">19</a></li><li><a href=\"?page=19&size=10\">20</a></li><li class=\"active\"><a href=\"javascript:void(0)\">21</a></li><li><a href=\"?page=21&size=10\">22</a></li><li><a href=\"?page=22&size=10\">23</a></li><li><a href=\"?page=23&size=10\">24</a></li><li><a href=\"?page=24&size=10\">25</a></li><li><a href=\"?page=21&size=10\">></a></li><li><a href=\"?page=99&size=10\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * normal case 5. * * <pre> * - current page 95 = total - maxDisplayCount/2 * - page size 10 * - total pages 100 * - total elements 1000 * </pre> */ @Test public void testDoStartTagInternal05() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(95); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"?page=0&size=10\"><<</a></li><li><a href=\"?page=94&size=10\"><</a></li><li><a href=\"?page=90&size=10\">91</a></li><li><a href=\"?page=91&size=10\">92</a></li><li><a href=\"?page=92&size=10\">93</a></li><li><a href=\"?page=93&size=10\">94</a></li><li><a href=\"?page=94&size=10\">95</a></li><li class=\"active\"><a href=\"javascript:void(0)\">96</a></li><li><a href=\"?page=96&size=10\">97</a></li><li><a href=\"?page=97&size=10\">98</a></li><li><a href=\"?page=98&size=10\">99</a></li><li><a href=\"?page=99&size=10\">100</a></li><li><a href=\"?page=96&size=10\">></a></li><li><a href=\"?page=99&size=10\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * normal case 6. * * <pre> * - current page 99 = last page * - page size 10 * - total pages 100 * - total elements 1000 * </pre> */ @Test public void testDoStartTagInternal06() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(99); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"?page=0&size=10\"><<</a></li><li><a href=\"?page=98&size=10\"><</a></li><li><a href=\"?page=90&size=10\">91</a></li><li><a href=\"?page=91&size=10\">92</a></li><li><a href=\"?page=92&size=10\">93</a></li><li><a href=\"?page=93&size=10\">94</a></li><li><a href=\"?page=94&size=10\">95</a></li><li><a href=\"?page=95&size=10\">96</a></li><li><a href=\"?page=96&size=10\">97</a></li><li><a href=\"?page=97&size=10\">98</a></li><li><a href=\"?page=98&size=10\">99</a></li><li class=\"active\"><a href=\"javascript:void(0)\">100</a></li><li class=\"disabled\"><a href=\"javascript:void(0)\">></a></li><li class=\"disabled\"><a href=\"javascript:void(0)\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * normal case 7. * * <pre> * - current page 100 > last page * - page size 10 * - total pages 100 * - total elements 1000 * </pre> */ @Test public void testDoStartTagInternal07() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(100); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"?page=0&size=10\"><<</a></li><li><a href=\"?page=99&size=10\"><</a></li><li><a href=\"?page=90&size=10\">91</a></li><li><a href=\"?page=91&size=10\">92</a></li><li><a href=\"?page=92&size=10\">93</a></li><li><a href=\"?page=93&size=10\">94</a></li><li><a href=\"?page=94&size=10\">95</a></li><li><a href=\"?page=95&size=10\">96</a></li><li><a href=\"?page=96&size=10\">97</a></li><li><a href=\"?page=97&size=10\">98</a></li><li><a href=\"?page=98&size=10\">99</a></li><li><a href=\"?page=99&size=10\">100</a></li><li><a href=\"?page=101&size=10\">></a></li><li><a href=\"?page=99&size=10\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * abnormal case 1. * * <pre> * - total elements 0 * </pre> */ @Test public void testDoStartTagInternal08() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(20); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(0L); tag.setPage(page); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = ""; assertThat(getOutput(), is(expected)); } /** * abnormal case 2. * * <pre> * - page is null * </pre> */ @Test public void testDoStartTagInternal09() throws Exception { Page<String> page = null; tag.setPage(page); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = ""; assertThat(getOutput(), is(expected)); } /** * customized case 1. * * <pre> * -queryTmpl * </pre> */ @Test public void testDoStartTagInternal10() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(20); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); // customize tag.setQueryTmpl("p={page}&s={size}"); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"?p=0&s=10\"><<</a></li><li><a href=\"?p=19&s=10\"><</a></li><li><a href=\"?p=15&s=10\">16</a></li><li><a href=\"?p=16&s=10\">17</a></li><li><a href=\"?p=17&s=10\">18</a></li><li><a href=\"?p=18&s=10\">19</a></li><li><a href=\"?p=19&s=10\">20</a></li><li class=\"active\"><a href=\"javascript:void(0)\">21</a></li><li><a href=\"?p=21&s=10\">22</a></li><li><a href=\"?p=22&s=10\">23</a></li><li><a href=\"?p=23&s=10\">24</a></li><li><a href=\"?p=24&s=10\">25</a></li><li><a href=\"?p=21&s=10\">></a></li><li><a href=\"?p=99&s=10\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * customized case 2. * * <pre> * -pathTmpl * </pre> */ @Test public void testDoStartTagInternal11() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(20); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); // customize tag.setPathTmpl("p/{page}/{size}/"); tag.setQueryTmpl(""); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"p/0/10/\"><<</a></li><li><a href=\"p/19/10/\"><</a></li><li><a href=\"p/15/10/\">16</a></li><li><a href=\"p/16/10/\">17</a></li><li><a href=\"p/17/10/\">18</a></li><li><a href=\"p/18/10/\">19</a></li><li><a href=\"p/19/10/\">20</a></li><li class=\"active\"><a href=\"javascript:void(0)\">21</a></li><li><a href=\"p/21/10/\">22</a></li><li><a href=\"p/22/10/\">23</a></li><li><a href=\"p/23/10/\">24</a></li><li><a href=\"p/24/10/\">25</a></li><li><a href=\"p/21/10/\">></a></li><li><a href=\"p/99/10/\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * customized case 2. * * <pre> * -use sort order * </pre> */ @Test public void testDoStartTagInternal12() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(20); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); when(page.getSort()).thenReturn( new Sort(new Sort.Order(Direction.DESC, "id"))); tag.setPage(page); // customize tag.setQueryTmpl("page={page}&size={size}&sort={sortOrderProperty}&desc={sortOrderDirection}"); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"?page=0&size=10&sort=id&desc=DESC\"><<</a></li><li><a href=\"?page=19&size=10&sort=id&desc=DESC\"><</a></li><li><a href=\"?page=15&size=10&sort=id&desc=DESC\">16</a></li><li><a href=\"?page=16&size=10&sort=id&desc=DESC\">17</a></li><li><a href=\"?page=17&size=10&sort=id&desc=DESC\">18</a></li><li><a href=\"?page=18&size=10&sort=id&desc=DESC\">19</a></li><li><a href=\"?page=19&size=10&sort=id&desc=DESC\">20</a></li><li class=\"active\"><a href=\"javascript:void(0)\">21</a></li><li><a href=\"?page=21&size=10&sort=id&desc=DESC\">22</a></li><li><a href=\"?page=22&size=10&sort=id&desc=DESC\">23</a></li><li><a href=\"?page=23&size=10&sort=id&desc=DESC\">24</a></li><li><a href=\"?page=24&size=10&sort=id&desc=DESC\">25</a></li><li><a href=\"?page=21&size=10&sort=id&desc=DESC\">></a></li><li><a href=\"?page=99&size=10&sort=id&desc=DESC\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * customized case 3. * * <pre> * -maxDisplayCount * </pre> */ @Test public void testDoStartTagInternal13() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(20); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); // customize tag.setMaxDisplayCount(5); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"?page=0&size=10\"><<</a></li><li><a href=\"?page=19&size=10\"><</a></li><li><a href=\"?page=18&size=10\">19</a></li><li><a href=\"?page=19&size=10\">20</a></li><li class=\"active\"><a href=\"javascript:void(0)\">21</a></li><li><a href=\"?page=21&size=10\">22</a></li><li><a href=\"?page=22&size=10\">23</a></li><li><a href=\"?page=21&size=10\">></a></li><li><a href=\"?page=99&size=10\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * customized case 4. * * <pre> * -outerElement is empty * -innerElement * </pre> */ @Test public void testDoStartTagInternal14() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(20); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); // customize tag.setOuterElement(""); tag.setInnerElement("span"); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<span><a href=\"?page=0&size=10\"><<</a></span><span><a href=\"?page=19&size=10\"><</a></span><span><a href=\"?page=15&size=10\">16</a></span><span><a href=\"?page=16&size=10\">17</a></span><span><a href=\"?page=17&size=10\">18</a></span><span><a href=\"?page=18&size=10\">19</a></span><span><a href=\"?page=19&size=10\">20</a></span><span class=\"active\"><a href=\"javascript:void(0)\">21</a></span><span><a href=\"?page=21&size=10\">22</a></span><span><a href=\"?page=22&size=10\">23</a></span><span><a href=\"?page=23&size=10\">24</a></span><span><a href=\"?page=24&size=10\">25</a></span><span><a href=\"?page=21&size=10\">></a></span><span><a href=\"?page=99&size=10\">>></a></span>"; assertThat(getOutput(), is(expected)); } /** * customized case 5. * * <pre> * -innerElement is span * </pre> */ @Test public void testDoStartTagInternal15() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(20); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); // customize tag.setOuterElement("p"); tag.setInnerElement("span"); int ret = tag.doStartTagInternal(); System.out.println(getOutput() .replaceAll(Pattern.quote("\""), "\\\\\"")); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<p><span><a href=\"?page=0&size=10\"><<</a></span><span><a href=\"?page=19&size=10\"><</a></span><span><a href=\"?page=15&size=10\">16</a></span><span><a href=\"?page=16&size=10\">17</a></span><span><a href=\"?page=17&size=10\">18</a></span><span><a href=\"?page=18&size=10\">19</a></span><span><a href=\"?page=19&size=10\">20</a></span><span class=\"active\"><a href=\"javascript:void(0)\">21</a></span><span><a href=\"?page=21&size=10\">22</a></span><span><a href=\"?page=22&size=10\">23</a></span><span><a href=\"?page=23&size=10\">24</a></span><span><a href=\"?page=24&size=10\">25</a></span><span><a href=\"?page=21&size=10\">></a></span><span><a href=\"?page=99&size=10\">>></a></span></p>"; assertThat(getOutput(), is(expected)); } /** * customized case 6. * * <pre> * -no display * </pre> */ @Test public void testDoStartTagInternal16() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(20); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); // customize tag.setMaxDisplayCount(0); tag.setFirstLinkText(""); tag.setLastLinkText(""); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li><a href=\"?page=19&size=10\"><</a></li><li><a href=\"?page=21&size=10\">></a></li></ul>"; assertThat(getOutput(), is(expected)); } /** * customized case 7. * * <pre> * -outer tag class change. * </pre> */ @Test public void testDoStartTagInternal17() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); // customize tag.setOuterElementClass("all"); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul class=\"all\"><li class=\"disabled\"><a href=\"javascript:void(0)\"><<</a></li><li class=\"disabled\"><a href=\"javascript:void(0)\"><</a></li><li class=\"active\"><a href=\"javascript:void(0)\">1</a></li><li><a href=\"?page=1&size=10\">2</a></li><li><a href=\"?page=2&size=10\">3</a></li><li><a href=\"?page=3&size=10\">4</a></li><li><a href=\"?page=4&size=10\">5</a></li><li><a href=\"?page=5&size=10\">6</a></li><li><a href=\"?page=6&size=10\">7</a></li><li><a href=\"?page=7&size=10\">8</a></li><li><a href=\"?page=8&size=10\">9</a></li><li><a href=\"?page=9&size=10\">10</a></li><li><a href=\"?page=1&size=10\">></a></li><li><a href=\"?page=99&size=10\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } @Test public void testDoStartTagInternal_disabledHref_is_empty() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); tag.setDisabledHref(""); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul><li class=\"disabled\"><<</li><li class=\"disabled\"><</li><li class=\"active\">1</li><li><a href=\"?page=1&size=10\">2</a></li><li><a href=\"?page=2&size=10\">3</a></li><li><a href=\"?page=3&size=10\">4</a></li><li><a href=\"?page=4&size=10\">5</a></li><li><a href=\"?page=5&size=10\">6</a></li><li><a href=\"?page=6&size=10\">7</a></li><li><a href=\"?page=7&size=10\">8</a></li><li><a href=\"?page=8&size=10\">9</a></li><li><a href=\"?page=9&size=10\">10</a></li><li><a href=\"?page=1&size=10\">></a></li><li><a href=\"?page=99&size=10\">>></a></li></ul>"; assertThat(getOutput(), is(expected)); } @Test public void issue12_testDoStartTagInternal_criteriaQuery_specified() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); tag.setMaxDisplayCount(3); tag.setCriteriaQuery("a=%2B&b=+&c=%3D&d=%26"); tag.setDisableHtmlEscapeOfCriteriaQuery("false"); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); StringBuilder expected = new StringBuilder(); String expectedCriteriaQuery = "&a=%2B&b=+&c=%3D&d=%26"; expected.append("<ul>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><<</a></li>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><</a></li>"); expected.append("<li class=\"active\"><a href=\"javascript:void(0)\">1</a></li>"); expected.append("<li><a href=\"?page=1&size=10" + expectedCriteriaQuery + "\">2</a></li>"); expected.append("<li><a href=\"?page=2&size=10" + expectedCriteriaQuery + "\">3</a></li>"); expected.append("<li><a href=\"?page=1&size=10" + expectedCriteriaQuery + "\">></a></li>"); expected.append("<li><a href=\"?page=99&size=10" + expectedCriteriaQuery + "\">>></a></li>"); expected.append("</ul>"); // That the and-mark(&) is add // That the criteria query is not encode assertThat(getOutput(), is(expected.toString())); } @Test public void issue12_testDoStartTagInternal_criteriaQuery_specified_startWith_questionMark() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); tag.setMaxDisplayCount(3); tag.setCriteriaQuery("?a=%2B&b=+&c=%3D&d=%26"); tag.setDisableHtmlEscapeOfCriteriaQuery(null); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); StringBuilder expected = new StringBuilder(); String expectedCriteriaQuery = "&a=%2B&b=+&c=%3D&d=%26"; expected.append("<ul>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><<</a></li>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><</a></li>"); expected.append("<li class=\"active\"><a href=\"javascript:void(0)\">1</a></li>"); expected.append("<li><a href=\"?page=1&size=10" + expectedCriteriaQuery + "\">2</a></li>"); expected.append("<li><a href=\"?page=2&size=10" + expectedCriteriaQuery + "\">3</a></li>"); expected.append("<li><a href=\"?page=1&size=10" + expectedCriteriaQuery + "\">></a></li>"); expected.append("<li><a href=\"?page=99&size=10" + expectedCriteriaQuery + "\">>></a></li>"); expected.append("</ul>"); // That the question-mark(?) is remove assertThat(getOutput(), is(expected.toString())); } @Test public void issue12_testDoStartTagInternal_disableHtmlEscapeOfCriteriaQuery_specified_true() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); tag.setMaxDisplayCount(3); tag.setCriteriaQuery("&a=%2B&b=+&c=%3D&d=%26&e=<>\"'"); tag.setDisableHtmlEscapeOfCriteriaQuery("true"); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); StringBuilder expected = new StringBuilder(); String expectedCriteriaQuery = "&a=%2B&b=+&c=%3D&d=%26&e=<>\"'"; expected.append("<ul>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><<</a></li>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><</a></li>"); expected.append("<li class=\"active\"><a href=\"javascript:void(0)\">1</a></li>"); expected.append("<li><a href=\"?page=1&size=10" + expectedCriteriaQuery + "\">2</a></li>"); expected.append("<li><a href=\"?page=2&size=10" + expectedCriteriaQuery + "\">3</a></li>"); expected.append("<li><a href=\"?page=1&size=10" + expectedCriteriaQuery + "\">></a></li>"); expected.append("<li><a href=\"?page=99&size=10" + expectedCriteriaQuery + "\">>></a></li>"); expected.append("</ul>"); // That the and-mark(&) is remove assertThat(getOutput(), is(expected.toString())); } @Test public void issue12_testDoStartTagInternal_criteriaQuery_specified_queryImpl_notSpecified() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); tag.setMaxDisplayCount(3); tag.setPathTmpl("/{page}/{size}"); tag.setQueryTmpl(null); tag.setCriteriaQuery("a=b"); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); StringBuilder expected = new StringBuilder(); expected.append("<ul>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><<</a></li>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><</a></li>"); expected.append("<li class=\"active\"><a href=\"javascript:void(0)\">1</a></li>"); expected.append("<li><a href=\"/1/10?a=b\">2</a></li>"); expected.append("<li><a href=\"/2/10?a=b\">3</a></li>"); expected.append("<li><a href=\"/1/10?a=b\">></a></li>"); expected.append("<li><a href=\"/99/10?a=b\">>></a></li>"); expected.append("</ul>"); // That the question-mark(?) is add assertThat(getOutput(), is(expected.toString())); } @Test public void issue13_14_testDoStartTagInternal_linkOfCurrentPage_specified_true() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); tag.setMaxDisplayCount(3); tag.setPathTmpl("/{page}/{size}"); tag.setQueryTmpl(null); tag.setCriteriaQuery("a=b"); tag.setEnableLinkOfCurrentPage("true"); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); StringBuilder expected = new StringBuilder(); expected.append("<ul>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><<</a></li>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><</a></li>"); expected.append("<li class=\"active\"><a href=\"/0/10?a=b\">1</a></li>"); expected.append("<li><a href=\"/1/10?a=b\">2</a></li>"); expected.append("<li><a href=\"/2/10?a=b\">3</a></li>"); expected.append("<li><a href=\"/1/10?a=b\">></a></li>"); expected.append("<li><a href=\"/99/10?a=b\">>></a></li>"); expected.append("</ul>"); // That the current link is enabled assertThat(getOutput(), is(expected.toString())); } @Test public void issue13_14_testDoStartTagInternal_linkOfCurrentPage_specified_false() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); tag.setMaxDisplayCount(3); tag.setPathTmpl("/{page}/{size}"); tag.setQueryTmpl(null); tag.setCriteriaQuery("a=b"); tag.setEnableLinkOfCurrentPage("false"); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); StringBuilder expected = new StringBuilder(); expected.append("<ul>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><<</a></li>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><</a></li>"); expected.append("<li class=\"active\"><a href=\"javascript:void(0)\">1</a></li>"); expected.append("<li><a href=\"/1/10?a=b\">2</a></li>"); expected.append("<li><a href=\"/2/10?a=b\">3</a></li>"); expected.append("<li><a href=\"/1/10?a=b\">></a></li>"); expected.append("<li><a href=\"/99/10?a=b\">>></a></li>"); expected.append("</ul>"); // That the current link is enabled assertThat(getOutput(), is(expected.toString())); } @Test public void issue13_14_testDoStartTagInternal_linkOfCurrentPage_isEmpty() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); tag.setMaxDisplayCount(3); tag.setPathTmpl("/{page}/{size}"); tag.setQueryTmpl(null); tag.setCriteriaQuery("a=b"); tag.setEnableLinkOfCurrentPage(""); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); StringBuilder expected = new StringBuilder(); expected.append("<ul>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><<</a></li>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><</a></li>"); expected.append("<li class=\"active\"><a href=\"javascript:void(0)\">1</a></li>"); expected.append("<li><a href=\"/1/10?a=b\">2</a></li>"); expected.append("<li><a href=\"/2/10?a=b\">3</a></li>"); expected.append("<li><a href=\"/1/10?a=b\">></a></li>"); expected.append("<li><a href=\"/99/10?a=b\">>></a></li>"); expected.append("</ul>"); // That the current link is enabled assertThat(getOutput(), is(expected.toString())); } @Test public void issue12_testDoStartTagInternal_criteriaQuery_specified_startWith_andMark() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(10); when(page.getTotalPages()).thenReturn(100); when(page.getTotalElements()).thenReturn(1000L); tag.setPage(page); tag.setMaxDisplayCount(3); tag.setCriteriaQuery("&a=%2B&b=+&c=%3D&d=%26"); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); StringBuilder expected = new StringBuilder(); String expectedCriteriaQuery = "&a=%2B&b=+&c=%3D&d=%26"; expected.append("<ul>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><<</a></li>"); expected.append("<li class=\"disabled\"><a href=\"javascript:void(0)\"><</a></li>"); expected.append("<li class=\"active\"><a href=\"javascript:void(0)\">1</a></li>"); expected.append("<li><a href=\"?page=1&size=10" + expectedCriteriaQuery + "\">2</a></li>"); expected.append("<li><a href=\"?page=2&size=10" + expectedCriteriaQuery + "\">3</a></li>"); expected.append("<li><a href=\"?page=1&size=10" + expectedCriteriaQuery + "\">></a></li>"); expected.append("<li><a href=\"?page=99&size=10" + expectedCriteriaQuery + "\">>></a></li>"); expected.append("</ul>"); // That the and-mark(&) is remove assertThat(getOutput(), is(expected.toString())); } @Test public void testDoStartTagInternal_disabledHref_and_firstLinkText_are_empty() throws Exception { } // @Test // public void testWriteAnchor01() throws Exception { // } // // @Test // public void testStartOuterElement01() throws Exception { // } // // @Test // public void testEndOuterElement01() throws Exception { // } // // @Test // public void testWritePageLink01() throws Exception { // } // // @Test // public void testWriteFirstAndPreviousLink01() throws Exception { // } // // @Test // public void testWriteNextAndLastLink01() throws Exception { // } @Test public void testSetters() { PaginationTag tag1 = new PaginationTag(); tag1.setPageContext(pageContext); try { // Just for ensuring coverage tag1.createTagWriter(); tag1.setPreviousLinkText(""); tag1.setNextLinkText(""); tag1.setDisabledHref(""); tag1.setActiveClass(""); tag1.setDisabledClass(""); tag1.setEnableLinkOfCurrentPage(""); } catch (Exception ex) { ex.printStackTrace(); fail(); } } @Test public void testSerialization() { try { byte[] serialized = SerializationUtils .serialize(new PaginationTag()); SerializationUtils.deserialize(serialized); } catch (SerializationFailedException e) { fail(); } } /** * check that anchor tags are not self-closing in paginationTag. */ @Test public void testWriteAnchor() throws Exception { tag.writeAnchor(tag.createTagWriter(), PaginationInfo.DEFAULT_DISABLED_HREF, ""); String expected = "<a href=\"javascript:void(0)\"></a>"; assertThat(getOutput(), is(expected)); } /** * check that ul tags are not self-closing in paginationTag. */ @Test public void testEndOuterElement() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(0); when(page.getSize()).thenReturn(0); when(page.getTotalPages()).thenReturn(0); when(page.getTotalElements()).thenReturn(1L); tag.setPage(page); tag.setFirstLinkText(""); tag.setLastLinkText(""); tag.setPreviousLinkText(""); tag.setNextLinkText(""); int ret = tag.doStartTagInternal(); assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); String expected = "<ul></ul>"; assertThat(getOutput(), is(expected)); } @Test public void testEndOuterElement2() throws Exception { Page<String> page = mock(Page.class); // set mock behavior when(page.getNumber()).thenReturn(1); when(page.getSize()).thenReturn(0); when(page.getTotalPages()).thenReturn(2); when(page.getTotalElements()).thenReturn(1L); tag.setPage(page); tag.setFirstLinkText(""); tag.setLastLinkText(""); tag.setPreviousLinkText(""); tag.setNextLinkText(""); int ret = tag.doStartTagInternal(); String expected = "<ul><li><a href=\"?page=0&size=0\">1</a></li><li class=\"active\"><a href=\"javascript:void(0)\">2</a></li></ul>"; // assert assertThat(ret, is(TagSupport.EVAL_BODY_INCLUDE)); assertThat(getOutput(), is(expected)); } protected String getOutput() { return this.writer.toString(); } }