diff --git a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java index fde2ee17f78..8e65470a611 100644 --- a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java +++ b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java @@ -38,6 +38,7 @@ import java.util.TimeZone; import org.hamcrest.Matchers; import org.junit.Test; +import static java.util.stream.Collectors.toList; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; @@ -559,6 +560,80 @@ public class HttpHeadersTests { assertEquals("Bearer foo", authorization); } + @Test // https://github.com/spring-projects/spring-framework/issues/23633 + public void keySetRemove() { + // Given + headers.add("Alpha", "apple"); + headers.add("Bravo", "banana"); + assertEquals(2, headers.size()); + assertTrue("Alpha should be present", headers.containsKey("Alpha")); + assertTrue("Bravo should be present", headers.containsKey("Bravo")); + assertArrayEquals(new String[] {"Alpha", "Bravo"}, headers.keySet().toArray()); + + // When + boolean removed = headers.keySet().remove("Alpha"); + + // Then + assertTrue(removed); + assertFalse(headers.keySet().remove("Alpha")); + assertEquals(1, headers.size()); + assertFalse("Alpha should have been removed", headers.containsKey("Alpha")); + assertTrue("Bravo should be present", headers.containsKey("Bravo")); + assertArrayEquals(new String[] {"Bravo"}, headers.keySet().toArray()); + assertEquals(Collections.singletonMap("Bravo", Arrays.asList("banana")).entrySet(), headers.entrySet()); + } + + @Test + public void keySetOperations() { + headers.add("Alpha", "apple"); + headers.add("Bravo", "banana"); + assertEquals(2, headers.size()); + + // size() + assertEquals(2, headers.keySet().size()); + + // contains() + assertTrue("Alpha should be present", headers.keySet().contains("Alpha")); + assertTrue("alpha should be present", headers.keySet().contains("alpha")); + assertTrue("Bravo should be present", headers.keySet().contains("Bravo")); + assertTrue("BRAVO should be present", headers.keySet().contains("BRAVO")); + assertFalse("Charlie should not be present", headers.keySet().contains("Charlie")); + + // toArray() + assertArrayEquals(new String[] {"Alpha", "Bravo"}, headers.keySet().toArray()); + + // spliterator() via stream() + assertEquals(Arrays.asList("Alpha", "Bravo"), headers.keySet().stream().collect(toList())); + + // iterator() + List results = new ArrayList<>(); + headers.keySet().iterator().forEachRemaining(results::add); + assertEquals(Arrays.asList("Alpha", "Bravo"), results); + + // remove() + assertTrue(headers.keySet().remove("Alpha")); + assertEquals(1, headers.size()); + assertFalse(headers.keySet().remove("Alpha")); + + // clear() + headers.keySet().clear(); + assertEquals(0, headers.size()); + + // Unsupported operations + unsupported(() -> headers.keySet().add("x")); + unsupported(() -> headers.keySet().addAll(Collections.singleton("enigma"))); + } + + private static void unsupported(Runnable runnable) { + try { + runnable.run(); + fail("should have thrown an UnsupportedOperationException"); + } + catch (UnsupportedOperationException e) { + // expected + } + } + @Test public void removalFromKeySetRemovesEntryFromUnderlyingMap() { String headerName = "MyHeader";