/*
* Copyright 2002-2016 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.http;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.hamcrest.Matchers;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* @author Arjen Poutsma
* @author Marcel Overdijk
* @author Kazuki Shimizu
*/
public class ResponseEntityTests {
@Test
public void normal() {
String headerName = "My-Custom-Header";
String headerValue1 = "HeaderValue1";
String headerValue2 = "HeaderValue2";
Integer entity = 42;
ResponseEntity<Integer> responseEntity =
ResponseEntity.status(HttpStatus.OK).header(headerName, headerValue1, headerValue2).body(entity);
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.getHeaders().containsKey(headerName));
List<String> list = responseEntity.getHeaders().get(headerName);
assertEquals(2, list.size());
assertEquals(headerValue1, list.get(0));
assertEquals(headerValue2, list.get(1));
assertEquals(entity, responseEntity.getBody());
}
@Test
public void okNoBody() {
ResponseEntity<Void> responseEntity = ResponseEntity.ok().build();
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertNull(responseEntity.getBody());
}
@Test
public void okEntity() {
Integer entity = 42;
ResponseEntity<Integer> responseEntity = ResponseEntity.ok(entity);
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(entity, responseEntity.getBody());
}
@Test
public void createdLocation() throws URISyntaxException {
URI location = new URI("location");
ResponseEntity<Void> responseEntity = ResponseEntity.created(location).build();
assertNotNull(responseEntity);
assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
assertTrue(responseEntity.getHeaders().containsKey("Location"));
assertEquals(location.toString(),
responseEntity.getHeaders().getFirst("Location"));
assertNull(responseEntity.getBody());
ResponseEntity.created(location).header("MyResponseHeader", "MyValue").body("Hello World");
}
@Test
public void acceptedNoBody() throws URISyntaxException {
ResponseEntity<Void> responseEntity = ResponseEntity.accepted().build();
assertNotNull(responseEntity);
assertEquals(HttpStatus.ACCEPTED, responseEntity.getStatusCode());
assertNull(responseEntity.getBody());
}
@Test // SPR-14939
public void acceptedNoBodyWithAlternativeBodyType() throws URISyntaxException {
ResponseEntity<String> responseEntity = ResponseEntity.accepted().build();
assertNotNull(responseEntity);
assertEquals(HttpStatus.ACCEPTED, responseEntity.getStatusCode());
assertNull(responseEntity.getBody());
}
@Test
public void noContent() throws URISyntaxException {
ResponseEntity<Void> responseEntity = ResponseEntity.noContent().build();
assertNotNull(responseEntity);
assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());
assertNull(responseEntity.getBody());
}
@Test
public void badRequest() throws URISyntaxException {
ResponseEntity<Void> responseEntity = ResponseEntity.badRequest().build();
assertNotNull(responseEntity);
assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode());
assertNull(responseEntity.getBody());
}
@Test
public void notFound() throws URISyntaxException {
ResponseEntity<Void> responseEntity = ResponseEntity.notFound().build();
assertNotNull(responseEntity);
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
assertNull(responseEntity.getBody());
}
@Test
public void unprocessableEntity() throws URISyntaxException {
ResponseEntity<String> responseEntity = ResponseEntity.unprocessableEntity().body("error");
assertNotNull(responseEntity);
assertEquals(HttpStatus.UNPROCESSABLE_ENTITY, responseEntity.getStatusCode());
assertEquals("error", responseEntity.getBody());
}
@Test
public void headers() throws URISyntaxException {
URI location = new URI("location");
long contentLength = 67890;
MediaType contentType = MediaType.TEXT_PLAIN;
ResponseEntity<Void> responseEntity = ResponseEntity.ok().
allow(HttpMethod.GET).
lastModified(12345L).
location(location).
contentLength(contentLength).
contentType(contentType).
build();
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
HttpHeaders responseHeaders = responseEntity.getHeaders();
assertEquals("GET", responseHeaders.getFirst("Allow"));
assertEquals("Thu, 01 Jan 1970 00:00:12 GMT",
responseHeaders.getFirst("Last-Modified"));
assertEquals(location.toASCIIString(),
responseHeaders.getFirst("Location"));
assertEquals(String.valueOf(contentLength), responseHeaders.getFirst("Content-Length"));
assertEquals(contentType.toString(), responseHeaders.getFirst("Content-Type"));
assertNull(responseEntity.getBody());
}
@Test
public void Etagheader() throws URISyntaxException {
ResponseEntity<Void> responseEntity = ResponseEntity.ok().eTag("\"foo\"").build();
assertEquals("\"foo\"", responseEntity.getHeaders().getETag());
responseEntity = ResponseEntity.ok().eTag("foo").build();
assertEquals("\"foo\"", responseEntity.getHeaders().getETag());
responseEntity = ResponseEntity.ok().eTag("W/\"foo\"").build();
assertEquals("W/\"foo\"", responseEntity.getHeaders().getETag());
}
@Test
public void headersCopy() {
HttpHeaders customHeaders = new HttpHeaders();
customHeaders.set("X-CustomHeader", "vale");
ResponseEntity<Void> responseEntity = ResponseEntity.ok().headers(customHeaders).build();
HttpHeaders responseHeaders = responseEntity.getHeaders();
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(1, responseHeaders.size());
assertEquals(1, responseHeaders.get("X-CustomHeader").size());
assertEquals("vale", responseHeaders.getFirst("X-CustomHeader"));
}
@Test // SPR-12792
public void headersCopyWithEmptyAndNull() {
ResponseEntity<Void> responseEntityWithEmptyHeaders =
ResponseEntity.ok().headers(new HttpHeaders()).build();
ResponseEntity<Void> responseEntityWithNullHeaders =
ResponseEntity.ok().headers(null).build();
assertEquals(HttpStatus.OK, responseEntityWithEmptyHeaders.getStatusCode());
assertTrue(responseEntityWithEmptyHeaders.getHeaders().isEmpty());
assertEquals(responseEntityWithEmptyHeaders.toString(), responseEntityWithNullHeaders.toString());
}
@Test
public void emptyCacheControl() {
Integer entity = 42;
ResponseEntity<Integer> responseEntity =
ResponseEntity.status(HttpStatus.OK)
.cacheControl(CacheControl.empty())
.body(entity);
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertFalse(responseEntity.getHeaders().containsKey(HttpHeaders.CACHE_CONTROL));
assertEquals(entity, responseEntity.getBody());
}
@Test
public void cacheControl() {
Integer entity = 42;
ResponseEntity<Integer> responseEntity =
ResponseEntity.status(HttpStatus.OK)
.cacheControl(CacheControl.maxAge(1, TimeUnit.HOURS).cachePrivate().
mustRevalidate().proxyRevalidate().sMaxAge(30, TimeUnit.MINUTES))
.body(entity);
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.getHeaders().containsKey(HttpHeaders.CACHE_CONTROL));
assertEquals(entity, responseEntity.getBody());
String cacheControlHeader = responseEntity.getHeaders().getCacheControl();
assertThat(cacheControlHeader, Matchers.equalTo("max-age=3600, must-revalidate, private, proxy-revalidate, s-maxage=1800"));
}
@Test
public void cacheControlNoCache() {
Integer entity = 42;
ResponseEntity<Integer> responseEntity =
ResponseEntity.status(HttpStatus.OK)
.cacheControl(CacheControl.noStore())
.body(entity);
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.getHeaders().containsKey(HttpHeaders.CACHE_CONTROL));
assertEquals(entity, responseEntity.getBody());
String cacheControlHeader = responseEntity.getHeaders().getCacheControl();
assertThat(cacheControlHeader, Matchers.equalTo("no-store"));
}
@Test
public void statusCodeAsInt() {
Integer entity = 42;
ResponseEntity<Integer> responseEntity = ResponseEntity.status(200).body(entity);
assertEquals(200, responseEntity.getStatusCode().value());
assertEquals(entity, responseEntity.getBody());
}
@Test
public void customStatusCode() {
Integer entity = 42;
ResponseEntity<Integer> responseEntity = ResponseEntity.status(299).body(entity);
assertEquals(299, responseEntity.getStatusCodeValue());
assertEquals(entity, responseEntity.getBody());
}
}