diff --git a/src/main/kotlin/com/mparticle/kits/RoktKit.kt b/src/main/kotlin/com/mparticle/kits/RoktKit.kt index 7c3752a..c2ebacf 100644 --- a/src/main/kotlin/com/mparticle/kits/RoktKit.kt +++ b/src/main/kotlin/com/mparticle/kits/RoktKit.kt @@ -216,7 +216,9 @@ class RoktKit : val finalAttributes = mutableMapOf() filterUser?.userAttributes?.let { userAttrs -> for ((key, value) in userAttrs) { - finalAttributes[key] = value.toString() + if (value != null) { + finalAttributes[key] = value.toString() + } } } diff --git a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt index 3783d70..19cf344 100644 --- a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt +++ b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt @@ -74,6 +74,38 @@ class RoktKitTests { // roktKit.configuration = KitConfiguration.createKitConfiguration(JSONObject().put("id", "-1")) } + @Test + fun test_prepareFinalAttributes_filters_out_null_user_attributes() { + val mockFilterUser = mock(FilteredMParticleUser::class.java) + Mockito.`when`(mockFilterUser.userIdentities).thenReturn(HashMap()) + + // Include a null value and a non-null non-string value to verify toString() behavior + val userAttributes = HashMap() + userAttributes["attr_non_null_string"] = "value" + userAttributes["attr_null"] = null + userAttributes["attr_non_string"] = 123 + Mockito.`when`(mockFilterUser.userAttributes).thenReturn(userAttributes) + + val method: Method = RoktKit::class.java.getDeclaredMethod( + "prepareFinalAttributes", + FilteredMParticleUser::class.java, + Map::class.java, + ) + method.isAccessible = true + + val inputAttributes: Map = emptyMap() + val result = method.invoke(roktKit, mockFilterUser, inputAttributes) as Map<*, *> + + // Should include only non-null user attributes, and convert non-string values via toString() + assertTrue(result.containsKey("attr_non_null_string")) + assertEquals("value", result["attr_non_null_string"]) + + assertFalse(result.containsKey("attr_null")) + + assertTrue(result.containsKey("attr_non_string")) + assertEquals("123", result["attr_non_string"]) + } + private inner class TestKitManager : KitManagerImpl(context, null, TestCoreCallbacks(), mock(MParticleOptions::class.java)) { var attributes = HashMap()