diff --git a/src/main/java/dev/openfeature/sdk/ImmutableMetadata.java b/src/main/java/dev/openfeature/sdk/ImmutableMetadata.java index 945e0ea17..c6c47da59 100644 --- a/src/main/java/dev/openfeature/sdk/ImmutableMetadata.java +++ b/src/main/java/dev/openfeature/sdk/ImmutableMetadata.java @@ -101,7 +101,7 @@ public T getValue(final String key, final Class type) { } public Map asUnmodifiableMap() { - return Collections.unmodifiableMap(metadata); + return metadata.isEmpty() ? Collections.emptyMap() : Collections.unmodifiableMap(metadata); } public boolean isEmpty() { @@ -199,6 +199,9 @@ public ImmutableMetadataBuilder addBoolean(final String key, final Boolean value * Retrieve {@link ImmutableMetadata} with provided key,value pairs. */ public ImmutableMetadata build() { + if (metadata.isEmpty()) { + return EMPTY; + } return new ImmutableMetadata(this.metadata); } } diff --git a/src/test/java/dev/openfeature/sdk/ImmutableMetadataTest.java b/src/test/java/dev/openfeature/sdk/ImmutableMetadataTest.java index 108fac0fe..54416850c 100644 --- a/src/test/java/dev/openfeature/sdk/ImmutableMetadataTest.java +++ b/src/test/java/dev/openfeature/sdk/ImmutableMetadataTest.java @@ -1,10 +1,12 @@ package dev.openfeature.sdk; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import java.util.Map; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class ImmutableMetadataTest { @@ -38,4 +40,18 @@ void retrieveAsUnmodifiableMap() { assertEquals(unmodifiableMap.get("key1"), "value1"); Assertions.assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("key3", "value3")); } + + @Test + @DisplayName("empty builder returns EMPTY singleton") + void emptyBuilderReturnsEmptySingleton() { + assertThat(ImmutableMetadata.builder().build()).isSameAs(ImmutableMetadata.EMPTY); + } + + @Test + @DisplayName("asUnmodifiableMap on empty metadata returns empty unmodifiable map") + void asUnmodifiableMapOnEmptyMetadataIsUnmodifiable() { + Map map = ImmutableMetadata.EMPTY.asUnmodifiableMap(); + assertThat(map).isEmpty(); + Assertions.assertThrows(UnsupportedOperationException.class, () -> map.put("key", "value")); + } }