Skip to content

Commit 50058d6

Browse files
authored
Merge pull request #34 from Usercentrics/task/MSDK-1816/support-ab-testing
Support ab testing
2 parents 0869fb8 + 5e2fe79 commit 50058d6

34 files changed

+703
-277
lines changed

android/src/main/kotlin/com/usercentrics/sdk/flutter/UsercentricsPlugin.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ class UsercentricsPlugin : FlutterPlugin,
5959
SaveDecisionsBridge(),
6060
SaveDecisionsForTCFBridge(),
6161
SaveOptOutForCCPABridge(),
62-
SetCMPIdBridge()
62+
SetCMPIdBridge(),
63+
GetABTestingVariantBridge(),
64+
SetABTestingVariantBridge()
6365
).map { it.name to it }.toMap()
6466
}
6567

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.usercentrics.sdk.flutter.bridge
2+
3+
import com.usercentrics.sdk.flutter.api.FlutterMethodCall
4+
import com.usercentrics.sdk.flutter.api.FlutterResult
5+
import com.usercentrics.sdk.flutter.api.UsercentricsProxy
6+
import com.usercentrics.sdk.flutter.api.UsercentricsProxySingleton
7+
8+
internal class GetABTestingVariantBridge(
9+
private val usercentrics: UsercentricsProxy = UsercentricsProxySingleton
10+
): MethodBridge {
11+
override val name: String
12+
get() = "getABTestingVariant"
13+
14+
override fun invoke(call: FlutterMethodCall, result: FlutterResult) {
15+
assert(name == call.method)
16+
result.success(usercentrics.instance.getABTestingVariant())
17+
}
18+
}

android/src/main/kotlin/com/usercentrics/sdk/flutter/bridge/GetControllerIdBridge.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ internal class GetControllerIdBridge(
1717
result.success(usercentrics.instance.getControllerId())
1818
}
1919

20-
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.usercentrics.sdk.flutter.bridge
2+
3+
import com.usercentrics.sdk.flutter.api.FlutterMethodCall
4+
import com.usercentrics.sdk.flutter.api.FlutterResult
5+
import com.usercentrics.sdk.flutter.api.UsercentricsProxy
6+
import com.usercentrics.sdk.flutter.api.UsercentricsProxySingleton
7+
8+
internal class SetABTestingVariantBridge(
9+
private val usercentrics: UsercentricsProxy = UsercentricsProxySingleton
10+
) : MethodBridge {
11+
12+
override val name: String
13+
get() = "setABTestingVariant"
14+
15+
override fun invoke(call: FlutterMethodCall, result: FlutterResult) {
16+
assert(name == call.method)
17+
usercentrics.instance.setABTestingVariant(call.arguments as String)
18+
result.success(null)
19+
}
20+
}

android/src/main/kotlin/com/usercentrics/sdk/flutter/bridge/SetCMPIdBridge.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,4 @@ internal class SetCMPIdBridge(
1717
usercentrics.instance.setCMPId(call.arguments as Int)
1818
result.success(null)
1919
}
20-
21-
}
20+
}

