|
|
|
@ -19,7 +19,9 @@ package org.springframework.test.http; |
|
|
|
import java.time.Instant; |
|
|
|
import java.time.Instant; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
import java.util.function.Consumer; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.assertj.core.api.Assertions; |
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.http.HttpHeaders; |
|
|
|
import org.springframework.http.HttpHeaders; |
|
|
|
@ -27,11 +29,16 @@ import org.springframework.util.LinkedMultiValueMap; |
|
|
|
import org.springframework.util.MultiValueMap; |
|
|
|
import org.springframework.util.MultiValueMap; |
|
|
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType; |
|
|
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType; |
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThatIllegalStateException; |
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThatNoException; |
|
|
|
|
|
|
|
import static org.mockito.Mockito.mock; |
|
|
|
|
|
|
|
import static org.mockito.Mockito.verify; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Tests for {@link HttpHeadersAssert}. |
|
|
|
* Tests for {@link HttpHeadersAssert}. |
|
|
|
* |
|
|
|
* |
|
|
|
* @author Stephane Nicoll |
|
|
|
* @author Stephane Nicoll |
|
|
|
|
|
|
|
* @author Simon Baslé |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
class HttpHeadersAssertTests { |
|
|
|
class HttpHeadersAssertTests { |
|
|
|
|
|
|
|
|
|
|
|
@ -62,6 +69,37 @@ class HttpHeadersAssertTests { |
|
|
|
.withMessageContainingAll("HTTP headers", "first", "wrong-name", "another-wrong-name"); |
|
|
|
.withMessageContainingAll("HTTP headers", "first", "wrong-name", "another-wrong-name"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void containsOnlyHeaders() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.add("name1", "value1"); |
|
|
|
|
|
|
|
headers.add("name2", "value2"); |
|
|
|
|
|
|
|
assertThat(headers).containsOnlyHeaders("name2", "name1"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void containsOnlyHeadersWithMissingOne() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.add("name1", "value1"); |
|
|
|
|
|
|
|
headers.add("name2", "value2"); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).containsOnlyHeaders("name1", "name2", "name3")) |
|
|
|
|
|
|
|
.withMessageContainingAll("check headers contains only HTTP headers", |
|
|
|
|
|
|
|
"could not find the following element(s)", "[\"name3\"]"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void containsOnlyHeadersWithExtraOne() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.add("name1", "value1"); |
|
|
|
|
|
|
|
headers.add("name2", "value2"); |
|
|
|
|
|
|
|
headers.add("name3", "value3"); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).containsOnlyHeaders("name1", "name2")) |
|
|
|
|
|
|
|
.withMessageContainingAll("check headers contains only HTTP headers", |
|
|
|
|
|
|
|
"the following element(s) were unexpected", "[\"name3\"]"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void doesNotContainHeader() { |
|
|
|
void doesNotContainHeader() { |
|
|
|
assertThat(Map.of("first", "1")).doesNotContainHeader("second"); |
|
|
|
assertThat(Map.of("first", "1")).doesNotContainHeader("second"); |
|
|
|
@ -89,6 +127,36 @@ class HttpHeadersAssertTests { |
|
|
|
.withMessageContainingAll("HTTP headers", "first", "second"); |
|
|
|
.withMessageContainingAll("HTTP headers", "first", "second"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
|
|
|
|
void hasHeaderSatisfying() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("header", List.of("first", "second", "third")); |
|
|
|
|
|
|
|
Consumer<List<String>> mock = mock(Consumer.class); |
|
|
|
|
|
|
|
assertThatNoException().isThrownBy(() -> assertThat(headers).hasHeaderSatisfying("header", mock)); |
|
|
|
|
|
|
|
verify(mock).accept(List.of("first", "second", "third")); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasHeaderSatisfyingWithExceptionInConsumer() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("header", List.of("first", "second", "third")); |
|
|
|
|
|
|
|
IllegalStateException testException = new IllegalStateException("test"); |
|
|
|
|
|
|
|
assertThatIllegalStateException() |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasHeaderSatisfying("header", values -> { |
|
|
|
|
|
|
|
throw testException; |
|
|
|
|
|
|
|
})).isEqualTo(testException); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasHeaderSatisfyingWithFailingAssertion() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("header", List.of("first", "second", "third")); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasHeaderSatisfying("header", values -> |
|
|
|
|
|
|
|
Assertions.assertThat(values).hasSize(42))) |
|
|
|
|
|
|
|
.withMessageContainingAll("HTTP header", "header", "first", "second", "third", "42", "3"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void hasValueWithStringMatch() { |
|
|
|
void hasValueWithStringMatch() { |
|
|
|
@ -177,6 +245,210 @@ class HttpHeadersAssertTests { |
|
|
|
.withMessageContainingAll("HTTP header", "header", "wrong-name"); |
|
|
|
.withMessageContainingAll("HTTP header", "header", "wrong-name"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasSingleValueWithStringMatch() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.add("header", "a"); |
|
|
|
|
|
|
|
assertThat(headers).hasSingleValue("header", "a"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasSingleValueWithSecondaryValues() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("header", List.of("first", "second", "third")); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasSingleValue("header", "first")) |
|
|
|
|
|
|
|
.withMessage("Expected HTTP header 'header' to be present without secondary values, " + |
|
|
|
|
|
|
|
"but found <2> secondary values"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasSingleValueWithLongMatch() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.add("header", "123"); |
|
|
|
|
|
|
|
assertThat(headers).hasSingleValue("header", 123); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasSingleValueWithLongMatchButSecondaryValues() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("header", List.of("123", "456", "789")); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasSingleValue("header", 123)) |
|
|
|
|
|
|
|
.withMessage("Expected HTTP header 'header' to be present without secondary values, " + |
|
|
|
|
|
|
|
"but found <2> secondary values"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasSingleValueWithInstantMatch() { |
|
|
|
|
|
|
|
Instant instant = Instant.now(); |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.setInstant("header", instant); |
|
|
|
|
|
|
|
assertThat(headers).hasSingleValue("header", instant); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasSingleValueWithInstantAndSecondaryValues() { |
|
|
|
|
|
|
|
Instant instant = Instant.now(); |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.setInstant("header", instant); |
|
|
|
|
|
|
|
headers.add("header", "second"); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasSingleValue("header", instant.minusSeconds(30))) |
|
|
|
|
|
|
|
.withMessage("Expected HTTP header 'header' to be present without secondary values, " + |
|
|
|
|
|
|
|
"but found <1> secondary values"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasExactlyValues() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("name", List.of("value1", "value2")); |
|
|
|
|
|
|
|
headers.add("otherName", "otherValue"); |
|
|
|
|
|
|
|
assertThat(headers).hasExactlyValues("name", List.of("value1", "value2")); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasExactlyValuesWithMissingOne() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("name", List.of("value1", "value2")); |
|
|
|
|
|
|
|
headers.add("otherName", "otherValue"); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasExactlyValues("name", List.of("value1", "value2", "value3"))) |
|
|
|
|
|
|
|
.withMessageContainingAll("check all values of HTTP header 'name'", |
|
|
|
|
|
|
|
"to contain exactly (and in same order)", |
|
|
|
|
|
|
|
"could not find the following elements", "[\"value3\"]"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasExactlyValuesWithExtraOne() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("name", List.of("value1", "value2")); |
|
|
|
|
|
|
|
headers.add("otherName", "otherValue"); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasExactlyValues("name", List.of("value1"))) |
|
|
|
|
|
|
|
.withMessageContainingAll("check all values of HTTP header 'name'", |
|
|
|
|
|
|
|
"to contain exactly (and in same order)", |
|
|
|
|
|
|
|
"some elements were not expected", "[\"value2\"]"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasExactlyValuesWithWrongOrder() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("name", List.of("value1", "value2")); |
|
|
|
|
|
|
|
headers.add("otherName", "otherValue"); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasExactlyValues("name", List.of("value2", "value1"))) |
|
|
|
|
|
|
|
.withMessageContainingAll("check all values of HTTP header 'name'", |
|
|
|
|
|
|
|
"to contain exactly (and in same order)", |
|
|
|
|
|
|
|
"there were differences at these indexes", |
|
|
|
|
|
|
|
"element at index 0: expected \"value2\" but was \"value1\"", |
|
|
|
|
|
|
|
"element at index 1: expected \"value1\" but was \"value2\""); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasExactlyValuesInAnyOrder() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("name", List.of("value1", "value2")); |
|
|
|
|
|
|
|
headers.add("otherName", "otherValue"); |
|
|
|
|
|
|
|
assertThat(headers).hasExactlyValuesInAnyOrder("name", List.of("value1", "value2")); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasExactlyValuesInAnyOrderWithDifferentOrder() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("name", List.of("value1", "value2")); |
|
|
|
|
|
|
|
headers.add("otherName", "otherValue"); |
|
|
|
|
|
|
|
assertThat(headers).hasExactlyValuesInAnyOrder("name", List.of("value2", "value1")); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasExactlyValuesInAnyOrderWithMissingOne() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("name", List.of("value1", "value2")); |
|
|
|
|
|
|
|
headers.add("otherName", "otherValue"); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasExactlyValuesInAnyOrder("name", |
|
|
|
|
|
|
|
List.of("value1", "value2", "value3"))) |
|
|
|
|
|
|
|
.withMessageContainingAll("check all values of HTTP header 'name'", |
|
|
|
|
|
|
|
"to contain exactly in any order", |
|
|
|
|
|
|
|
"could not find the following elements", "[\"value3\"]"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasExactlyValuesInAnyOrderWithExtraOne() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.addAll("name", List.of("value1", "value2")); |
|
|
|
|
|
|
|
headers.add("otherName", "otherValue"); |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasExactlyValuesInAnyOrder("name", List.of("value1"))) |
|
|
|
|
|
|
|
.withMessageContainingAll("check all values of HTTP header 'name'", |
|
|
|
|
|
|
|
"to contain exactly in any order", |
|
|
|
|
|
|
|
"the following elements were unexpected", "[\"value2\"]"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void isEmpty() { |
|
|
|
|
|
|
|
assertThat(new HttpHeaders()).isEmpty(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void isEmptyWithHeaders() { |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(Map.of("first", "1", "second", "2")).isEmpty()) |
|
|
|
|
|
|
|
.withMessageContainingAll("check headers are empty", "Expecting empty", "first", "second"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void isNotEmpty() { |
|
|
|
|
|
|
|
assertThat(Map.of("header", "value")).isNotEmpty(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void isNotEmptyWithNoHeaders() { |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(new HttpHeaders()).isNotEmpty()) |
|
|
|
|
|
|
|
.withMessageContainingAll("check headers are not empty", "Expecting actual not to be empty"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasSize() { |
|
|
|
|
|
|
|
assertThat(Map.of("first", "1", "second", "2")).hasSize(2); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasSizeWithWrongSize() { |
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(Map.of("first", "1")).hasSize(42)) |
|
|
|
|
|
|
|
.withMessageContainingAll("check headers have size '42'", "1"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasSameSizeAs() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.add("name1", "value1"); |
|
|
|
|
|
|
|
headers.add("name2", "value2"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HttpHeaders other = new HttpHeaders(); |
|
|
|
|
|
|
|
other.add("name3", "value3"); |
|
|
|
|
|
|
|
other.add("name4", "value4"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertThat(headers).hasSameSizeAs(other); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void hasSameSizeAsWithSmallerOther() { |
|
|
|
|
|
|
|
HttpHeaders headers = new HttpHeaders(); |
|
|
|
|
|
|
|
headers.add("name1", "value1"); |
|
|
|
|
|
|
|
headers.add("name2", "value2"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HttpHeaders other = new HttpHeaders(); |
|
|
|
|
|
|
|
other.add("name3", "value3"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertThatExceptionOfType(AssertionError.class) |
|
|
|
|
|
|
|
.isThrownBy(() -> assertThat(headers).hasSameSizeAs(other)) |
|
|
|
|
|
|
|
.withMessageContainingAll("check headers have same size as '", other.toString(), |
|
|
|
|
|
|
|
"Expected size: 1 but was: 2"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private static HttpHeadersAssert assertThat(Map<String, String> values) { |
|
|
|
private static HttpHeadersAssert assertThat(Map<String, String> values) { |
|
|
|
MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); |
|
|
|
MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); |
|
|
|
|