diff --git a/common/src/main/kotlin/de/sipgate/federmappe/common/decoder/SharedEnumDecoder.kt b/common/src/main/kotlin/de/sipgate/federmappe/common/decoder/SharedEnumDecoder.kt index f68ad70..3e01bba 100644 --- a/common/src/main/kotlin/de/sipgate/federmappe/common/decoder/SharedEnumDecoder.kt +++ b/common/src/main/kotlin/de/sipgate/federmappe/common/decoder/SharedEnumDecoder.kt @@ -19,5 +19,5 @@ fun decodeEnum( } } - throw SerializationException("Couldn't find matching value for enum $enumNamespace") + throw SerializationException("Couldn't find matching $enumNamespace enum for value $decodedValue") } diff --git a/common/src/test/kotlin/de/sipgate/federmappe/common/decoder/ComplexEnumTests.kt b/common/src/test/kotlin/de/sipgate/federmappe/common/decoder/ComplexEnumTests.kt new file mode 100644 index 0000000..6865ae9 --- /dev/null +++ b/common/src/test/kotlin/de/sipgate/federmappe/common/decoder/ComplexEnumTests.kt @@ -0,0 +1,78 @@ +package de.sipgate.federmappe.common.decoder + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.SerializationException +import kotlinx.serialization.serializer +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFails +import kotlin.test.assertIs + +/* + * This `@Serializable` annotation needs to be present for the `@SerialName` annotation to be + * processed and attached to the generated SerialDescriptor. This seems to be a side-effect of + * Kotlin JS deserialization. See https://github.com/Kotlin/kotlinx.serialization/issues/31#issuecomment-1446310243 + * for details + */ +@Serializable +enum class CustomTestEnum { + @SerialName("avalue") A, +} + +private val expectedError = "Couldn't find matching de.sipgate.federmappe.common.decoder.CustomTestEnum enum for value A" + +@OptIn(ExperimentalSerializationApi::class) +class ComplexEnumTests { + @Test + fun deserializeDataClassWithEnum() { + // Arrange + @Serializable + data class TestClassA(val a: CustomTestEnum) + + val serializer = serializer() + val data = mapOf("a" to CustomTestEnum.A) + + // Act + val result = assertFails { serializer.deserialize(StringMapToObjectDecoder(data)) } + + // Assert + assertIs(result) + assertEquals(expectedError, result.message) + } + + @Test + fun deserializeDataClassWithEnumValue() { + // Arrange + @Serializable + data class TestClassA(val a: CustomTestEnum) + + val serializer = serializer() + val data = mapOf("a" to "A") + + // Act + val result = assertFails { serializer.deserialize(StringMapToObjectDecoder(data)) } + + // Assert + assertIs(result) + assertEquals(expectedError, result.message) + } + + @Test + fun deserializeEnumWithCustomSerialName() { + // Arrange + @Serializable + data class TestClassA(val a: CustomTestEnum) + + val serializer = serializer() + val data = mapOf("a" to "avalue") + + // Act + val result = serializer.deserialize(StringMapToObjectDecoder(data)) + + // Assert + assertIs(result) + assertEquals(CustomTestEnum.A, result.a) + } +} diff --git a/common/src/test/kotlin/de/sipgate/federmappe/common/decoder/EnumTests.kt b/common/src/test/kotlin/de/sipgate/federmappe/common/decoder/EnumTests.kt index 8e8d523..a1a2acb 100644 --- a/common/src/test/kotlin/de/sipgate/federmappe/common/decoder/EnumTests.kt +++ b/common/src/test/kotlin/de/sipgate/federmappe/common/decoder/EnumTests.kt @@ -103,4 +103,21 @@ class EnumTests { assertIs(result) assertEquals(TestEnum.A, result.a.values.first()) } + + @Test + fun deserializeDataClassWithDefaultEnumValue() { + // Arrange + @Serializable + data class TestClass(val a: TestEnum = TestEnum.B) + + val serializer = serializer() + val data = emptyMap() + + // Act + val result = serializer.deserialize(StringMapToObjectDecoder(data)) + + // Assert + assertIs(result) + assertEquals(TestEnum.B, result.a) + } }