Revisit HttpHeadersAssert after HttpHeaders API changes
- add various assertions to HttpHeadersAssert - improve assertion test coverage - remove niche size assertions Closes gh-34168 Co-authored-by: Stephane Nicoll <stephane.nicoll@broadcom.com>
This commit is contained in:
committed by
Stéphane Nicoll
parent
448d6c6ebf
commit
caf84ffe7d
@@ -19,7 +19,9 @@ package org.springframework.test.http;
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
@@ -27,11 +29,16 @@ import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
|
||||
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}.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
* @author Simon Baslé
|
||||
*/
|
||||
class HttpHeadersAssertTests {
|
||||
|
||||
@@ -62,6 +69,37 @@ class HttpHeadersAssertTests {
|
||||
.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
|
||||
void doesNotContainHeader() {
|
||||
assertThat(Map.of("first", "1")).doesNotContainHeader("second");
|
||||
@@ -89,6 +127,36 @@ class HttpHeadersAssertTests {
|
||||
.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
|
||||
void hasValueWithStringMatch() {
|
||||
@@ -177,6 +245,210 @@ class HttpHeadersAssertTests {
|
||||
.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) {
|
||||
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
|
||||
|
||||
Reference in New Issue
Block a user