@@ -74,6 +74,38 @@ class RoktKitTests {
7474 // roktKit.configuration = KitConfiguration.createKitConfiguration(JSONObject().put("id", "-1"))
7575 }
7676
77+ @Test
78+ fun test_prepareFinalAttributes_filters_out_null_user_attributes () {
79+ val mockFilterUser = mock(FilteredMParticleUser ::class .java)
80+ Mockito .`when `(mockFilterUser.userIdentities).thenReturn(HashMap ())
81+
82+ // Include a null value and a non-null non-string value to verify toString() behavior
83+ val userAttributes = HashMap <String , Any ?>()
84+ userAttributes[" attr_non_null_string" ] = " value"
85+ userAttributes[" attr_null" ] = null
86+ userAttributes[" attr_non_string" ] = 123
87+ Mockito .`when `(mockFilterUser.userAttributes).thenReturn(userAttributes)
88+
89+ val method: Method = RoktKit ::class .java.getDeclaredMethod(
90+ " prepareFinalAttributes" ,
91+ FilteredMParticleUser ::class .java,
92+ Map ::class .java,
93+ )
94+ method.isAccessible = true
95+
96+ val inputAttributes: Map <String , String > = emptyMap()
97+ val result = method.invoke(roktKit, mockFilterUser, inputAttributes) as Map <* , * >
98+
99+ // Should include only non-null user attributes, and convert non-string values via toString()
100+ assertTrue(result.containsKey(" attr_non_null_string" ))
101+ assertEquals(" value" , result[" attr_non_null_string" ])
102+
103+ assertFalse(result.containsKey(" attr_null" ))
104+
105+ assertTrue(result.containsKey(" attr_non_string" ))
106+ assertEquals(" 123" , result[" attr_non_string" ])
107+ }
108+
77109 private inner class TestKitManager :
78110 KitManagerImpl (context, null , TestCoreCallbacks (), mock(MParticleOptions ::class .java)) {
79111 var attributes = HashMap <String , String >()
0 commit comments