android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/BannerSettingsSerializer.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ internal fun Any?.deserializeBannerSettings(
2424
assetsProvider,
2525
activityProvider
2626
),
27+
variant = this["variant"] as? String?
2728
)
2829
}
2930

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.usercentrics.sdk.flutter.bridge
2+
3+
import com.usercentrics.sdk.UsercentricsSDK
4+
import com.usercentrics.sdk.flutter.api.FakeFlutterMethodCall
5+
import com.usercentrics.sdk.flutter.api.FakeFlutterResult
6+
import com.usercentrics.sdk.flutter.api.FakeUsercentricsProxy
7+
import com.usercentrics.sdk.flutter.mock.GetABTestingVariantMock
8+
import com.usercentrics.sdk.flutter.mock.GetTCFDataMock
9+
import com.usercentrics.sdk.services.tcf.interfaces.TCFData
10+
import io.mockk.every
11+
import io.mockk.mockk
12+
import io.mockk.verify
13+
import org.junit.Assert.assertEquals
14+
import org.junit.Assert.assertThrows
15+
import org.junit.Test
16+
17+
class GetABTestingVariantBridgeTest {
18+
19+
@Test
20+
fun testName() {
21+
val instance = GetABTestingVariantBridge(FakeUsercentricsProxy())
22+
assertEquals("getABTestingVariant", instance.name)
23+
}
24+
25+
@Test
26+
fun testInvokeWithOtherName() {
27+
val instance = GetABTestingVariantBridge(FakeUsercentricsProxy())
28+
val call = FakeFlutterMethodCall(method = "otherName", arguments = null)
29+
30+
assertThrows(AssertionError::class.java) {
31+
instance.invoke(call, FakeFlutterResult())
32+
}
33+
}
34+
35+
@Test
36+
fun testInvoke() {
37+
val usercentricsSDK = mockk<UsercentricsSDK>()
38+
every { usercentricsSDK.getABTestingVariant() }.returns(GetABTestingVariantMock.fake)
39+
val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
40+
val instance = GetABTestingVariantBridge(usercentricsProxy)
41+
val result = FakeFlutterResult()
42+
43+
instance.invoke(GetABTestingVariantMock.call, result)
44+
45+
verify(exactly = 1) { usercentricsSDK.getABTestingVariant() }
46+
47+
assertEquals(1, result.successCount)
48+
assertEquals(GetABTestingVariantMock.expected, result.successResultArgument)
49+
}
50+
51+
@Test
52+
fun testInvokeWhenNull() {
53+
val usercentricsSDK = mockk<UsercentricsSDK>()
54+
every { usercentricsSDK.getABTestingVariant() }.returns(null)
55+
val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
56+
val instance = GetABTestingVariantBridge(usercentricsProxy)
57+
val result = FakeFlutterResult()
58+
59+
instance.invoke(GetABTestingVariantMock.call, result)
60+
61+
verify(exactly = 1) { usercentricsSDK.getABTestingVariant() }
62+
63+
assertEquals(1, result.successCount)
64+
assertEquals(null, result.successResultArgument)
65+
}
66+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.usercentrics.sdk.flutter.bridge
2+
3+
import com.usercentrics.sdk.UsercentricsSDK
4+
import com.usercentrics.sdk.flutter.api.FakeFlutterMethodCall
5+
import com.usercentrics.sdk.flutter.api.FakeFlutterResult
6+
import com.usercentrics.sdk.flutter.api.FakeUsercentricsProxy
7+
import com.usercentrics.sdk.flutter.mock.SetABTestingVariantMock
8+
import com.usercentrics.sdk.flutter.mock.SetCMPIdMock
9+
import io.mockk.every
10+
import io.mockk.mockk
11+
import io.mockk.verify
12+
import org.junit.Assert.assertEquals
13+
import org.junit.Assert.assertThrows
14+
import org.junit.Test
15+
16+
class SetABTestingVariantBridgeTest {
17+
@Test
18+
fun testName() {
19+
val instance = SetABTestingVariantBridge(FakeUsercentricsProxy())
20+
assertEquals("setABTestingVariant", instance.name)
21+
}
22+
23+
@Test
24+
fun testInvokeWithOtherName() {
25+
val instance = SetABTestingVariantBridge(FakeUsercentricsProxy())
26+
val call = FakeFlutterMethodCall(method = "otherName", arguments = null)
27+
28+
assertThrows(AssertionError::class.java) {
29+
instance.invoke(call, FakeFlutterResult())
30+
}
31+
}
32+
33+
@Test
34+
fun testInvoke() {
35+
val usercentricsSDK = mockk<UsercentricsSDK>()
36+
every { usercentricsSDK.setABTestingVariant(any()) }.answers { }
37+
val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
38+
val instance = SetABTestingVariantBridge(usercentricsProxy)
39+
val result = FakeFlutterResult()
40+
41+
instance.invoke(SetABTestingVariantMock.call, result)
42+
43+
verify(exactly = 1) {
44+
usercentricsSDK.setABTestingVariant(
45+
variant = SetABTestingVariantMock.callABTestingVariant
46+
)
47+
}
48+
49+
assertEquals(1, result.successCount)
50+
assertEquals(SetABTestingVariantMock.expected, result.successResultArgument)
51+
}
52+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.usercentrics.sdk.flutter.mock
2+
3+
import com.usercentrics.sdk.flutter.api.FakeFlutterMethodCall
4+
5+
internal object GetABTestingVariantMock {
6+
7+
const val fake =
8+
"variantA"
9+
10+
// From the debugger
11+
val call = FakeFlutterMethodCall(method = "getABTestingVariant", arguments = null)
12+
const val expected =
13+
"variantA"
14+
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.usercentrics.sdk.flutter.mock
2+
3+
import com.usercentrics.sdk.flutter.api.FakeFlutterMethodCall
4+
5+
internal object SetABTestingVariantMock {
6+
7+
// From the debugger
8+
val call = FakeFlutterMethodCall(
9+
method = "setABTestingVariant",
10+
arguments = "variantA"
11+
)
12+
const val callABTestingVariant = "variantA"
13+
val expected: Any? = null
14+
15+
}

0 commit comments

Comments
 (0)