@ -19,7 +19,9 @@ package org.springframework.test.http;
@@ -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;
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 < > ( ) ;