Skip to content

Commit c54d6bf

Browse files
committed
added more tests
1 parent 7b4ecc7 commit c54d6bf

File tree

5 files changed

+106
-20
lines changed

5 files changed

+106
-20
lines changed

messagingpush/api/messagingpush.api

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,6 @@ public final class io/customer/messagingpush/ModuleMessagingPushFCM : io/custome
5454
public final class io/customer/messagingpush/ModuleMessagingPushFCM$Companion {
5555
}
5656

57-
public abstract interface class io/customer/messagingpush/PushDeliveryTracker {
58-
public abstract fun trackMetric (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
59-
}
60-
61-
public final class io/customer/messagingpush/PushDeliveryTracker$DefaultImpls {
62-
public static synthetic fun trackMetric$default (Lio/customer/messagingpush/PushDeliveryTracker;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
63-
}
64-
65-
public final class io/customer/messagingpush/PushDeliveryTrackerImpl : io/customer/messagingpush/PushDeliveryTracker {
66-
public fun <init> ()V
67-
public fun trackMetric (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
68-
}
69-
7057
public final class io/customer/messagingpush/activity/NotificationClickReceiverActivity : android/app/Activity, io/customer/sdk/tracking/TrackableScreen {
7158
public static final field Companion Lio/customer/messagingpush/activity/NotificationClickReceiverActivity$Companion;
7259
public static final field NOTIFICATION_PAYLOAD_EXTRA Ljava/lang/String;

messagingpush/src/main/java/io/customer/messagingpush/PushDeliveryTracker.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package io.customer.messagingpush
22

3-
import HttpClient
4-
import HttpRequestParams
53
import io.customer.messagingpush.di.httpClient
4+
import io.customer.messagingpush.network.HttpClient
5+
import io.customer.messagingpush.network.HttpRequestParams
66
import io.customer.sdk.core.di.SDKComponent
77
import io.customer.sdk.util.EventNames
88
import org.json.JSONObject
99

10-
interface PushDeliveryTracker {
10+
internal interface PushDeliveryTracker {
1111
fun trackMetric(token: String, event: String, deliveryId: String, onComplete: ((Result<Unit>) -> Unit?)? = null)
1212
}
1313

14-
class PushDeliveryTrackerImpl : PushDeliveryTracker {
14+
internal class PushDeliveryTrackerImpl : PushDeliveryTracker {
1515

1616
private val httpClient: HttpClient
1717
get() = SDKComponent.httpClient

messagingpush/src/main/java/io/customer/messagingpush/di/DiGraphMessagingPush.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
package io.customer.messagingpush.di
44

5-
import HttpClient
6-
import HttpClientImpl
75
import io.customer.base.internal.InternalCustomerIOApi
86
import io.customer.messagingpush.MessagingPushModuleConfig
97
import io.customer.messagingpush.ModuleMessagingPushFCM
108
import io.customer.messagingpush.PushDeliveryTracker
119
import io.customer.messagingpush.PushDeliveryTrackerImpl
10+
import io.customer.messagingpush.network.HttpClient
11+
import io.customer.messagingpush.network.HttpClientImpl
1212
import io.customer.messagingpush.processor.PushMessageProcessor
1313
import io.customer.messagingpush.processor.PushMessageProcessorImpl
1414
import io.customer.messagingpush.provider.DeviceTokenProvider
@@ -19,7 +19,6 @@ import io.customer.messagingpush.util.PushTrackingUtil
1919
import io.customer.messagingpush.util.PushTrackingUtilImpl
2020
import io.customer.sdk.core.di.AndroidSDKComponent
2121
import io.customer.sdk.core.di.SDKComponent
22-
import io.customer.sdk.core.di.SDKComponent.singleton
2322

2423
/*
2524
This file contains a series of extensions to the common module's Dependency injection (DI) graph. All extensions in this file simply add internal classes for this module into the DI graph.

messagingpush/src/main/java/io/customer/messagingpush/network/HTTPClient.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package io.customer.messagingpush.network
2+
13
import android.util.Base64
24
import io.customer.sdk.core.di.SDKComponent
35
import io.customer.sdk.core.util.DispatchersProvider
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package io.customer.messagingpush
2+
3+
import io.customer.commontest.config.TestConfig
4+
import io.customer.commontest.config.testConfigurationDefault
5+
import io.customer.messagingpush.network.HttpClient
6+
import io.customer.messagingpush.network.HttpRequestParams
7+
import io.customer.messagingpush.testutils.core.IntegrationTest
8+
import io.mockk.every
9+
import io.mockk.mockk
10+
import io.mockk.slot
11+
import io.mockk.verify
12+
import org.amshove.kluent.shouldBeEqualTo
13+
import org.amshove.kluent.shouldContain
14+
import org.amshove.kluent.shouldNotBe
15+
import org.junit.Test
16+
import org.junit.runner.RunWith
17+
import org.robolectric.RobolectricTestRunner
18+
19+
@RunWith(RobolectricTestRunner::class)
20+
class PushDeliveryTrackingTest : IntegrationTest() {
21+
22+
private val httpClient: HttpClient = mockk(relaxed = true)
23+
private val pushDeliveryTracker = PushDeliveryTrackerImpl()
24+
25+
override fun setup(testConfig: TestConfig) {
26+
super.setup(
27+
testConfigurationDefault {
28+
diGraph {
29+
sdk {
30+
// Override the httpClient in your DI so the SUT uses this mock.
31+
overrideDependency<HttpClient>(httpClient)
32+
}
33+
}
34+
}
35+
)
36+
}
37+
38+
@Test
39+
fun trackMetric_givenValidInputs_expectCorrectPathAndSuccessCallback() {
40+
val token = "token123"
41+
val event = "OPENED"
42+
val deliveryId = "delivery_abc"
43+
44+
val capturedParams = slot<HttpRequestParams>()
45+
46+
every {
47+
httpClient.request(capture(capturedParams), any())
48+
} answers {
49+
// Invoke the second arg (the callback) with success.
50+
secondArg<(Result<String>) -> Unit>().invoke(Result.success("Success"))
51+
}
52+
53+
var callbackResult: Result<Unit>? = null
54+
55+
pushDeliveryTracker.trackMetric(token, event, deliveryId) { result ->
56+
callbackResult = result
57+
// Return Unit to match the function signature
58+
Unit
59+
}
60+
61+
// Assert #1: Confirm the correct path.
62+
capturedParams.captured.path shouldBeEqualTo "/track"
63+
64+
// Assert #2: The body should not be null.
65+
val requestBody = capturedParams.captured.body
66+
requestBody shouldNotBe null
67+
68+
// Optional substring checks to verify key fields exist (avoid org.json parsing):
69+
requestBody!! shouldContain token
70+
requestBody shouldContain event.lowercase()
71+
requestBody shouldContain deliveryId
72+
73+
// Assert #3: The callback result is success.
74+
callbackResult!!.isSuccess.shouldBeEqualTo(true)
75+
76+
// Ensure we only called once
77+
verify(exactly = 1) { httpClient.request(any(), any()) }
78+
}
79+
80+
@Test
81+
fun trackMetric_givenHttpClientFails_expectCallbackFailure() {
82+
every {
83+
httpClient.request(any(), any())
84+
} answers {
85+
// Simulate failure
86+
secondArg<(Result<String>) -> Unit>().invoke(Result.failure(Exception("Network error")))
87+
}
88+
89+
var callbackResult: Result<Unit>? = null
90+
91+
pushDeliveryTracker.trackMetric("token", "OPENED", "deliveryId") { result ->
92+
callbackResult = result
93+
Unit
94+
}
95+
96+
callbackResult!!.isFailure.shouldBeEqualTo(true)
97+
}
98+
}

0 commit comments

Comments
 (0)