/*
* 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 java.util.List;
import org.junit.Test;
import org.springframework.core.MethodParameter;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.hateoas.mvc.UriComponentsContributor;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
/**
* Unit tests for {@link HateoasPageableHandlerMethodArgumentResolver}.
*
* @author Oliver Gierke
*/
public class HateoasPageableHandlerMethodArgumentResolverUnitTests
extends PageableHandlerMethodArgumentResolverUnitTests {
@Test
public void buildsUpRequestParameters() {
String basicString = String.format("page=%d&size=%d", PAGE_NUMBER, PAGE_SIZE);
assertUriStringFor(REFERENCE_WITHOUT_SORT, basicString);
assertUriStringFor(REFERENCE_WITH_SORT, basicString + "&sort=firstname,lastname,desc");
assertUriStringFor(REFERENCE_WITH_SORT_FIELDS, basicString + "&sort=firstname,lastname,asc");
}
@Test // DATACMNS-343
public void replacesExistingPaginationInformation() throws Exception {
MethodParameter parameter = new MethodParameter(Sample.class.getMethod("supportedMethod", Pageable.class), 0);
UriComponentsContributor resolver = new HateoasPageableHandlerMethodArgumentResolver();
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080?page=0&size=10");
resolver.enhance(builder, parameter, PageRequest.of(1, 20));
MultiValueMap<String, String> params = builder.build().getQueryParams();
List<String> page = params.get("page");
assertThat(page).hasSize(1);
assertThat(page.get(0)).isEqualTo("1");
List<String> size = params.get("size");
assertThat(size).hasSize(1);
assertThat(size.get(0)).isEqualTo("20");
}
@Test // DATACMNS-335
public void preventsPageSizeFromExceedingMayValueIfConfiguredOnWrite() throws Exception {
assertUriStringFor(PageRequest.of(0, 200), "page=0&size=100");
}
@Test // DATACMNS-418
public void appendsTemplateVariablesCorrectly() {
assertTemplateEnrichment("/foo", "{?page,size,sort}");
assertTemplateEnrichment("/foo?bar=1", "{&page,size,sort}");
assertTemplateEnrichment("/foo?page=1", "{&size,sort}");
assertTemplateEnrichment("/foo?page=1&size=10", "{&sort}");
assertTemplateEnrichment("/foo?page=1&sort=foo,asc", "{&size}");
assertTemplateEnrichment("/foo?page=1&size=10&sort=foo,asc", "");
}
@Test // DATACMNS-418
public void returnsCustomizedTemplateVariables() {
UriComponents uriComponents = UriComponentsBuilder.fromPath("/foo").build();
HateoasPageableHandlerMethodArgumentResolver resolver = getResolver();
resolver.setPageParameterName("foo");
String variables = resolver.getPaginationTemplateVariables(null, uriComponents).toString();
assertThat(variables).isEqualTo("{?foo,size,sort}");
}
@Test // DATACMNS-563
public void enablingOneIndexedParameterReturnsOneForFirstPage() {
HateoasPageableHandlerMethodArgumentResolver resolver = getResolver();
resolver.setOneIndexedParameters(true);
UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/");
resolver.enhance(builder, null, PageRequest.of(0, 10));
MultiValueMap<String, String> params = builder.build().getQueryParams();
assertThat(params.containsKey(resolver.getPageParameterName())).isTrue();
assertThat(params.getFirst(resolver.getPageParameterName())).isEqualTo("1");
}
@Override
protected HateoasPageableHandlerMethodArgumentResolver getResolver() {
HateoasPageableHandlerMethodArgumentResolver resolver = new HateoasPageableHandlerMethodArgumentResolver();
resolver.setMaxPageSize(100);
return resolver;
}
protected void assertUriStringFor(Pageable pageable, String expected) {
UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/");
MethodParameter parameter = getParameterOfMethod("supportedMethod");
getResolver().enhance(builder, parameter, pageable);
assertThat(builder.build().toUriString()).endsWith(expected);
}
private void assertTemplateEnrichment(String baseUri, String expected) {
UriComponents uriComponents = UriComponentsBuilder.fromUriString(baseUri).build();
HateoasPageableHandlerMethodArgumentResolver resolver = getResolver();
assertThat(resolver.getPaginationTemplateVariables(null, uriComponents).toString()).isEqualTo(expected);
}
}