@@ -2,15 +2,19 @@ package com.mparticle.kits
22
33import android.content.Context
44import android.graphics.Typeface
5+ import android.os.Looper
6+ import android.os.SystemClock
57import com.mparticle.BaseEvent
68import com.mparticle.MPEvent
79import com.mparticle.MParticle
810import com.mparticle.MParticleOptions
11+ import com.mparticle.MParticleTask
912import com.mparticle.commerce.CommerceEvent
1013import com.mparticle.commerce.Product
1114import com.mparticle.consent.ConsentState
1215import com.mparticle.consent.GDPRConsent
1316import com.mparticle.identity.IdentityApi
17+ import com.mparticle.identity.IdentityApiResult
1418import com.mparticle.identity.MParticleUser
1519import com.mparticle.internal.CoreCallbacks
1620import com.mparticle.internal.SideloadedKit
@@ -28,18 +32,31 @@ import org.json.JSONObject
2832import org.junit.Assert
2933import org.junit.Before
3034import org.junit.Test
35+ import org.junit.runner.RunWith
36+ import org.mockito.ArgumentMatchers.any
3137import org.mockito.Mockito
38+ import org.mockito.Mockito.mock
39+ import org.mockito.Mockito.verify
40+ import org.mockito.Mockito.`when`
41+ import org.powermock.api.mockito.PowerMockito
42+ import org.powermock.core.classloader.annotations.PrepareForTest
43+ import org.powermock.modules.junit4.PowerMockRunner
3244import java.lang.ref.WeakReference
45+ import java.lang.reflect.Method
3346import java.util.Arrays
3447import java.util.LinkedList
3548import java.util.concurrent.ConcurrentHashMap
3649
50+ @RunWith(PowerMockRunner ::class )
51+ @PrepareForTest(Looper ::class , SystemClock ::class )
3752class KitManagerImplTest {
3853 var mparticle: MParticle ? = null
3954 var mockIdentity: IdentityApi ? = null
4055
4156 @Before
4257 fun before () {
58+ PowerMockito .mockStatic(Looper ::class .java)
59+ PowerMockito .mockStatic(SystemClock ::class .java)
4360 mockIdentity = Mockito .mock(IdentityApi ::class .java)
4461 val instance = MockMParticle ()
4562 instance.setIdentityApi(mockIdentity)
@@ -1023,6 +1040,194 @@ class KitManagerImplTest {
10231040 Assert .assertEquals(" US" , attributes[" country" ])
10241041 }
10251042
1043+ @Test
1044+ fun testConfirmEmail_When_EmailSyncSuccess () {
1045+ var runnable: Runnable = Mockito .mock(Runnable ::class .java)
1046+ var user: MParticleUser = Mockito .mock(MParticleUser ::class .java)
1047+ val instance = MockMParticle ()
1048+ val sideloadedKit = Mockito .mock(MPSideloadedKit ::class .java)
1049+ val kitId = 6000000
1050+
1051+ val configJSONObj = JSONObject ().apply {
1052+ put(" id" , kitId)
1053+ }
1054+ val mockedKitConfig = KitConfiguration .createKitConfiguration(configJSONObj)
1055+ Mockito .`when `(sideloadedKit.configuration).thenReturn(mockedKitConfig)
1056+ val identityApi = mock(IdentityApi ::class .java)
1057+ val oldEmail = " old@example.com"
1058+ val mockTask = mock(MParticleTask ::class .java) as MParticleTask <IdentityApiResult >
1059+ `when `(identityApi.identify(any())).thenReturn(mockTask)
1060+ val identities: MutableMap <MParticle .IdentityType , String > = HashMap ()
1061+ identities.put(MParticle .IdentityType .Email , oldEmail)
1062+ `when `(user.userIdentities).thenReturn(identities)
1063+ instance.setIdentityApi(identityApi)
1064+ val settingsMap = hashMapOf(
1065+ " placementAttributesMapping" to """
1066+ [
1067+
1068+ ]
1069+ """ .trimIndent()
1070+ )
1071+ val field = KitConfiguration ::class .java.getDeclaredField(" settings" )
1072+ field.isAccessible = true
1073+ field.set(mockedKitConfig, settingsMap)
1074+
1075+ val options = MParticleOptions .builder(MockContext ())
1076+ .sideloadedKits(mutableListOf (sideloadedKit) as List <SideloadedKit >).build()
1077+ val manager: KitManagerImpl = MockKitManagerImpl (options)
1078+ val method: Method = KitManagerImpl ::class .java.getDeclaredMethod(
1079+ " confirmEmail" ,
1080+ String ::class .java,
1081+ MParticleUser ::class .java,
1082+ IdentityApi ::class .java,
1083+ Runnable ::class .java
1084+ )
1085+ method.isAccessible = true
1086+ val result = method.invoke(manager, " Test@gmail.com" , user, identityApi, runnable)
1087+ verify(mockTask).addSuccessListener(any())
1088+ }
1089+
1090+ @Test
1091+ fun testConfirmEmail_When_EmailAlreadySynced () {
1092+ var runnable: Runnable = Mockito .mock(Runnable ::class .java)
1093+ var user: MParticleUser = Mockito .mock(MParticleUser ::class .java)
1094+ val instance = MockMParticle ()
1095+ val sideloadedKit = Mockito .mock(MPSideloadedKit ::class .java)
1096+ val kitId = 6000000
1097+
1098+ val configJSONObj = JSONObject ().apply {
1099+ put(" id" , kitId)
1100+ }
1101+ val mockedKitConfig = KitConfiguration .createKitConfiguration(configJSONObj)
1102+ Mockito .`when `(sideloadedKit.configuration).thenReturn(mockedKitConfig)
1103+ val identityApi = mock(IdentityApi ::class .java)
1104+ val oldEmail = " Test@gmail.com"
1105+ val mockTask = mock(MParticleTask ::class .java) as MParticleTask <IdentityApiResult >
1106+ `when `(identityApi.identify(any())).thenReturn(mockTask)
1107+ val identities: MutableMap <MParticle .IdentityType , String > = HashMap ()
1108+ identities.put(MParticle .IdentityType .Email , oldEmail)
1109+ `when `(user.userIdentities).thenReturn(identities)
1110+ instance.setIdentityApi(identityApi)
1111+ val settingsMap = hashMapOf(
1112+ " placementAttributesMapping" to """
1113+ [
1114+
1115+ ]
1116+ """ .trimIndent()
1117+ )
1118+ val field = KitConfiguration ::class .java.getDeclaredField(" settings" )
1119+ field.isAccessible = true
1120+ field.set(mockedKitConfig, settingsMap)
1121+
1122+ val options = MParticleOptions .builder(MockContext ())
1123+ .sideloadedKits(mutableListOf (sideloadedKit) as List <SideloadedKit >).build()
1124+ val manager: KitManagerImpl = MockKitManagerImpl (options)
1125+ val method: Method = KitManagerImpl ::class .java.getDeclaredMethod(
1126+ " confirmEmail" ,
1127+ String ::class .java,
1128+ MParticleUser ::class .java,
1129+ IdentityApi ::class .java,
1130+ Runnable ::class .java
1131+ )
1132+ method.isAccessible = true
1133+ val result = method.invoke(manager, " Test@gmail.com" , user, identityApi, runnable)
1134+ Mockito .verify(runnable).run ()
1135+ }
1136+
1137+ @Test
1138+ fun testConfirmEmail_When_mailIsNull () {
1139+ var runnable: Runnable = Mockito .mock(Runnable ::class .java)
1140+ var user: MParticleUser = Mockito .mock(MParticleUser ::class .java)
1141+ val instance = MockMParticle ()
1142+ val sideloadedKit = Mockito .mock(MPSideloadedKit ::class .java)
1143+ val kitId = 6000000
1144+
1145+ val configJSONObj = JSONObject ().apply {
1146+ put(" id" , kitId)
1147+ }
1148+ val mockedKitConfig = KitConfiguration .createKitConfiguration(configJSONObj)
1149+ Mockito .`when `(sideloadedKit.configuration).thenReturn(mockedKitConfig)
1150+ val identityApi = mock(IdentityApi ::class .java)
1151+ val oldEmail = " Test@gmail.com"
1152+ val mockTask = mock(MParticleTask ::class .java) as MParticleTask <IdentityApiResult >
1153+ `when `(identityApi.identify(any())).thenReturn(mockTask)
1154+ val identities: MutableMap <MParticle .IdentityType , String > = HashMap ()
1155+ identities.put(MParticle .IdentityType .Email , oldEmail)
1156+ `when `(user.userIdentities).thenReturn(identities)
1157+ instance.setIdentityApi(identityApi)
1158+ val settingsMap = hashMapOf(
1159+ " placementAttributesMapping" to """
1160+ [
1161+
1162+ ]
1163+ """ .trimIndent()
1164+ )
1165+ val field = KitConfiguration ::class .java.getDeclaredField(" settings" )
1166+ field.isAccessible = true
1167+ field.set(mockedKitConfig, settingsMap)
1168+
1169+ val options = MParticleOptions .builder(MockContext ())
1170+ .sideloadedKits(mutableListOf (sideloadedKit) as List <SideloadedKit >).build()
1171+ val manager: KitManagerImpl = MockKitManagerImpl (options)
1172+ val method: Method = KitManagerImpl ::class .java.getDeclaredMethod(
1173+ " confirmEmail" ,
1174+ String ::class .java,
1175+ MParticleUser ::class .java,
1176+ IdentityApi ::class .java,
1177+ Runnable ::class .java
1178+ )
1179+ method.isAccessible = true
1180+ val result = method.invoke(manager, null , user, identityApi, runnable)
1181+ Mockito .verify(runnable).run ()
1182+ }
1183+
1184+ @Test
1185+ fun testConfirmEmail_When_User_IsNull () {
1186+ var runnable: Runnable = Mockito .mock(Runnable ::class .java)
1187+ var user: MParticleUser = Mockito .mock(MParticleUser ::class .java)
1188+ val instance = MockMParticle ()
1189+ val sideloadedKit = Mockito .mock(MPSideloadedKit ::class .java)
1190+ val kitId = 6000000
1191+
1192+ val configJSONObj = JSONObject ().apply {
1193+ put(" id" , kitId)
1194+ }
1195+ val mockedKitConfig = KitConfiguration .createKitConfiguration(configJSONObj)
1196+ Mockito .`when `(sideloadedKit.configuration).thenReturn(mockedKitConfig)
1197+ val identityApi = mock(IdentityApi ::class .java)
1198+ val oldEmail = " Test@gmail.com"
1199+ val mockTask = mock(MParticleTask ::class .java) as MParticleTask <IdentityApiResult >
1200+ `when `(identityApi.identify(any())).thenReturn(mockTask)
1201+ val identities: MutableMap <MParticle .IdentityType , String > = HashMap ()
1202+ identities.put(MParticle .IdentityType .Email , oldEmail)
1203+ `when `(user.userIdentities).thenReturn(identities)
1204+ instance.setIdentityApi(identityApi)
1205+ val settingsMap = hashMapOf(
1206+ " placementAttributesMapping" to """
1207+ [
1208+
1209+ ]
1210+ """ .trimIndent()
1211+ )
1212+ val field = KitConfiguration ::class .java.getDeclaredField(" settings" )
1213+ field.isAccessible = true
1214+ field.set(mockedKitConfig, settingsMap)
1215+
1216+ val options = MParticleOptions .builder(MockContext ())
1217+ .sideloadedKits(mutableListOf (sideloadedKit) as List <SideloadedKit >).build()
1218+ val manager: KitManagerImpl = MockKitManagerImpl (options)
1219+ val method: Method = KitManagerImpl ::class .java.getDeclaredMethod(
1220+ " confirmEmail" ,
1221+ String ::class .java,
1222+ MParticleUser ::class .java,
1223+ IdentityApi ::class .java,
1224+ Runnable ::class .java
1225+ )
1226+ method.isAccessible = true
1227+ val result = method.invoke(manager, null , user, identityApi, runnable)
1228+ Mockito .verify(runnable).run ()
1229+ }
1230+
10261231 internal inner class mockProvider (val config : KitConfiguration ) : KitIntegration(), KitIntegration.RoktListener {
10271232 override fun isDisabled (): Boolean = false
10281233 override fun getName (): String = " FakeProvider"
0 commit comments