/*
* Copyright 2013-2017 the original author or authors.
*
* 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.springframework.data.web;
import static org.assertj.core.api.Assertions.*;
import static org.springframework.data.web.PageableHandlerMethodArgumentResolver.*;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.MethodParameter;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.web.SortDefault.SortDefaults;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.web.context.request.ServletWebRequest;
/**
* Unit tests for {@link PageableHandlerMethodArgumentResolver}. Pulls in defaulting tests from
* {@link PageableDefaultUnitTests}.
*
* @author Oliver Gierke
* @author Nick Williams
*/
public class PageableHandlerMethodArgumentResolverUnitTests extends PageableDefaultUnitTests {
MethodParameter supportedMethodParameter;
@Before
public void setUp() throws Exception {
this.supportedMethodParameter = new MethodParameter(Sample.class.getMethod("supportedMethod", Pageable.class), 0);
}
@Test // DATACMNS-335
public void preventsPageSizeFromExceedingMayValueIfConfigured() throws Exception {
// Read side
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("page", "0");
request.addParameter("size", "200");
assertSupportedAndResult(supportedMethodParameter, PageRequest.of(0, 100), request);
}
@Test(expected = IllegalArgumentException.class)
public void rejectsEmptyPageParameterName() {
new PageableHandlerMethodArgumentResolver().setPageParameterName("");
}
@Test(expected = IllegalArgumentException.class)
public void rejectsNullPageParameterName() {
new PageableHandlerMethodArgumentResolver().setPageParameterName(null);
}
@Test(expected = IllegalArgumentException.class)
public void rejectsEmptySizeParameterName() {
new PageableHandlerMethodArgumentResolver().setSizeParameterName("");
}
@Test(expected = IllegalArgumentException.class)
public void rejectsNullSizeParameterName() {
new PageableHandlerMethodArgumentResolver().setSizeParameterName(null);
}
@Test
public void qualifierIsUsedInParameterLookup() throws Exception {
MethodParameter parameter = new MethodParameter(Sample.class.getMethod("validQualifier", Pageable.class), 0);
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("foo_page", "2");
request.addParameter("foo_size", "10");
assertSupportedAndResult(parameter, PageRequest.of(2, 10), request);
}
@Test // DATACMNS-377
public void usesDefaultPageSizeIfRequestPageSizeIsLessThanOne() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("page", "0");
request.addParameter("size", "0");
assertSupportedAndResult(supportedMethodParameter, DEFAULT_PAGE_REQUEST, request);
}
@Test // DATACMNS-377
public void rejectsInvalidCustomDefaultForPageSize() throws Exception {
MethodParameter parameter = new MethodParameter(Sample.class.getMethod("invalidDefaultPageSize", Pageable.class),
0);
exception.expect(IllegalStateException.class);
exception.expectMessage("invalidDefaultPageSize");
assertSupportedAndResult(parameter, DEFAULT_PAGE_REQUEST);
}
@Test // DATACMNS-408
public void fallsBackToFirstPageIfNegativePageNumberIsGiven() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("page", "-1");
assertSupportedAndResult(supportedMethodParameter, DEFAULT_PAGE_REQUEST, request);
}
@Test // DATACMNS-408
public void pageParamIsNotNumeric() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("page", "a");
assertSupportedAndResult(supportedMethodParameter, DEFAULT_PAGE_REQUEST, request);
}
@Test // DATACMNS-408
public void sizeParamIsNotNumeric() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("size", "a");
assertSupportedAndResult(supportedMethodParameter, DEFAULT_PAGE_REQUEST, request);
}
@Test // DATACMNS-477
public void returnsNullIfFallbackIsUnpagedAndNoParametersGiven() throws Exception {
PageableHandlerMethodArgumentResolver resolver = getResolver();
resolver.setFallbackPageable(Pageable.unpaged());
assertSupportedAndResult(supportedMethodParameter, null, new ServletWebRequest(new MockHttpServletRequest()),
resolver);
}
@Test // DATACMNS-477
public void returnsNullIfFallbackIsUnpagedAndOnlyPageIsGiven() throws Exception {
PageableHandlerMethodArgumentResolver resolver = getResolver();
resolver.setFallbackPageable(Pageable.unpaged());
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("page", "20");
assertThat(resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null)).isNull();
}
@Test // DATACMNS-477
public void returnsNullIfFallbackIsUnpagedAndOnlySizeIsGiven() throws Exception {
PageableHandlerMethodArgumentResolver resolver = getResolver();
resolver.setFallbackPageable(Pageable.unpaged());
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("size", "10");
assertThat(resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null)).isNull();
}
@Test // DATACMNS-563
public void considersOneIndexedParametersSetting() {
PageableHandlerMethodArgumentResolver resolver = getResolver();
resolver.setOneIndexedParameters(true);
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("page", "1");
assertThat(
resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null).getPageNumber())
.isEqualTo(0);
}
@Test // DATACMNS-640
public void usesNullSortIfNoDefaultIsConfiguredAndPageAndSizeAreGiven() {
PageableHandlerMethodArgumentResolver resolver = getResolver();
resolver.setFallbackPageable(Pageable.unpaged());
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("page", "0");
request.addParameter("size", "10");
Pageable result = resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null);
assertThat(result.getPageNumber()).isEqualTo(0);
assertThat(result.getPageSize()).isEqualTo(10);
assertThat(result.getSort().isSorted()).isFalse();
}
@Test // DATACMNS-692
public void oneIndexedParametersDefaultsIndexOutOfRange() {
PageableHandlerMethodArgumentResolver resolver = getResolver();
resolver.setOneIndexedParameters(true);
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("page", "0");
Pageable result = resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null);
assertThat(result.getPageNumber()).isEqualTo(0);
}
@Test // DATACMNS-761
public void returnsCorrectPageSizeForOneIndexParameters() {
PageableHandlerMethodArgumentResolver resolver = getResolver();
resolver.setOneIndexedParameters(true);
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("size", "10");
Pageable result = resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null);
assertThat(result.getPageSize()).isEqualTo(10);
}
@Test // DATACMNS-929
public void detectsFallbackPageableIfNullOneIsConfigured() {
PageableHandlerMethodArgumentResolver resolver = getResolver();
resolver.setFallbackPageable(Pageable.unpaged());
assertThat(resolver.isFallbackPageable(null)).isFalse();
assertThat(resolver.isFallbackPageable(PageRequest.of(0, 10))).isFalse();
}
@Override
protected PageableHandlerMethodArgumentResolver getResolver() {
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
resolver.setMaxPageSize(100);
return resolver;
}
@Override
protected Class<?> getControllerClass() {
return Sample.class;
}
interface Sample {
void supportedMethod(Pageable pageable);
void unsupportedMethod(String string);
void invalidDefaultPageSize(@PageableDefault(size = 0) Pageable pageable);
void simpleDefault(@PageableDefault(size = PAGE_SIZE, page = PAGE_NUMBER) Pageable pageable);
void simpleDefaultWithSort(
@PageableDefault(size = PAGE_SIZE, page = PAGE_NUMBER, sort = { "firstname", "lastname" }) Pageable pageable);
void simpleDefaultWithSortAndDirection(@PageableDefault(size = PAGE_SIZE, page = PAGE_NUMBER,
sort = { "firstname", "lastname" }, direction = Direction.DESC) Pageable pageable);
void simpleDefaultWithExternalSort(@PageableDefault(size = PAGE_SIZE, page = PAGE_NUMBER) //
@SortDefault(sort = { "firstname", "lastname" }, direction = Direction.DESC) Pageable pageable);
void simpleDefaultWithContaineredExternalSort(@PageableDefault(size = PAGE_SIZE, page = PAGE_NUMBER) //
@SortDefaults(@SortDefault(sort = { "firstname", "lastname" }, direction = Direction.DESC)) Pageable pageable);
void invalidQualifiers(@Qualifier("foo") Pageable first, @Qualifier("foo") Pageable second);
void validQualifier(@Qualifier("foo") Pageable pageable);
void noQualifiers(Pageable first, Pageable second);
}
}