From 8fbf56bf160bced820dc294944e8c96419a1afde Mon Sep 17 00:00:00 2001 From: Mansi Pandya Date: Tue, 19 Aug 2025 14:53:31 -0400 Subject: [PATCH 1/5] feat: Map selected identity to --- src/main/kotlin/com/mparticle/kits/RoktKit.kt | 53 +++++++++++-------- .../kotlin/com/mparticle/kits/RoktKitTests.kt | 43 +++++++++++++-- 2 files changed, 68 insertions(+), 28 deletions(-) diff --git a/src/main/kotlin/com/mparticle/kits/RoktKit.kt b/src/main/kotlin/com/mparticle/kits/RoktKit.kt index 5ce6f35..0897398 100644 --- a/src/main/kotlin/com/mparticle/kits/RoktKit.kt +++ b/src/main/kotlin/com/mparticle/kits/RoktKit.kt @@ -57,6 +57,7 @@ class RoktKit : Rokt.RoktCallback { private var applicationContext: Context? = null private var mpRoktEventCallback: MpRoktEventCallback? = null + private var hashedEmailUserIdentityType: String? = null override fun getName(): String = NAME override fun getInstance(): RoktKit = this @@ -70,6 +71,7 @@ class RoktKit : if (KitUtils.isEmpty(roktTagId)) { throwOnKitCreateError(NO_ROKT_ACCOUNT_ID) } + hashedEmailUserIdentityType = settings[HASHED_EMAIL_USER_IDENTITY_TYPE] applicationContext?.let { val manager = context.packageManager if (roktTagId != null) { @@ -343,7 +345,11 @@ class RoktKit : if (filterUser != null) { for ((identityNumberKey, identityValue) in filterUser.userIdentities) { val identityType = getStringForIdentity(identityNumberKey) - identityAttributes[identityType] = identityValue + if (identityType.equals(hashedEmailUserIdentityType)) { + identityAttributes["emailsha256"] = identityValue + } else { + identityAttributes[identityType] = identityValue + } } } if (attributes != null) { @@ -377,28 +383,28 @@ class RoktKit : } private fun getStringForIdentity(identityType: IdentityType): String = when (identityType) { - IdentityType.Other -> "emailsha256" - IdentityType.CustomerId -> "customerid" - IdentityType.Facebook -> "facebook" - IdentityType.Twitter -> "twitter" - IdentityType.Google -> "google" - IdentityType.Microsoft -> "microsoft" - IdentityType.Yahoo -> "yahoo" - IdentityType.Email -> "email" - IdentityType.Alias -> "alias" - IdentityType.FacebookCustomAudienceId -> "facebookcustomaudienceid" - IdentityType.Other2 -> "other2" - IdentityType.Other3 -> "other3" - IdentityType.Other4 -> "other4" - IdentityType.Other5 -> "other5" - IdentityType.Other6 -> "other6" - IdentityType.Other7 -> "other7" - IdentityType.Other8 -> "other8" - IdentityType.Other9 -> "other9" - IdentityType.Other10 -> "other10" - IdentityType.MobileNumber -> "mobilenumber" - IdentityType.PhoneNumber2 -> "phonenumber2" - IdentityType.PhoneNumber3 -> "phonenumber3" + IdentityType.Other -> "Other" + IdentityType.CustomerId -> "CustomerId" + IdentityType.Facebook -> "Facebook" + IdentityType.Twitter -> "Twitter" + IdentityType.Google -> "Google" + IdentityType.Microsoft -> "Microsoft" + IdentityType.Yahoo -> "Yahoo" + IdentityType.Email -> "Email" + IdentityType.Alias -> "Alias" + IdentityType.FacebookCustomAudienceId -> "FacebookCustomAudienceId" + IdentityType.Other2 -> "Other2" + IdentityType.Other3 -> "Other3" + IdentityType.Other4 -> "Other4" + IdentityType.Other5 -> "Other5" + IdentityType.Other6 -> "Other6" + IdentityType.Other7 -> "Other7" + IdentityType.Other8 -> "Other8" + IdentityType.Other9 -> "Other9" + IdentityType.Other10 -> "Other10" + IdentityType.MobileNumber -> "MobileNumber" + IdentityType.PhoneNumber2 -> "PhoneNumber2" + IdentityType.PhoneNumber3 -> "PhoneNumber3" else -> "" } @@ -413,6 +419,7 @@ class RoktKit : const val NAME = "Rokt" const val ROKT_ACCOUNT_ID = "accountId" + const val HASHED_EMAIL_USER_IDENTITY_TYPE = "hashedEmailUserIdentityType" const val MPID = "mpid" const val NO_ROKT_ACCOUNT_ID = "No Rokt account ID provided, can't initialize kit." const val NO_APP_VERSION_FOUND = "No App version found, can't initialize kit." diff --git a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt index 238b1aa..04841d7 100644 --- a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt +++ b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt @@ -153,6 +153,7 @@ class RoktKitTests { assertTrue(result.containsKey("key2")) assertTrue(result.containsKey("key3")) assertTrue(result.containsKey("email")) + assertTrue(result.containsKey("Email")) } @Test @@ -166,6 +167,7 @@ class RoktKitTests { "key2" to "value2", "key3" to "value3", "email" to "abc@gmail.com", + "Email" to "abc@gmail.com", ) val method: Method = RoktKit::class.java.getDeclaredMethod( "addIdentityAttributes", @@ -179,13 +181,13 @@ class RoktKitTests { assertTrue(result.containsKey("key1")) assertTrue(result.containsKey("key2")) assertTrue(result.containsKey("key3")) - assertTrue(result.containsKey("email")) + assertTrue(result.containsKey("Email")) assertEquals( mapOf( "key1" to "value1", "key2" to "value2", "key3" to "value3", - "email" to "TestEmail@gamil.com", + "Email" to "TestEmail@gamil.com", ), result, ) @@ -217,7 +219,7 @@ class RoktKitTests { method.isAccessible = true val result = method.invoke(roktKit, null, mockFilterUser) as Map assertEquals(1, result.size) - assertEquals(mapOf("email" to "TestEmail@gamil.com"), result) + assertEquals(mapOf("Email" to "TestEmail@gamil.com"), result) } @Test @@ -264,7 +266,38 @@ class RoktKitTests { assertTrue(result.containsKey("key1")) assertTrue(result.containsKey("key2")) assertTrue(result.containsKey("key3")) - assertTrue(result.containsKey("email")) + assertTrue(result.containsKey("Email")) + assertTrue(result.containsKey("Other")) + } + + @Test + fun test_addIdentityAttributes_When_userIdentities_Other_map_To_Identity() { + val mockFilterUser = mock(FilteredMParticleUser::class.java) + val userIdentities = HashMap() + userIdentities.put(IdentityType.Email, "TestEmail@gamil.com") + userIdentities.put(IdentityType.Other, "hashedEmail@123.com") + Mockito.`when`(mockFilterUser.userIdentities).thenReturn(userIdentities) + val attributes: Map = mapOf( + "key1" to "value1", + "key2" to "value2", + "key3" to "value3", + ) + val hashedField = RoktKit::class.java.getDeclaredField("hashedEmailUserIdentityType") + hashedField.isAccessible = true + hashedField.set(roktKit, "Other") + val method: Method = RoktKit::class.java.getDeclaredMethod( + "addIdentityAttributes", + Map::class.java, + FilteredMParticleUser::class.java, + ) + method.isAccessible = true + val result = method.invoke(roktKit, attributes, mockFilterUser) as Map + assertEquals(5, result.size) + + assertTrue(result.containsKey("key1")) + assertTrue(result.containsKey("key2")) + assertTrue(result.containsKey("key3")) + assertTrue(result.containsKey("Email")) assertTrue(result.containsKey("emailsha256")) } @@ -672,7 +705,7 @@ class RoktKitTests { override fun setIntegrationAttributes(kitId: Int, integrationAttributes: Map) {} - override fun getIntegrationAttributes(kitId: Int): Map? = null + override fun getIntegrationAttributes(i: Int): Map? = null override fun getCurrentActivity(): WeakReference = WeakReference(activity) From ffbd19f5d11baa690b181527c167f42a784fcd1a Mon Sep 17 00:00:00 2001 From: Mansi Pandya Date: Tue, 26 Aug 2025 11:08:24 -0400 Subject: [PATCH 2/5] fix the test cases --- src/test/kotlin/com/mparticle/kits/RoktKitTests.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt index 04841d7..9f9a03a 100644 --- a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt +++ b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt @@ -152,7 +152,6 @@ class RoktKitTests { assertTrue(result.containsKey("key1")) assertTrue(result.containsKey("key2")) assertTrue(result.containsKey("key3")) - assertTrue(result.containsKey("email")) assertTrue(result.containsKey("Email")) } @@ -166,7 +165,6 @@ class RoktKitTests { "key1" to "value1", "key2" to "value2", "key3" to "value3", - "email" to "abc@gmail.com", "Email" to "abc@gmail.com", ) val method: Method = RoktKit::class.java.getDeclaredMethod( From 0d137b19500b481b28b6463b366241fa46b2b3a1 Mon Sep 17 00:00:00 2001 From: Mansi Pandya Date: Tue, 26 Aug 2025 15:48:54 -0400 Subject: [PATCH 3/5] Added test case for UNASSIGNED default scenario --- .../kotlin/com/mparticle/kits/RoktKitTests.kt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt index 9f9a03a..1124cc9 100644 --- a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt +++ b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt @@ -299,6 +299,37 @@ class RoktKitTests { assertTrue(result.containsKey("emailsha256")) } + @Test + fun test_addIdentityAttributes_When_userIdentities_UNASSIGNED_map_To_Identity() { + val mockFilterUser = mock(FilteredMParticleUser::class.java) + val userIdentities = HashMap() + userIdentities.put(IdentityType.Email, "TestEmail@gamil.com") + userIdentities.put(IdentityType.Other, "hashedEmail@123.com") + Mockito.`when`(mockFilterUser.userIdentities).thenReturn(userIdentities) + val attributes: Map = mapOf( + "key1" to "value1", + "key2" to "value2", + "key3" to "value3", + ) + val hashedField = RoktKit::class.java.getDeclaredField("hashedEmailUserIdentityType") + hashedField.isAccessible = true + hashedField.set(roktKit, "UNASSIGNED") + val method: Method = RoktKit::class.java.getDeclaredMethod( + "addIdentityAttributes", + Map::class.java, + FilteredMParticleUser::class.java, + ) + method.isAccessible = true + val result = method.invoke(roktKit, attributes, mockFilterUser) as Map + assertEquals(5, result.size) + + assertTrue(result.containsKey("key1")) + assertTrue(result.containsKey("key2")) + assertTrue(result.containsKey("key3")) + assertTrue(result.containsKey("Email")) + assertTrue(result.containsKey("Other")) + } + @Test fun testSetSdkWrapper_correctlySetsRoktFramework() { mockkObject(Rokt) From 54e9074fb2ec2d87ad1af80a43a242cd9ca0914f Mon Sep 17 00:00:00 2001 From: Mansi Pandya Date: Mon, 22 Sep 2025 16:25:04 -0400 Subject: [PATCH 4/5] Address review comments and updated test cases --- src/main/kotlin/com/mparticle/kits/RoktKit.kt | 44 +++++++++---------- .../kotlin/com/mparticle/kits/RoktKitTests.kt | 8 ++-- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/kotlin/com/mparticle/kits/RoktKit.kt b/src/main/kotlin/com/mparticle/kits/RoktKit.kt index 0897398..7c3752a 100644 --- a/src/main/kotlin/com/mparticle/kits/RoktKit.kt +++ b/src/main/kotlin/com/mparticle/kits/RoktKit.kt @@ -383,28 +383,28 @@ class RoktKit : } private fun getStringForIdentity(identityType: IdentityType): String = when (identityType) { - IdentityType.Other -> "Other" - IdentityType.CustomerId -> "CustomerId" - IdentityType.Facebook -> "Facebook" - IdentityType.Twitter -> "Twitter" - IdentityType.Google -> "Google" - IdentityType.Microsoft -> "Microsoft" - IdentityType.Yahoo -> "Yahoo" - IdentityType.Email -> "Email" - IdentityType.Alias -> "Alias" - IdentityType.FacebookCustomAudienceId -> "FacebookCustomAudienceId" - IdentityType.Other2 -> "Other2" - IdentityType.Other3 -> "Other3" - IdentityType.Other4 -> "Other4" - IdentityType.Other5 -> "Other5" - IdentityType.Other6 -> "Other6" - IdentityType.Other7 -> "Other7" - IdentityType.Other8 -> "Other8" - IdentityType.Other9 -> "Other9" - IdentityType.Other10 -> "Other10" - IdentityType.MobileNumber -> "MobileNumber" - IdentityType.PhoneNumber2 -> "PhoneNumber2" - IdentityType.PhoneNumber3 -> "PhoneNumber3" + IdentityType.Other -> "other" + IdentityType.CustomerId -> "customerid" + IdentityType.Facebook -> "facebook" + IdentityType.Twitter -> "twitter" + IdentityType.Google -> "google" + IdentityType.Microsoft -> "microsoft" + IdentityType.Yahoo -> "yahoo" + IdentityType.Email -> "email" + IdentityType.Alias -> "alias" + IdentityType.FacebookCustomAudienceId -> "facebookcustomaudienceid" + IdentityType.Other2 -> "other2" + IdentityType.Other3 -> "other3" + IdentityType.Other4 -> "other4" + IdentityType.Other5 -> "other5" + IdentityType.Other6 -> "other6" + IdentityType.Other7 -> "other7" + IdentityType.Other8 -> "other8" + IdentityType.Other9 -> "other9" + IdentityType.Other10 -> "other10" + IdentityType.MobileNumber -> "mobilenumber" + IdentityType.PhoneNumber2 -> "phonenumber2" + IdentityType.PhoneNumber3 -> "phonenumber3" else -> "" } diff --git a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt index 1124cc9..2294a55 100644 --- a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt +++ b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt @@ -300,7 +300,7 @@ class RoktKitTests { } @Test - fun test_addIdentityAttributes_When_userIdentities_UNASSIGNED_map_To_Identity() { + fun test_addIdentityAttributes_When_userIdentities_Unknown_map_To_Identity() { val mockFilterUser = mock(FilteredMParticleUser::class.java) val userIdentities = HashMap() userIdentities.put(IdentityType.Email, "TestEmail@gamil.com") @@ -313,7 +313,7 @@ class RoktKitTests { ) val hashedField = RoktKit::class.java.getDeclaredField("hashedEmailUserIdentityType") hashedField.isAccessible = true - hashedField.set(roktKit, "UNASSIGNED") + hashedField.set(roktKit, "Unknown") val method: Method = RoktKit::class.java.getDeclaredMethod( "addIdentityAttributes", Map::class.java, @@ -326,8 +326,8 @@ class RoktKitTests { assertTrue(result.containsKey("key1")) assertTrue(result.containsKey("key2")) assertTrue(result.containsKey("key3")) - assertTrue(result.containsKey("Email")) - assertTrue(result.containsKey("Other")) + assertTrue(result.containsKey("email")) + assertTrue(result.containsKey("other")) } @Test From b818d7f954ac97d03513d4ed0f7c6a57f3515907 Mon Sep 17 00:00:00 2001 From: Mansi Pandya Date: Mon, 22 Sep 2025 16:50:10 -0400 Subject: [PATCH 5/5] fix the test cases --- .../kotlin/com/mparticle/kits/RoktKitTests.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt index 2294a55..3783d70 100644 --- a/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt +++ b/src/test/kotlin/com/mparticle/kits/RoktKitTests.kt @@ -152,7 +152,7 @@ class RoktKitTests { assertTrue(result.containsKey("key1")) assertTrue(result.containsKey("key2")) assertTrue(result.containsKey("key3")) - assertTrue(result.containsKey("Email")) + assertTrue(result.containsKey("email")) } @Test @@ -165,7 +165,7 @@ class RoktKitTests { "key1" to "value1", "key2" to "value2", "key3" to "value3", - "Email" to "abc@gmail.com", + "email" to "abc@gmail.com", ) val method: Method = RoktKit::class.java.getDeclaredMethod( "addIdentityAttributes", @@ -179,13 +179,13 @@ class RoktKitTests { assertTrue(result.containsKey("key1")) assertTrue(result.containsKey("key2")) assertTrue(result.containsKey("key3")) - assertTrue(result.containsKey("Email")) + assertTrue(result.containsKey("email")) assertEquals( mapOf( "key1" to "value1", "key2" to "value2", "key3" to "value3", - "Email" to "TestEmail@gamil.com", + "email" to "TestEmail@gamil.com", ), result, ) @@ -217,7 +217,7 @@ class RoktKitTests { method.isAccessible = true val result = method.invoke(roktKit, null, mockFilterUser) as Map assertEquals(1, result.size) - assertEquals(mapOf("Email" to "TestEmail@gamil.com"), result) + assertEquals(mapOf("email" to "TestEmail@gamil.com"), result) } @Test @@ -264,8 +264,8 @@ class RoktKitTests { assertTrue(result.containsKey("key1")) assertTrue(result.containsKey("key2")) assertTrue(result.containsKey("key3")) - assertTrue(result.containsKey("Email")) - assertTrue(result.containsKey("Other")) + assertTrue(result.containsKey("email")) + assertTrue(result.containsKey("other")) } @Test @@ -295,8 +295,8 @@ class RoktKitTests { assertTrue(result.containsKey("key1")) assertTrue(result.containsKey("key2")) assertTrue(result.containsKey("key3")) - assertTrue(result.containsKey("Email")) - assertTrue(result.containsKey("emailsha256")) + assertTrue(result.containsKey("email")) + assertTrue(result.containsKey("other")) } @Test