1+ package org.axonframework.extensions.kotlin.serialization
2+
3+ import kotlinx.serialization.Serializable
4+ import kotlinx.serialization.cbor.Cbor
5+ import kotlinx.serialization.json.Json
6+ import kotlinx.serialization.modules.SerializersModule
7+ import kotlinx.serialization.modules.plus
8+ import kotlinx.serialization.modules.polymorphic
9+ import kotlinx.serialization.modules.subclass
10+ import org.axonframework.messaging.MetaData
11+ import org.junit.jupiter.api.Assertions.*
12+ import org.junit.jupiter.api.Test
13+
14+ class MetaDataSerializerTest {
15+
16+ // Custom object to test serialization of complex types in MetaData
17+ @Serializable
18+ data class CustomObject (val name : String , val value : Int , val active : Boolean = true )
19+
20+ // Extended module that includes our custom type serializer
21+ private val extendedModule = AxonSerializersModule + SerializersModule {
22+ // Correctly register the custom type for polymorphic serialization
23+ polymorphic(Any ::class ) {
24+ subclass(CustomObject ::class )
25+ }
26+ }
27+
28+ // Configure JSON with our serializers
29+ private val json = Json {
30+ serializersModule = extendedModule
31+ encodeDefaults = true
32+ // Important for polymorphic serialization
33+ classDiscriminator = " type"
34+ }
35+
36+ // Create a serializer with our configuration
37+ private val serializer = KotlinSerializer (serialFormat = json)
38+
39+ @Test
40+ fun `serialize empty metadata` () {
41+ val metadata = MetaData .emptyInstance()
42+
43+ val serialized = serializer.serialize(metadata, String ::class .java)
44+
45+ // Verify serialization format
46+ assertEquals(" {\" entries\" :{}}" , serialized.data)
47+
48+ // Verify deserialization - specifying type arguments explicitly
49+ val deserialized = serializer.deserialize<String , MetaData >(serialized)!!
50+ assertEquals(metadata, deserialized)
51+ assertTrue(deserialized.isEmpty())
52+ }
53+
54+ @Test
55+ fun `serialize metadata with primitive values` () {
56+ val metadata = MetaData .with (" stringKey" , " stringValue" )
57+ .and (" intKey" , 42 )
58+ .and (" booleanKey" , true )
59+ .and (" doubleKey" , 3.14 )
60+ .and (" nullKey" , null )
61+
62+ val serialized = serializer.serialize(metadata, String ::class .java)
63+
64+ // Verify deserialization - specifying type arguments explicitly
65+ val deserialized = serializer.deserialize<String , MetaData >(serialized)!!
66+
67+ assertEquals(metadata.size, deserialized.size)
68+ assertEquals(" stringValue" , deserialized[" stringKey" ])
69+ assertEquals(42 , deserialized[" intKey" ])
70+ assertEquals(true , deserialized[" booleanKey" ])
71+ assertEquals(3.14 , deserialized[" doubleKey" ])
72+ assertNull(deserialized[" nullKey" ])
73+ }
74+ //
75+ // @Test
76+ // fun `serialize metadata with collection values`() {
77+ // val metadata = MetaData.with("listKey", listOf("item1", "item2", "item3"))
78+ // .and("mapKey", mapOf("key1" to "value1", "key2" to "value2"))
79+ // .and("nestedListKey", listOf(listOf(1, 2), listOf(3, 4)))
80+ //
81+ // val serialized = serializer.serialize(metadata, String::class.java)
82+ //
83+ // // Verify deserialization - specifying type arguments explicitly
84+ // val deserialized = serializer.deserialize<String, MetaData>(serialized)
85+ //
86+ // assertEquals(metadata.size, deserialized.size)
87+ //
88+ // @Suppress("UNCHECKED_CAST")
89+ // val list = deserialized["listKey"] as List<String>
90+ // assertEquals(3, list.size)
91+ // assertEquals("item1", list[0])
92+ //
93+ // @Suppress("UNCHECKED_CAST")
94+ // val map = deserialized["mapKey"] as Map<String, String>
95+ // assertEquals(2, map.size)
96+ // assertEquals("value1", map["key1"])
97+ //
98+ // @Suppress("UNCHECKED_CAST")
99+ // val nestedList = deserialized["nestedListKey"] as List<List<Int>>
100+ // assertEquals(2, nestedList.size)
101+ // assertEquals(1, nestedList[0][0])
102+ // }
103+ //
104+ // @Test
105+ // fun `serialize metadata with custom object`() {
106+ // val customObject = CustomObject("test", 123)
107+ // val metadata = MetaData.with("customKey", customObject)
108+ //
109+ // val serialized = serializer.serialize(metadata, String::class.java)
110+ //
111+ // // Verify deserialization - specifying type arguments explicitly
112+ // val deserialized = serializer.deserialize<String, MetaData>(serialized)
113+ //
114+ // assertEquals(metadata.size, deserialized.size)
115+ //
116+ // // With proper polymorphic serialization, we should get back our CustomObject
117+ // val deserializedObject = deserialized["customKey"] as CustomObject
118+ // assertEquals("test", deserializedObject.name)
119+ // assertEquals(123, deserializedObject.value)
120+ // assertEquals(true, deserializedObject.active)
121+ // }
122+ //
123+ // @Test
124+ // fun `verify metadata works with different formats`() {
125+ // // Test with CBOR format
126+ // val cborSerializer = KotlinSerializer(
127+ // serialFormat = Cbor {
128+ // serializersModule = extendedModule
129+ // }
130+ // )
131+ //
132+ // val metadata = MetaData.with("key", "value")
133+ // .and("customKey", CustomObject("cbor-test", 456))
134+ //
135+ // val serialized = cborSerializer.serialize(metadata, ByteArray::class.java)
136+ // val deserialized = cborSerializer.deserialize<ByteArray, MetaData>(serialized)
137+ //
138+ // assertEquals("value", deserialized["key"])
139+ //
140+ // // With proper polymorphic serialization in CBOR format
141+ // val deserializedObject = deserialized["customKey"] as CustomObject
142+ // assertEquals("cbor-test", deserializedObject.name)
143+ // assertEquals(456, deserializedObject.value)
144+ // }
145+ //
146+ // @Test
147+ // fun `verify direct serialization and deserialization`() {
148+ // val metadata = MetaData.with("key", "direct-serialization")
149+ // .and("number", 789)
150+ //
151+ // // Direct serialization with the serializer module
152+ // val serializedString = json.encodeToString(MetaDataSerializer, metadata)
153+ //
154+ // // Direct deserialization
155+ // val deserialized = json.decodeFromString(MetaDataSerializer, serializedString)
156+ //
157+ // assertEquals(metadata, deserialized)
158+ // assertEquals("direct-serialization", deserialized["key"])
159+ // assertEquals(789, deserialized["number"])
160+ // }
161+ }
0 commit comments