From 95fe0328dfe0dc9d29e602d43636883f7a0c9980 Mon Sep 17 00:00:00 2001 From: Mansi Pandya Date: Thu, 18 Dec 2025 16:45:13 -0500 Subject: [PATCH 1/3] fix: user attribute filtering logic in KitConfiguration --- src/main/kotlin/com/mparticle/kits/RoktKit.kt | 2 +- src/test/kotlin/com/mparticle/kits/RoktKitTests.kt | 4 ++-- .../kotlin/com/mparticle/kits/mocks/MockKitConfiguration.kt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/com/mparticle/kits/RoktKit.kt b/src/main/kotlin/com/mparticle/kits/RoktKit.kt index 26c78a2..6b4b20f 100644 --- a/src/main/kotlin/com/mparticle/kits/RoktKit.kt +++ b/src/main/kotlin/com/mparticle/kits/RoktKit.kt @@ -248,7 +248,7 @@ class RoktKit : val userAttributes = mutableMapOf() for ((key, value) in attributes) { val hashKey = KitUtils.hashForFiltering(key) - if (!kitConfiguration.mUserAttributeFilters.get(hashKey)) { + if (kitConfiguration.mUserAttributeFilters.get(hashKey,true)) { userAttributes[key] = value } } diff --git a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt index 5dd583e..b0230c7 100644 --- a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt +++ b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt @@ -359,7 +359,7 @@ class RoktKitTests { val filteredKey: String = KitUtils.hashForFiltering("ShouldFilter").toString() val filteredKey2: String = KitUtils.hashForFiltering("ShouldFilter_key_2").toString() jsonObject.put(filteredKey, 0) - jsonObject.put(filteredKey2, 1) + jsonObject.put(filteredKey2, 0) } catch (e: Exception) { println("Exception occurred: ${e.message}") } @@ -1012,7 +1012,7 @@ class RoktKitTests { val filteredKey: String = KitUtils.hashForFiltering("ShouldFilter").toString() val filteredKey2: String = KitUtils.hashForFiltering("ShouldFilter_key_2").toString() jsonObject.put(filteredKey, 0) - jsonObject.put(filteredKey2, 1) + jsonObject.put(filteredKey2, 0) } catch (e: Exception) { println("Exception occurred: ${e.message}") } diff --git a/src/test/kotlin/com/mparticle/kits/mocks/MockKitConfiguration.kt b/src/test/kotlin/com/mparticle/kits/mocks/MockKitConfiguration.kt index 5d18c20..56558c0 100644 --- a/src/test/kotlin/com/mparticle/kits/mocks/MockKitConfiguration.kt +++ b/src/test/kotlin/com/mparticle/kits/mocks/MockKitConfiguration.kt @@ -41,7 +41,7 @@ open class MockKitConfiguration : KitConfiguration() { override fun get(key: Int, valueIfKeyNotFound: Boolean): Boolean { print("SparseArray getting: $key") return if (map.containsKey(key)) { - true + map[key] ?: valueIfKeyNotFound } else { valueIfKeyNotFound } From 674a3e045809c2738b09b56c5bbcd6f9ad750e2e Mon Sep 17 00:00:00 2001 From: Mansi Pandya Date: Fri, 19 Dec 2025 12:10:27 -0500 Subject: [PATCH 2/3] Fix formatting issues --- src/main/kotlin/com/mparticle/kits/RoktKit.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/com/mparticle/kits/RoktKit.kt b/src/main/kotlin/com/mparticle/kits/RoktKit.kt index 6b4b20f..ea45d33 100644 --- a/src/main/kotlin/com/mparticle/kits/RoktKit.kt +++ b/src/main/kotlin/com/mparticle/kits/RoktKit.kt @@ -248,7 +248,7 @@ class RoktKit : val userAttributes = mutableMapOf() for ((key, value) in attributes) { val hashKey = KitUtils.hashForFiltering(key) - if (kitConfiguration.mUserAttributeFilters.get(hashKey,true)) { + if (kitConfiguration.mUserAttributeFilters.get(hashKey, true)) { userAttributes[key] = value } } From 47becd8d00d20ead219946b3755e1910beeca9d3 Mon Sep 17 00:00:00 2001 From: Mansi Pandya Date: Fri, 19 Dec 2025 14:17:32 -0500 Subject: [PATCH 3/3] Added test case --- .../kotlin/com/mparticle/kits/RoktKitTests.kt | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt index b0230c7..b5c7c07 100644 --- a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt +++ b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt @@ -402,6 +402,81 @@ class RoktKitTests { unmockkObject(Rokt) } + @Test + fun test_prepareFinalAttributes_includesAttributeWhenFilterValueIsTrue() { + // Arrange + mockkObject(Rokt) + val capturedAttributesSlot = slot>() + every { + Rokt.execute( + any(), + capture(capturedAttributesSlot), + any(), + null, + null, + null, + ) + } just runs + + val mockFilterUser = mock(FilteredMParticleUser::class.java) + Mockito.`when`(mockFilterUser.userIdentities).thenReturn(HashMap()) + Mockito.`when`(mockFilterUser.id).thenReturn(12345L) + + val userAttributes = HashMap() + userAttributes["attr_non_null_string"] = "value" + userAttributes["attr_null"] = null + userAttributes["attr_non_string"] = 123 + userAttributes["user_key"] = "1231545" + Mockito.`when`(mockFilterUser.userAttributes).thenReturn(userAttributes) + // Set up the configuration with our test filters + val jsonObject = JSONObject() + try { + val filteredKey: String = KitUtils.hashForFiltering("ShouldFilter").toString() + val filteredKey2: String = KitUtils.hashForFiltering("ShouldFilter_key_2").toString() + jsonObject.put(filteredKey, 1) + jsonObject.put(filteredKey2, 0) + } catch (e: Exception) { + println("Exception occurred: ${e.message}") + } + val json = JSONObject() + json.put("ua", jsonObject) + roktKit.configuration = MockKitConfiguration.createKitConfiguration(JSONObject().put("hs", json)) + val inputAttributes: Map = mapOf( + "key1" to "value1", + "key2" to "value2", + "key3" to "value3", + "user_key" to "2223333", + "ShouldFilter" to "testData" + ) + // Act + roktKit.execute( + viewName = "test", + attributes = inputAttributes, + mpRoktEventCallback = null, + placeHolders = null, + fontTypefaces = null, + filterUser = mockFilterUser, + mpRoktConfig = null, + ) + + // Assert + val capturedAttributes = capturedAttributesSlot.captured + + + assertEquals(8, capturedAttributes.size) + assertEquals("value", capturedAttributes["attr_non_null_string"]) + assertEquals("123", capturedAttributes["attr_non_string"]) + assertEquals("2223333", capturedAttributes["user_key"]) + assertEquals("value1", capturedAttributes["key1"]) + assertEquals("value2", capturedAttributes["key2"]) + assertEquals("value3", capturedAttributes["key3"]) + assertEquals("12345", capturedAttributes["mpid"]) + + assertTrue(capturedAttributes.containsKey("ShouldFilter")) + assertFalse(capturedAttributes.containsKey("ShouldFilter_key_2")) + unmockkObject(Rokt) + } + private inner class TestKitManager : KitManagerImpl(context, null, TestCoreCallbacks(), mock(MParticleOptions::class.java)) { var attributes = HashMap()