Skip to content

Commit

Permalink
Support custom status code in ExchangeResult for WebTestClient
Browse files Browse the repository at this point in the history
Prior to this commit, ExchangeResult.assertWithDiagnostics() threw an
IllegalArgumentException for a custom HTTP status code since toString()
invoked getStatus() without a try-catch block.

This commit addresses this issue by introducing a formatStatus() method
that defensively formats the response status, initially trying to
format the HttpStatus and falling back to formatting the raw integer
status code.

Closes gh-29283
  • Loading branch information
sbrannen committed Oct 8, 2022
1 parent 1c1a0af commit b20de75
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 5 deletions.
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2021 the original author or authors.
* Copyright 2002-2022 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.
Expand Down Expand Up @@ -50,6 +50,7 @@
* respectively.
*
* @author Rossen Stoyanchev
* @author Sam Brannen
* @since 5.0
* @see EntityExchangeResult
* @see FluxExchangeResult
Expand Down Expand Up @@ -171,6 +172,8 @@ public byte[] getRequestBodyContent() {

/**
* Return the HTTP status code as an {@link HttpStatus} enum value.
* @throws IllegalArgumentException in case of an unknown HTTP status code
* @see #getRawStatusCode()
*/
public HttpStatus getStatus() {
return this.response.getStatusCode();
Expand Down Expand Up @@ -248,13 +251,22 @@ public String toString() {
"\n" +
formatBody(getRequestHeaders().getContentType(), this.requestBody) + "\n" +
"\n" +
"< " + getStatus() + " " + getStatus().getReasonPhrase() + "\n" +
"< " + formatStatus() + "\n" +
"< " + formatHeaders(getResponseHeaders(), "\n< ") + "\n" +
"\n" +
formatBody(getResponseHeaders().getContentType(), this.responseBody) +"\n" +
formatMockServerResult();
}

private String formatStatus() {
try {
return getStatus() + " " + getStatus().getReasonPhrase();
}
catch (Exception ex) {
return Integer.toString(getRawStatusCode());
}
}

private String formatHeaders(HttpHeaders headers, String delimiter) {
return headers.entrySet().stream()
.map(entry -> entry.getKey() + ": " + entry.getValue())
Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2021 the original author or authors.
* Copyright 2002-2022 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.
Expand Down Expand Up @@ -36,6 +36,7 @@
* Unit tests for {@link StatusAssertions}.
*
* @author Rossen Stoyanchev
* @author Sam Brannen
*/
class StatusAssertionTests {

Expand All @@ -56,9 +57,20 @@ void isEqualTo() {
assertions.isEqualTo(408));
}

@Test // gh-23630
@Test // gh-23630, gh-29283
void isEqualToWithCustomStatus() {
statusAssertions(600).isEqualTo(600);
StatusAssertions assertions = statusAssertions(600);

// Success
assertions.isEqualTo(600);

// Wrong status
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
assertions.isEqualTo(HttpStatus.REQUEST_TIMEOUT));

// Wrong status value
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
assertions.isEqualTo(408));
}

@Test
Expand Down

0 comments on commit b20de75

Please sign in to comment.