Skip to content

Commit cf5cb94

Browse files
committed
Add additional tests for HttpHeaders.keySet() operations
See spring-projectsgh-22821
1 parent 077754b commit cf5cb94

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed

spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,16 @@
3333
import java.util.List;
3434
import java.util.Locale;
3535
import java.util.Map.Entry;
36+
import java.util.Set;
3637
import java.util.TimeZone;
3738

3839
import org.junit.jupiter.api.Test;
3940

41+
import static java.util.stream.Collectors.toList;
4042
import static org.assertj.core.api.Assertions.assertThat;
43+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
4144
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
45+
import static org.assertj.core.api.Assertions.entry;
4246

4347
/**
4448
* Unit tests for {@link org.springframework.http.HttpHeaders}.
@@ -570,6 +574,91 @@ public void bearerAuth() {
570574
assertThat(authorization).isEqualTo("Bearer foo");
571575
}
572576

577+
@Test
578+
public void keySetOperations() {
579+
headers.add("Alpha", "apple");
580+
headers.add("Bravo", "banana");
581+
Set<String> keySet = headers.keySet();
582+
583+
// Please DO NOT simplify the following with AssertJ's fluent API.
584+
//
585+
// We explicitly invoke methods directly on HttpHeaders#keySet()
586+
// here to check the behavior of the entire contract.
587+
588+
// isEmpty() and size()
589+
assertThat(keySet.isEmpty()).isFalse();
590+
assertThat(keySet.size()).isEqualTo(2);
591+
592+
// contains()
593+
assertThat(keySet.contains("Alpha")).as("Alpha should be present").isTrue();
594+
assertThat(keySet.contains("alpha")).as("alpha should be present").isTrue();
595+
assertThat(keySet.contains("Bravo")).as("Bravo should be present").isTrue();
596+
assertThat(keySet.contains("BRAVO")).as("BRAVO should be present").isTrue();
597+
assertThat(keySet.contains("Charlie")).as("Charlie should not be present").isFalse();
598+
599+
// toArray()
600+
assertThat(keySet.toArray()).isEqualTo(new String[] {"Alpha", "Bravo"});
601+
602+
// spliterator() via stream()
603+
assertThat(keySet.stream().collect(toList())).isEqualTo(Arrays.asList("Alpha", "Bravo"));
604+
605+
// iterator()
606+
List<String> results = new ArrayList<>();
607+
keySet.iterator().forEachRemaining(results::add);
608+
assertThat(results).isEqualTo(Arrays.asList("Alpha", "Bravo"));
609+
610+
// remove()
611+
assertThat(keySet.remove("Alpha")).isTrue();
612+
assertThat(keySet.size()).isEqualTo(1);
613+
assertThat(headers.size()).isEqualTo(1);
614+
assertThat(keySet.remove("Alpha")).isFalse();
615+
assertThat(keySet.size()).isEqualTo(1);
616+
assertThat(headers.size()).isEqualTo(1);
617+
618+
// clear()
619+
keySet.clear();
620+
assertThat(keySet.isEmpty()).isTrue();
621+
assertThat(keySet.size()).isEqualTo(0);
622+
assertThat(headers.isEmpty()).isTrue();
623+
assertThat(headers.size()).isEqualTo(0);
624+
625+
// Unsupported operations
626+
assertThatExceptionOfType(UnsupportedOperationException.class)
627+
.isThrownBy(() -> keySet.add("x"));
628+
assertThatExceptionOfType(UnsupportedOperationException.class)
629+
.isThrownBy(() -> keySet.addAll(Collections.singleton("enigma")));
630+
}
631+
632+
/**
633+
* This method intentionally checks a wider/different range of functionality
634+
* than {@link #removalFromKeySetRemovesEntryFromUnderlyingMap()}.
635+
*/
636+
@Test // https://github.com/spring-projects/spring-framework/issues/23633
637+
public void keySetRemovalChecks() {
638+
// --- Given ---
639+
headers.add("Alpha", "apple");
640+
headers.add("Bravo", "banana");
641+
assertThat(headers).containsOnlyKeys("Alpha", "Bravo");
642+
643+
// --- When ---
644+
boolean removed = headers.keySet().remove("Alpha");
645+
646+
// --- Then ---
647+
648+
// Please DO NOT simplify the following with AssertJ's fluent API.
649+
//
650+
// We explicitly invoke methods directly on HttpHeaders here to check
651+
// the behavior of the entire contract.
652+
653+
assertThat(removed).isTrue();
654+
assertThat(headers.keySet().remove("Alpha")).isFalse();
655+
assertThat(headers.size()).isEqualTo(1);
656+
assertThat(headers.containsKey("Alpha")).as("Alpha should have been removed").isFalse();
657+
assertThat(headers.containsKey("Bravo")).as("Bravo should be present").isTrue();
658+
assertThat(headers.keySet()).containsOnly("Bravo");
659+
assertThat(headers.entrySet()).containsOnly(entry("Bravo", Arrays.asList("banana")));
660+
}
661+
573662
@Test
574663
public void removalFromKeySetRemovesEntryFromUnderlyingMap() {
575664
String headerName = "MyHeader";

0 commit comments

Comments
 (0)