Skip to content

Commit a2c8a93

Browse files
authored
test(compat-0.3): cover null part metadata conversions (#1289)
Add regression coverage for text and data metadata conversion and defensive copying. The runtime fix is already in #1261. Related to #1275. Signed-off-by: Japneet Singh <japneet.singh2024@gmail.com>
1 parent e5483dd commit a2c8a93

2 files changed

Lines changed: 50 additions & 0 deletions

File tree

‎compat-0.3/server-conversion/src/test/java/org/a2aproject/sdk/compat03/conversion/mappers/domain/NullData_v0_3_Test.java‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@
88
import java.util.Collections;
99
import java.util.Map;
1010
import org.a2aproject.sdk.compat03.spec.DataPart_v0_3;
11+
import org.a2aproject.sdk.compat03.spec.Part_v0_3;
12+
import org.a2aproject.sdk.compat03.spec.TextPart_v0_3;
1113
import org.a2aproject.sdk.spec.DataPart;
1214
import org.a2aproject.sdk.spec.InvalidRequestError;
15+
import org.a2aproject.sdk.spec.Part;
16+
import org.a2aproject.sdk.spec.TextPart;
1317
import org.junit.jupiter.api.Test;
1418
import org.junit.jupiter.params.ParameterizedTest;
1519
import org.junit.jupiter.params.provider.ValueSource;
@@ -31,6 +35,36 @@ void objectNullsSurviveBothConversionDirections() {
3135
assertEquals(original, PartMapper_v0_3.INSTANCE.toV10(legacy));
3236
}
3337

38+
@ParameterizedTest
39+
@ValueSource(strings = {"text", "data"})
40+
void partMetadataNullsSurviveBothConversionDirections(String kind) {
41+
Map<String, Object> metadata = Collections.singletonMap("optional", null);
42+
Map<String, Object> data = Map.of("value", "hello");
43+
Part<?> current =
44+
kind.equals("text")
45+
? new TextPart("hello", metadata)
46+
: new DataPart(data, metadata);
47+
Part_v0_3<?> legacy =
48+
kind.equals("text")
49+
? new TextPart_v0_3("hello", metadata)
50+
: new DataPart_v0_3(data, metadata);
51+
52+
Part_v0_3<?> downgraded = PartMapper_v0_3.INSTANCE.fromV10(current);
53+
Part<?> upgraded = PartMapper_v0_3.INSTANCE.toV10(legacy);
54+
assertEquals(legacy, downgraded);
55+
assertEquals(current, upgraded);
56+
assertEquals(
57+
metadata,
58+
kind.equals("text")
59+
? assertInstanceOf(TextPart_v0_3.class, downgraded).metadata()
60+
: assertInstanceOf(DataPart_v0_3.class, downgraded).metadata());
61+
assertEquals(
62+
metadata,
63+
kind.equals("text")
64+
? assertInstanceOf(TextPart.class, upgraded).metadata()
65+
: assertInstanceOf(DataPart.class, upgraded).metadata());
66+
}
67+
3468
@ParameterizedTest
3569
@ValueSource(strings = {"null", "[]", "42", "true", "\"text\""})
3670
void nonObjectDataCannotBeDowngraded(String json) {

‎compat-0.3/spec/src/test/java/org/a2aproject/sdk/compat03/spec/NullValues_v0_3_Test.java‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,22 @@ void dataObjectWithNullValuesIsDefensivelyCopied() {
8484
assertThrows(UnsupportedOperationException.class, () -> part.data().put("later", true));
8585
}
8686

87+
@ParameterizedTest
88+
@ValueSource(strings = {"text", "data"})
89+
void partMetadataWithNullValuesIsDefensivelyCopied(String kind) {
90+
Map<String, Object> metadata = new HashMap<>();
91+
metadata.put("optional", null);
92+
Map<String, Object> copiedMetadata =
93+
kind.equals("text")
94+
? new TextPart_v0_3("hello", metadata).metadata()
95+
: new DataPart_v0_3(Map.of("value", "hello"), metadata).metadata();
96+
metadata.put("optional", "changed");
97+
metadata.put("later", true);
98+
99+
assertEquals(Collections.singletonMap("optional", null), copiedMetadata);
100+
assertThrows(UnsupportedOperationException.class, () -> copiedMetadata.put("later", true));
101+
}
102+
87103
@Test
88104
void nullDataObjectRemainsInvalid() {
89105
assertThrows(IllegalArgumentException.class, () -> new DataPart_v0_3(null));

0 commit comments

Comments
 (0)