Skip to content

Commit 3a3a8b7

Browse files
author
Evan Masseau
committed
Unit tests and fixes from app testing
1 parent b3626d4 commit 3a3a8b7

File tree

7 files changed

+81
-9
lines changed

7 files changed

+81
-9
lines changed

sdk/forms/src/main/java/com/klaviyo/forms/bridge/CompanyObserver.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,18 @@ import com.klaviyo.forms.reInitializeInAppForms
1212
* to reload klaviyo.js for the new company
1313
*/
1414
internal class CompanyObserver : JsBridgeObserver {
15-
override val handshake: HandshakeSpec = HandshakeSpec(
16-
type = "companyInitialization",
17-
version = 1
18-
)
15+
/**
16+
* At this time, company ID doesn't have a handshake spec because
17+
* it only resets the webview, doesn't communicate with the onsite module
18+
*/
19+
override val handshake: HandshakeSpec? = null
1920

2021
override fun startObserver() = Registry.get<State>().onStateChange(::onStateChange)
2122

2223
override fun stopObserver() = Registry.get<State>().offStateChange(::onStateChange)
2324

2425
private fun onStateChange(key: Keyword?, oldValue: Any?) = when (key) {
25-
StateKey.API_KEY -> Klaviyo.reInitializeInAppForms().also {
26+
StateKey.API_KEY -> Klaviyo.reInitializeInAppForms().run {
2627
Registry.log.info(
2728
"In-app forms reinitialized: company ID changed from $oldValue to ${Registry.get<State>().apiKey}"
2829
)

sdk/forms/src/main/java/com/klaviyo/forms/bridge/JsBridgeObserver.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ package com.klaviyo.forms.bridge
66
internal interface JsBridgeObserver {
77
/**
88
* HandshakeSpec indicating the type and version of messages this observer communicates into the webview
9+
* Nullable because not all observers will have a handshake item (i.e. they don't communicate with onsite module)
910
*/
10-
val handshake: HandshakeSpec
11+
val handshake: HandshakeSpec?
1112

1213
/**
1314
* Start observing events and passing data into the webview

sdk/forms/src/main/java/com/klaviyo/forms/bridge/JsBridgeObserverCollection.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ internal interface JsBridgeObserverCollection {
1212
/**
1313
* Compiles the handshake data from all observers into a single list
1414
*/
15-
val handshake: List<HandshakeSpec> get() = observers.map { it.handshake }
15+
val handshake: List<HandshakeSpec> get() = observers.mapNotNull { it.handshake }
1616

1717
/**
1818
* Start all observers in the collection

sdk/forms/src/main/java/com/klaviyo/forms/bridge/KlaviyoObserverCollection.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package com.klaviyo.forms.bridge
66
internal class KlaviyoObserverCollection : JsBridgeObserverCollection {
77
override val observers: List<JsBridgeObserver> by lazy {
88
listOf(
9+
CompanyObserver(),
910
LifecycleObserver(),
1011
ProfileObserver()
1112
)

sdk/forms/src/main/java/com/klaviyo/forms/bridge/LifecycleObserver.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ internal class LifecycleObserver : JsBridgeObserver {
1414
private val sessionTimeoutMs: Long
1515
get() = Registry.get<InAppFormsConfig>().sessionTimeoutDuration * 1_000
1616

17-
override val handshake: HandshakeSpec = HandshakeSpec(
17+
override val handshake: HandshakeSpec? = HandshakeSpec(
1818
type = "lifecycleEvent",
1919
version = 1
2020
)

sdk/forms/src/main/java/com/klaviyo/forms/bridge/ProfileObserver.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import com.klaviyo.core.Registry
99
* Observe [State] in the analytics package to synchronize profile identifiers with the webview
1010
*/
1111
internal class ProfileObserver : JsBridgeObserver {
12-
override val handshake: HandshakeSpec = HandshakeSpec(
12+
override val handshake: HandshakeSpec? = HandshakeSpec(
1313
type = "profileMutation",
1414
version = 1
1515
)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.klaviyo.forms.bridge
2+
3+
import com.klaviyo.analytics.Klaviyo
4+
import com.klaviyo.analytics.model.Keyword
5+
import com.klaviyo.analytics.model.ProfileKey
6+
import com.klaviyo.analytics.model.StateKey
7+
import com.klaviyo.analytics.state.State
8+
import com.klaviyo.core.Registry
9+
import com.klaviyo.forms.reInitializeInAppForms
10+
import com.klaviyo.forms.webview.WebViewClient
11+
import io.mockk.every
12+
import io.mockk.mockk
13+
import io.mockk.mockkStatic
14+
import io.mockk.slot
15+
import io.mockk.unmockkAll
16+
import io.mockk.verify
17+
import org.junit.After
18+
import org.junit.Assert.assertEquals
19+
import org.junit.Before
20+
import org.junit.Test
21+
22+
class CompanyObserverTest {
23+
private val observerSlot = slot<(Keyword?, Any?) -> Unit>()
24+
private val stateMock = mockk<State>(relaxed = true).apply {
25+
every { onStateChange(capture(observerSlot)) } returns Unit
26+
every { apiKey } returns "new_key"
27+
}
28+
29+
private val mockWebViewClient = mockk<WebViewClient>(relaxed = true).apply {
30+
every { destroyWebView() } returns this
31+
}
32+
33+
@Before
34+
fun setup() {
35+
mockkStatic("com.klaviyo.forms.InAppFormsKt") // Mock the extension function
36+
every { Klaviyo.reInitializeInAppForms() } returns Klaviyo
37+
Registry.register<WebViewClient>(mockWebViewClient)
38+
Registry.register<State>(stateMock)
39+
}
40+
41+
@After
42+
fun cleanup() {
43+
Registry.unregister<WebViewClient>()
44+
Registry.unregister<State>()
45+
unmockkAll()
46+
}
47+
48+
@Test
49+
fun `handshake is correct`() = assertEquals(
50+
null,
51+
CompanyObserver().handshake
52+
)
53+
54+
@Test
55+
fun `startObserver attaches to state change`() {
56+
CompanyObserver().startObserver()
57+
assert(observerSlot.isCaptured)
58+
observerSlot.captured.invoke(StateKey.API_KEY, "old_key")
59+
verify { Klaviyo.reInitializeInAppForms() }
60+
}
61+
62+
@Test
63+
fun `observer ignores other keys`() {
64+
CompanyObserver().startObserver()
65+
assert(observerSlot.isCaptured)
66+
observerSlot.captured.invoke(ProfileKey.CUSTOM("email"), "old_email")
67+
verify(inverse = true) { Klaviyo.reInitializeInAppForms() }
68+
}
69+
}

0 commit comments

Comments
 (0)