/* * 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 org.hamcrest.Matcher; import org.springframework.http.HttpStatus; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultMatcher; import static org.hamcrest.MatcherAssert.*; import static org.springframework.test.util.AssertionErrors.*; /** * Factory for assertions on the response status. * * <p>An instance of this class is typically accessed via * {@link MockMvcResultMatchers#status}. * * @author Keesun Baik * @author Rossen Stoyanchev * @author Sebastien Deleuze * @author Brian Clozel * @since 3.2 */ public class StatusResultMatchers { /** * Protected constructor. * Use {@link MockMvcResultMatchers#status()}. */ protected StatusResultMatchers() { } /** * Assert the response status code with the given Hamcrest {@link Matcher}. */ public ResultMatcher is(final Matcher<Integer> matcher) { return result -> assertThat("Response status", result.getResponse().getStatus(), matcher); } /** * Assert the response status code is equal to an integer value. */ public ResultMatcher is(final int status) { return result -> assertEquals("Response status", status, result.getResponse().getStatus()); } /** * Assert the response status code is in the 1xx range. */ public ResultMatcher is1xxInformational() { return result -> assertEquals("Range for response status value " + result.getResponse().getStatus(), HttpStatus.Series.INFORMATIONAL, getHttpStatusSeries(result)); } /** * Assert the response status code is in the 2xx range. */ public ResultMatcher is2xxSuccessful() { return result -> assertEquals("Range for response status value " + result.getResponse().getStatus(), HttpStatus.Series.SUCCESSFUL, getHttpStatusSeries(result)); } /** * Assert the response status code is in the 3xx range. */ public ResultMatcher is3xxRedirection() { return result -> assertEquals("Range for response status value " + result.getResponse().getStatus(), HttpStatus.Series.REDIRECTION, getHttpStatusSeries(result)); } /** * Assert the response status code is in the 4xx range. */ public ResultMatcher is4xxClientError() { return result -> assertEquals("Range for response status value " + result.getResponse().getStatus(), HttpStatus.Series.CLIENT_ERROR, getHttpStatusSeries(result)); } /** * Assert the response status code is in the 5xx range. */ public ResultMatcher is5xxServerError() { return result -> assertEquals("Range for response status value " + result.getResponse().getStatus(), HttpStatus.Series.SERVER_ERROR, getHttpStatusSeries(result)); } private HttpStatus.Series getHttpStatusSeries(MvcResult result) { int statusValue = result.getResponse().getStatus(); HttpStatus status = HttpStatus.valueOf(statusValue); return status.series(); } /** * Assert the Servlet response error message with the given Hamcrest {@link Matcher}. */ public ResultMatcher reason(final Matcher<? super String> matcher) { return result -> assertThat("Response status reason", result.getResponse().getErrorMessage(), matcher); } /** * Assert the Servlet response error message. */ public ResultMatcher reason(final String reason) { return result -> assertEquals("Response status reason", reason, result.getResponse().getErrorMessage()); } /** * Assert the response status code is {@code HttpStatus.CONTINUE} (100). */ public ResultMatcher isContinue() { return matcher(HttpStatus.CONTINUE); } /** * Assert the response status code is {@code HttpStatus.SWITCHING_PROTOCOLS} (101). */ public ResultMatcher isSwitchingProtocols() { return matcher(HttpStatus.SWITCHING_PROTOCOLS); } /** * Assert the response status code is {@code HttpStatus.PROCESSING} (102). */ public ResultMatcher isProcessing() { return matcher(HttpStatus.PROCESSING); } /** * Assert the response status code is {@code HttpStatus.CHECKPOINT} (103). */ public ResultMatcher isCheckpoint() { return matcher(HttpStatus.valueOf(103)); } /** * Assert the response status code is {@code HttpStatus.OK} (200). */ public ResultMatcher isOk() { return matcher(HttpStatus.OK); } /** * Assert the response status code is {@code HttpStatus.CREATED} (201). */ public ResultMatcher isCreated() { return matcher(HttpStatus.CREATED); } /** * Assert the response status code is {@code HttpStatus.ACCEPTED} (202). */ public ResultMatcher isAccepted() { return matcher(HttpStatus.ACCEPTED); } /** * Assert the response status code is {@code HttpStatus.NON_AUTHORITATIVE_INFORMATION} (203). */ public ResultMatcher isNonAuthoritativeInformation() { return matcher(HttpStatus.NON_AUTHORITATIVE_INFORMATION); } /** * Assert the response status code is {@code HttpStatus.NO_CONTENT} (204). */ public ResultMatcher isNoContent() { return matcher(HttpStatus.NO_CONTENT); } /** * Assert the response status code is {@code HttpStatus.RESET_CONTENT} (205). */ public ResultMatcher isResetContent() { return matcher(HttpStatus.RESET_CONTENT); } /** * Assert the response status code is {@code HttpStatus.PARTIAL_CONTENT} (206). */ public ResultMatcher isPartialContent() { return matcher(HttpStatus.PARTIAL_CONTENT); } /** * Assert the response status code is {@code HttpStatus.MULTI_STATUS} (207). */ public ResultMatcher isMultiStatus() { return matcher(HttpStatus.MULTI_STATUS); } /** * Assert the response status code is {@code HttpStatus.ALREADY_REPORTED} (208). */ public ResultMatcher isAlreadyReported() { return matcher(HttpStatus.ALREADY_REPORTED); } /** * Assert the response status code is {@code HttpStatus.IM_USED} (226). */ public ResultMatcher isImUsed() { return matcher(HttpStatus.IM_USED); } /** * Assert the response status code is {@code HttpStatus.MULTIPLE_CHOICES} (300). */ public ResultMatcher isMultipleChoices() { return matcher(HttpStatus.MULTIPLE_CHOICES); } /** * Assert the response status code is {@code HttpStatus.MOVED_PERMANENTLY} (301). */ public ResultMatcher isMovedPermanently() { return matcher(HttpStatus.MOVED_PERMANENTLY); } /** * Assert the response status code is {@code HttpStatus.FOUND} (302). */ public ResultMatcher isFound() { return matcher(HttpStatus.FOUND); } /** * Assert the response status code is {@code HttpStatus.MOVED_TEMPORARILY} (302). * @see #isFound() * @deprecated in favor of {@link #isFound()} */ @Deprecated public ResultMatcher isMovedTemporarily() { return matcher(HttpStatus.MOVED_TEMPORARILY); } /** * Assert the response status code is {@code HttpStatus.SEE_OTHER} (303). */ public ResultMatcher isSeeOther() { return matcher(HttpStatus.SEE_OTHER); } /** * Assert the response status code is {@code HttpStatus.NOT_MODIFIED} (304). */ public ResultMatcher isNotModified() { return matcher(HttpStatus.NOT_MODIFIED); } /** * Assert the response status code is {@code HttpStatus.USE_PROXY} (305). * @deprecated matching the deprecation of {@code HttpStatus.USE_PROXY} */ @Deprecated public ResultMatcher isUseProxy() { return matcher(HttpStatus.USE_PROXY); } /** * Assert the response status code is {@code HttpStatus.TEMPORARY_REDIRECT} (307). */ public ResultMatcher isTemporaryRedirect() { return matcher(HttpStatus.TEMPORARY_REDIRECT); } /** * Assert the response status code is {@code HttpStatus.PERMANENT_REDIRECT} (308). */ public ResultMatcher isPermanentRedirect() { return matcher(HttpStatus.valueOf(308)); } /** * Assert the response status code is {@code HttpStatus.BAD_REQUEST} (400). */ public ResultMatcher isBadRequest() { return matcher(HttpStatus.BAD_REQUEST); } /** * Assert the response status code is {@code HttpStatus.UNAUTHORIZED} (401). */ public ResultMatcher isUnauthorized() { return matcher(HttpStatus.UNAUTHORIZED); } /** * Assert the response status code is {@code HttpStatus.PAYMENT_REQUIRED} (402). */ public ResultMatcher isPaymentRequired() { return matcher(HttpStatus.PAYMENT_REQUIRED); } /** * Assert the response status code is {@code HttpStatus.FORBIDDEN} (403). */ public ResultMatcher isForbidden() { return matcher(HttpStatus.FORBIDDEN); } /** * Assert the response status code is {@code HttpStatus.NOT_FOUND} (404). */ public ResultMatcher isNotFound() { return matcher(HttpStatus.NOT_FOUND); } /** * Assert the response status code is {@code HttpStatus.METHOD_NOT_ALLOWED} (405). */ public ResultMatcher isMethodNotAllowed() { return matcher(HttpStatus.METHOD_NOT_ALLOWED); } /** * Assert the response status code is {@code HttpStatus.NOT_ACCEPTABLE} (406). */ public ResultMatcher isNotAcceptable() { return matcher(HttpStatus.NOT_ACCEPTABLE); } /** * Assert the response status code is {@code HttpStatus.PROXY_AUTHENTICATION_REQUIRED} (407). */ public ResultMatcher isProxyAuthenticationRequired() { return matcher(HttpStatus.PROXY_AUTHENTICATION_REQUIRED); } /** * Assert the response status code is {@code HttpStatus.REQUEST_TIMEOUT} (408). */ public ResultMatcher isRequestTimeout() { return matcher(HttpStatus.REQUEST_TIMEOUT); } /** * Assert the response status code is {@code HttpStatus.CONFLICT} (409). */ public ResultMatcher isConflict() { return matcher(HttpStatus.CONFLICT); } /** * Assert the response status code is {@code HttpStatus.GONE} (410). */ public ResultMatcher isGone() { return matcher(HttpStatus.GONE); } /** * Assert the response status code is {@code HttpStatus.LENGTH_REQUIRED} (411). */ public ResultMatcher isLengthRequired() { return matcher(HttpStatus.LENGTH_REQUIRED); } /** * Assert the response status code is {@code HttpStatus.PRECONDITION_FAILED} (412). */ public ResultMatcher isPreconditionFailed() { return matcher(HttpStatus.PRECONDITION_FAILED); } /** * Assert the response status code is {@code HttpStatus.PAYLOAD_TOO_LARGE} (413). * @since 4.1 */ public ResultMatcher isPayloadTooLarge() { return matcher(HttpStatus.PAYLOAD_TOO_LARGE); } /** * Assert the response status code is {@code HttpStatus.REQUEST_ENTITY_TOO_LARGE} (413). * @deprecated matching the deprecation of {@code HttpStatus.REQUEST_ENTITY_TOO_LARGE} * @see #isPayloadTooLarge() */ @Deprecated public ResultMatcher isRequestEntityTooLarge() { return matcher(HttpStatus.REQUEST_ENTITY_TOO_LARGE); } /** * Assert the response status code is {@code HttpStatus.REQUEST_URI_TOO_LONG} (414). * @since 4.1 */ public ResultMatcher isUriTooLong() { return matcher(HttpStatus.URI_TOO_LONG); } /** * Assert the response status code is {@code HttpStatus.REQUEST_URI_TOO_LONG} (414). * @deprecated matching the deprecation of {@code HttpStatus.REQUEST_URI_TOO_LONG} * @see #isUriTooLong() */ @Deprecated public ResultMatcher isRequestUriTooLong() { return matcher(HttpStatus.REQUEST_URI_TOO_LONG); } /** * Assert the response status code is {@code HttpStatus.UNSUPPORTED_MEDIA_TYPE} (415). */ public ResultMatcher isUnsupportedMediaType() { return matcher(HttpStatus.UNSUPPORTED_MEDIA_TYPE); } /** * Assert the response status code is {@code HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE} (416). */ public ResultMatcher isRequestedRangeNotSatisfiable() { return matcher(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE); } /** * Assert the response status code is {@code HttpStatus.EXPECTATION_FAILED} (417). */ public ResultMatcher isExpectationFailed() { return matcher(HttpStatus.EXPECTATION_FAILED); } /** * Assert the response status code is {@code HttpStatus.I_AM_A_TEAPOT} (418). */ public ResultMatcher isIAmATeapot() { return matcher(HttpStatus.valueOf(418)); } /** * Assert the response status code is {@code HttpStatus.INSUFFICIENT_SPACE_ON_RESOURCE} (419). * @deprecated matching the deprecation of {@code HttpStatus.INSUFFICIENT_SPACE_ON_RESOURCE} */ @Deprecated public ResultMatcher isInsufficientSpaceOnResource() { return matcher(HttpStatus.INSUFFICIENT_SPACE_ON_RESOURCE); } /** * Assert the response status code is {@code HttpStatus.METHOD_FAILURE} (420). * @deprecated matching the deprecation of {@code HttpStatus.METHOD_FAILURE} */ @Deprecated public ResultMatcher isMethodFailure() { return matcher(HttpStatus.METHOD_FAILURE); } /** * Assert the response status code is {@code HttpStatus.DESTINATION_LOCKED} (421). * @deprecated matching the deprecation of {@code HttpStatus.DESTINATION_LOCKED} */ @Deprecated public ResultMatcher isDestinationLocked() { return matcher(HttpStatus.DESTINATION_LOCKED); } /** * Assert the response status code is {@code HttpStatus.UNPROCESSABLE_ENTITY} (422). */ public ResultMatcher isUnprocessableEntity() { return matcher(HttpStatus.UNPROCESSABLE_ENTITY); } /** * Assert the response status code is {@code HttpStatus.LOCKED} (423). */ public ResultMatcher isLocked() { return matcher(HttpStatus.LOCKED); } /** * Assert the response status code is {@code HttpStatus.FAILED_DEPENDENCY} (424). */ public ResultMatcher isFailedDependency() { return matcher(HttpStatus.FAILED_DEPENDENCY); } /** * Assert the response status code is {@code HttpStatus.UPGRADE_REQUIRED} (426). */ public ResultMatcher isUpgradeRequired() { return matcher(HttpStatus.UPGRADE_REQUIRED); } /** * Assert the response status code is {@code HttpStatus.PRECONDITION_REQUIRED} (428). */ public ResultMatcher isPreconditionRequired() { return matcher(HttpStatus.valueOf(428)); } /** * Assert the response status code is {@code HttpStatus.TOO_MANY_REQUESTS} (429). */ public ResultMatcher isTooManyRequests() { return matcher(HttpStatus.valueOf(429)); } /** * Assert the response status code is {@code HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE} (431). */ public ResultMatcher isRequestHeaderFieldsTooLarge() { return matcher(HttpStatus.valueOf(431)); } /** * Assert the response status code is {@code HttpStatus.UNAVAILABLE_FOR_LEGAL_REASONS} (451). * @since 4.3 */ public ResultMatcher isUnavailableForLegalReasons() { return matcher(HttpStatus.valueOf(451)); } /** * Assert the response status code is {@code HttpStatus.INTERNAL_SERVER_ERROR} (500). */ public ResultMatcher isInternalServerError() { return matcher(HttpStatus.INTERNAL_SERVER_ERROR); } /** * Assert the response status code is {@code HttpStatus.NOT_IMPLEMENTED} (501). */ public ResultMatcher isNotImplemented() { return matcher(HttpStatus.NOT_IMPLEMENTED); } /** * Assert the response status code is {@code HttpStatus.BAD_GATEWAY} (502). */ public ResultMatcher isBadGateway() { return matcher(HttpStatus.BAD_GATEWAY); } /** * Assert the response status code is {@code HttpStatus.SERVICE_UNAVAILABLE} (503). */ public ResultMatcher isServiceUnavailable() { return matcher(HttpStatus.SERVICE_UNAVAILABLE); } /** * Assert the response status code is {@code HttpStatus.GATEWAY_TIMEOUT} (504). */ public ResultMatcher isGatewayTimeout() { return matcher(HttpStatus.GATEWAY_TIMEOUT); } /** * Assert the response status code is {@code HttpStatus.HTTP_VERSION_NOT_SUPPORTED} (505). */ public ResultMatcher isHttpVersionNotSupported() { return matcher(HttpStatus.HTTP_VERSION_NOT_SUPPORTED); } /** * Assert the response status code is {@code HttpStatus.VARIANT_ALSO_NEGOTIATES} (506). */ public ResultMatcher isVariantAlsoNegotiates() { return matcher(HttpStatus.VARIANT_ALSO_NEGOTIATES); } /** * Assert the response status code is {@code HttpStatus.INSUFFICIENT_STORAGE} (507). */ public ResultMatcher isInsufficientStorage() { return matcher(HttpStatus.INSUFFICIENT_STORAGE); } /** * Assert the response status code is {@code HttpStatus.LOOP_DETECTED} (508). */ public ResultMatcher isLoopDetected() { return matcher(HttpStatus.LOOP_DETECTED); } /** * Assert the response status code is {@code HttpStatus.BANDWIDTH_LIMIT_EXCEEDED} (509). */ public ResultMatcher isBandwidthLimitExceeded() { return matcher(HttpStatus.valueOf(509)); } /** * Assert the response status code is {@code HttpStatus.NOT_EXTENDED} (510). */ public ResultMatcher isNotExtended() { return matcher(HttpStatus.NOT_EXTENDED); } /** * Assert the response status code is {@code HttpStatus.NETWORK_AUTHENTICATION_REQUIRED} (511). */ public ResultMatcher isNetworkAuthenticationRequired() { return matcher(HttpStatus.valueOf(511)); } /** * Match the expected response status to that of the HttpServletResponse */ private ResultMatcher matcher(final HttpStatus status) { return result -> assertEquals("Status", status.value(), result.getResponse().getStatus()); } }