/* * Copyright 2002-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.test.web.servlet.result; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.TimeZone; import org.hamcrest.Matcher; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.web.servlet.ResultMatcher; import static org.hamcrest.MatcherAssert.*; import static org.springframework.test.util.AssertionErrors.*; /** * Factory for response header assertions. * * <p>An instance of this class is available via * {@link MockMvcResultMatchers#header}. * * @author Rossen Stoyanchev * @author Sam Brannen * @author Brian Clozel * @since 3.2 */ public class HeaderResultMatchers { /** * Protected constructor. * See {@link MockMvcResultMatchers#header()}. */ protected HeaderResultMatchers() { } /** * Assert the primary value of the response header with the given Hamcrest * String {@code Matcher}. */ public ResultMatcher string(final String name, final Matcher<? super String> matcher) { return result -> assertThat("Response header '" + name + "'", result.getResponse().getHeader(name), matcher); } /** * Assert the values of the response header with the given Hamcrest * Iterable {@link Matcher}. * @since 4.3 */ public <T> ResultMatcher stringValues(final String name, final Matcher<Iterable<String>> matcher) { return result -> { List<String> values = result.getResponse().getHeaders(name); assertThat("Response header '" + name + "'", values, matcher); }; } /** * Assert the primary value of the response header as a String value. */ public ResultMatcher string(final String name, final String value) { return result -> assertEquals("Response header '" + name + "'", value, result.getResponse().getHeader(name)); } /** * Assert the values of the response header as String values. * @since 4.3 */ public ResultMatcher stringValues(final String name, final String... values) { return result -> { List<Object> actual = result.getResponse().getHeaderValues(name); assertEquals("Response header '" + name + "'", Arrays.asList(values), actual); }; } /** * Assert that the named response header does not exist. * @since 4.0 */ public ResultMatcher doesNotExist(final String name) { return result -> assertTrue("Response should not contain header '" + name + "'", !result.getResponse().containsHeader(name)); } /** * Assert the primary value of the named response header as a {@code long}. * <p>The {@link ResultMatcher} returned by this method throws an * {@link AssertionError} if the response does not contain the specified * header, or if the supplied {@code value} does not match the primary value. */ public ResultMatcher longValue(final String name, final long value) { return result -> { MockHttpServletResponse response = result.getResponse(); assertTrue("Response does not contain header '" + name + "'", response.containsHeader(name)); assertEquals("Response header '" + name + "'", value, Long.parseLong(response.getHeader(name))); }; } /** * Assert the primary value of the named response header as a date String, * using the preferred date format described in RFC 7231. * <p>The {@link ResultMatcher} returned by this method throws an * {@link AssertionError} if the response does not contain the specified * header, or if the supplied {@code value} does not match the primary value. * @see <a href="https://tools.ietf.org/html/rfc7231#section-7.1.1.1">Section 7.1.1.1 of RFC 7231</a> * @since 4.2 */ public ResultMatcher dateValue(final String name, final long value) { return result -> { SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); format.setTimeZone(TimeZone.getTimeZone("GMT")); String formatted = format.format(new Date(value)); MockHttpServletResponse response = result.getResponse(); assertTrue("Response does not contain header '" + name + "'", response.containsHeader(name)); assertEquals("Response header '" + name + "'", formatted, response.getHeader(name)); }; } }