Skip to content

Commit 2ee893b

Browse files
committed
add: unit tests for custom events
1 parent a7b4cb2 commit 2ee893b

3 files changed

Lines changed: 132 additions & 5 deletions

File tree

OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/UserManagerTests.kt

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.onesignal.user.internal
22

33
import com.onesignal.core.internal.language.ILanguageContext
4+
import com.onesignal.core.internal.preferences.IPreferencesService
45
import com.onesignal.mocks.MockHelper
6+
import com.onesignal.user.internal.customEvents.CustomEventModelStore
57
import com.onesignal.user.internal.subscriptions.ISubscriptionManager
68
import com.onesignal.user.internal.subscriptions.SubscriptionList
79
import io.kotest.core.spec.style.FunSpec
@@ -26,7 +28,7 @@ class UserManagerTests : FunSpec({
2628
every { languageContext.language = capture(languageSlot) } answers { }
2729

2830
val userManager =
29-
UserManager(mockSubscriptionManager, MockHelper.identityModelStore(), MockHelper.propertiesModelStore(), languageContext)
31+
UserManager(mockSubscriptionManager, MockHelper.identityModelStore(), MockHelper.propertiesModelStore(), MockHelper.customEventModelStore(), languageContext)
3032

3133
// When
3234
userManager.setLanguage("new-language")
@@ -44,7 +46,7 @@ class UserManagerTests : FunSpec({
4446
}
4547

4648
val userManager =
47-
UserManager(mockSubscriptionManager, identityModelStore, MockHelper.propertiesModelStore(), MockHelper.languageContext())
49+
UserManager(mockSubscriptionManager, identityModelStore, MockHelper.propertiesModelStore(), MockHelper.customEventModelStore(), MockHelper.languageContext())
4850

4951
// When
5052
val externalId = userManager.externalId
@@ -63,7 +65,7 @@ class UserManagerTests : FunSpec({
6365
}
6466

6567
val userManager =
66-
UserManager(mockSubscriptionManager, identityModelStore, MockHelper.propertiesModelStore(), MockHelper.languageContext())
68+
UserManager(mockSubscriptionManager, identityModelStore, MockHelper.propertiesModelStore(), MockHelper.customEventModelStore(), MockHelper.languageContext())
6769

6870
// When
6971
val alias1 = userManager.aliases["my-alias-key1"]
@@ -102,7 +104,7 @@ class UserManagerTests : FunSpec({
102104
}
103105

104106
val userManager =
105-
UserManager(mockSubscriptionManager, MockHelper.identityModelStore(), propertiesModelStore, MockHelper.languageContext())
107+
UserManager(mockSubscriptionManager, MockHelper.identityModelStore(), propertiesModelStore, MockHelper.customEventModelStore(), MockHelper.languageContext())
106108

107109
// When
108110
val tag1 = propertiesModelStore.model.tags["my-tag-key1"]
@@ -141,7 +143,7 @@ class UserManagerTests : FunSpec({
141143
it.tags["my-tag-key1"] = "my-tag-value1"
142144
}
143145

144-
val userManager = UserManager(mockSubscriptionManager, MockHelper.identityModelStore(), propertiesModelStore, MockHelper.languageContext())
146+
val userManager = UserManager(mockSubscriptionManager, MockHelper.identityModelStore(), propertiesModelStore, MockHelper.customEventModelStore(), MockHelper.languageContext())
145147

146148
// When
147149
val tagSnapshot1 = userManager.getTags()
@@ -173,6 +175,7 @@ class UserManagerTests : FunSpec({
173175
mockSubscriptionManager,
174176
MockHelper.identityModelStore(),
175177
MockHelper.propertiesModelStore(),
178+
MockHelper.customEventModelStore(),
176179
MockHelper.languageContext(),
177180
)
178181

@@ -191,4 +194,33 @@ class UserManagerTests : FunSpec({
191194
verify(exactly = 1) { mockSubscriptionManager.addSmsSubscription("+15558675309") }
192195
verify(exactly = 1) { mockSubscriptionManager.removeSmsSubscription("+15558675309") }
193196
}
197+
198+
test("custom events are backed by the custom event model store") {
199+
// Given
200+
val customEventModelStore = CustomEventModelStore(mockk<IPreferencesService>())
201+
202+
val userManager =
203+
UserManager(mockk<ISubscriptionManager>(), MockHelper.identityModelStore(), MockHelper.propertiesModelStore(), customEventModelStore, MockHelper.languageContext())
204+
205+
val eventName = "eventName"
206+
val properties = mapOf(
207+
"key1" to "value1",
208+
"key2" to 2,
209+
"key3" to mapOf("key3-1" to "value-3-1"),
210+
"key4" to 5.123,
211+
)
212+
213+
// When
214+
userManager.trackEvent(
215+
eventName,
216+
properties,
217+
)
218+
219+
// Then
220+
val customEventList = customEventModelStore.list()
221+
customEventList.size shouldBe 1
222+
val event = customEventList.first()
223+
event.name shouldBe eventName
224+
event.properties shouldBe properties
225+
}
194226
})
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.onesignal.user.internal.backend
2+
3+
import com.onesignal.core.internal.http.HttpResponse
4+
import com.onesignal.core.internal.http.IHttpClient
5+
import com.onesignal.core.internal.operations.ExecutionResult
6+
import com.onesignal.debug.LogLevel
7+
import com.onesignal.debug.internal.logging.Logging
8+
import com.onesignal.user.internal.customEvents.impl.CustomEventBackendService
9+
import com.onesignal.user.internal.customEvents.impl.CustomEventMetadata
10+
import com.onesignal.user.internal.operations.CustomEvent
11+
import io.kotest.core.spec.style.FunSpec
12+
import io.kotest.matchers.equals.shouldBeEqual
13+
import io.kotest.matchers.shouldBe
14+
import io.mockk.coEvery
15+
import io.mockk.coVerify
16+
import io.mockk.mockk
17+
import org.json.JSONObject
18+
19+
class CustomEventBackendServiceTests : FunSpec({
20+
beforeAny {
21+
Logging.logLevel = LogLevel.NONE
22+
}
23+
24+
val metadata = CustomEventMetadata(
25+
1,
26+
"sdk",
27+
"1.0",
28+
"type",
29+
"deviceModel",
30+
"deviceOS",
31+
)
32+
33+
test("track event") {
34+
// Given
35+
val spyHttpClient = mockk<IHttpClient>()
36+
coEvery { spyHttpClient.post(any(), any()) } returns HttpResponse(202, "")
37+
val customEventBackendService = CustomEventBackendService(spyHttpClient)
38+
39+
// When
40+
val properties = mapOf("proKey1" to "proVal1")
41+
val customEvent = CustomEvent(
42+
"event-name",
43+
properties
44+
)
45+
46+
val response = customEventBackendService.sendCustomEvent(
47+
appId = "appId",
48+
onesignalId = "onesignalId",
49+
externalId = null,
50+
timestamp = 1,
51+
customEvent = customEvent,
52+
customEventMetadata = metadata,
53+
)
54+
55+
// Then
56+
response.result shouldBe ExecutionResult.SUCCESS
57+
coVerify {
58+
spyHttpClient.post(
59+
"apps/appId/integrations/sdk/custom_events",
60+
withArg {
61+
val eventsObject = it.getJSONArray("events").getJSONObject(0)
62+
val eventMap = mutableMapOf<String, Any?>()
63+
for (key in eventsObject.keys()) {
64+
eventMap[key] = eventsObject.get(key)
65+
}
66+
67+
eventMap.get("name") shouldBe customEvent.name
68+
eventMap.get("app_id") shouldBe "appId"
69+
eventMap.get("onesignal_id") shouldBe "onesignalId"
70+
eventMap.get("external_id") shouldBe null
71+
eventMap.get("timestamp") shouldBe "1969-12-31T19:00:00.001Z"
72+
73+
val payload = eventMap.get("payload") as JSONObject
74+
payload.getJSONObject("os_sdk").toString() shouldBeEqual metadata.toJSONObject().toString()
75+
payload.getString("proKey1") shouldBeEqual "proVal1"
76+
},
77+
)
78+
}
79+
}
80+
81+
})

OneSignalSDK/onesignal/testhelpers/src/main/java/com/onesignal/mocks/MockHelper.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import com.onesignal.core.internal.language.ILanguageContext
88
import com.onesignal.core.internal.time.ITime
99
import com.onesignal.session.internal.session.SessionModel
1010
import com.onesignal.session.internal.session.SessionModelStore
11+
import com.onesignal.user.internal.customEvents.CustomEventModelStore
1112
import com.onesignal.user.internal.identity.IdentityModel
1213
import com.onesignal.user.internal.identity.IdentityModelStore
14+
import com.onesignal.user.internal.operations.CustomEvent
1315
import com.onesignal.user.internal.properties.PropertiesModel
1416
import com.onesignal.user.internal.properties.PropertiesModelStore
1517
import io.mockk.Runs
@@ -113,6 +115,18 @@ object MockHelper {
113115
return mockSessionStore
114116
}
115117

118+
fun customEventModelStore(action: ((CustomEvent) -> Unit)? = null): CustomEventModelStore {
119+
val customEvent = CustomEvent()
120+
121+
if (action != null) {
122+
action(customEvent)
123+
}
124+
125+
val mockCustomEventModelStore = mockk<CustomEventModelStore>()
126+
127+
return mockCustomEventModelStore
128+
}
129+
116130
fun languageContext(language: String = "en"): ILanguageContext {
117131
val mockLanguageContext = mockk<ILanguageContext>()
118132

0 commit comments

Comments
 (0)