Skip to content

Commit 195cab2

Browse files
authored
fix: Attribute null object reference (#82)
* fix: Attribute null object reference * Add test for null value
1 parent 89b61f3 commit 195cab2

2 files changed

Lines changed: 35 additions & 1 deletion

File tree

src/main/kotlin/com/mparticle/kits/RoktKit.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@ class RoktKit :
215215
val finalAttributes = mutableMapOf<String, String>()
216216
filterUser?.userAttributes?.let { userAttrs ->
217217
for ((key, value) in userAttrs) {
218-
finalAttributes[key] = value.toString()
218+
if (value != null) {
219+
finalAttributes[key] = value.toString()
220+
}
219221
}
220222
}
221223

src/test/kotlin/com/mparticle/kits/RoktKitTests.kt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)