|
33 | 33 | import java.util.List;
|
34 | 34 | import java.util.Locale;
|
35 | 35 | import java.util.Map.Entry;
|
| 36 | +import java.util.Set; |
36 | 37 | import java.util.TimeZone;
|
37 | 38 |
|
38 | 39 | import org.junit.jupiter.api.Test;
|
39 | 40 |
|
| 41 | +import static java.util.stream.Collectors.toList; |
40 | 42 | import static org.assertj.core.api.Assertions.assertThat;
|
| 43 | +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; |
41 | 44 | import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
| 45 | +import static org.assertj.core.api.Assertions.entry; |
42 | 46 |
|
43 | 47 | /**
|
44 | 48 | * Unit tests for {@link org.springframework.http.HttpHeaders}.
|
@@ -570,6 +574,91 @@ public void bearerAuth() {
|
570 | 574 | assertThat(authorization).isEqualTo("Bearer foo");
|
571 | 575 | }
|
572 | 576 |
|
| 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 | + |
573 | 662 | @Test
|
574 | 663 | public void removalFromKeySetRemovesEntryFromUnderlyingMap() {
|
575 | 664 | String headerName = "MyHeader";
|
|
0 commit comments