Skip to content

Commit c353f6f

Browse files
feat(MSDK-3172): Consume and expose DPS metadata in AppSDK
1 parent 62734c7 commit c353f6f

File tree

13 files changed

+268
-3
lines changed

13 files changed

+268
-3
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ class UsercentricsPlugin : FlutterPlugin,
7272
ClearUserSessionBridge(),
7373
GetGPPDataBridge(),
7474
GetGPPStringBridge(),
75-
SetGPPConsentBridge()
75+
SetGPPConsentBridge(),
76+
GetDpsMetadataBridge()
7677
).associateBy { it.name }
7778
}
7879

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 GetDpsMetadataBridge(
9+
private val usercentrics: UsercentricsProxy = UsercentricsProxySingleton
10+
) : MethodBridge {
11+
12+
override val name: String
13+
get() = "getDpsMetadata"
14+
15+
override fun invoke(call: FlutterMethodCall, result: FlutterResult) {
16+
assert(name == call.method)
17+
val templateId = call.arguments as String
18+
result.success(usercentrics.instance.getDpsMetadata(templateId))
19+
}
20+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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.GetDpsMetadataMock
8+
import io.mockk.every
9+
import io.mockk.mockk
10+
import io.mockk.verify
11+
import org.junit.Assert.assertEquals
12+
import org.junit.Assert.assertThrows
13+
import org.junit.Test
14+
15+
class GetDpsMetadataBridgeTest {
16+
17+
@Test
18+
fun testName() {
19+
val instance = GetDpsMetadataBridge(FakeUsercentricsProxy())
20+
assertEquals("getDpsMetadata", instance.name)
21+
}
22+
23+
@Test
24+
fun testInvokeWithOtherName() {
25+
val instance = GetDpsMetadataBridge(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.getDpsMetadata(GetDpsMetadataMock.templateId) }.returns(GetDpsMetadataMock.fake)
37+
val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
38+
val instance = GetDpsMetadataBridge(usercentricsProxy)
39+
val result = FakeFlutterResult()
40+
41+
instance.invoke(GetDpsMetadataMock.call, result)
42+
43+
verify(exactly = 1) { usercentricsSDK.getDpsMetadata(GetDpsMetadataMock.templateId) }
44+
45+
assertEquals(1, result.successCount)
46+
assertEquals(GetDpsMetadataMock.expected, result.successResultArgument)
47+
}
48+
49+
@Test
50+
fun testInvokeReturnsNull() {
51+
val usercentricsSDK = mockk<UsercentricsSDK>()
52+
every { usercentricsSDK.getDpsMetadata(any()) }.returns(null)
53+
val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
54+
val instance = GetDpsMetadataBridge(usercentricsProxy)
55+
val result = FakeFlutterResult()
56+
val call = FakeFlutterMethodCall(method = "getDpsMetadata", arguments = "unknownTemplate")
57+
58+
instance.invoke(call, result)
59+
60+
verify(exactly = 1) { usercentricsSDK.getDpsMetadata("unknownTemplate") }
61+
62+
assertEquals(1, result.successCount)
63+
assertEquals(null, result.successResultArgument)
64+
}
65+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.usercentrics.sdk.flutter.mock
2+
3+
import com.usercentrics.sdk.flutter.api.FakeFlutterMethodCall
4+
5+
internal object GetDpsMetadataMock {
6+
7+
const val templateId = "templateId123"
8+
9+
val fake: Map<String, Any> = mapOf(
10+
"key" to "value",
11+
"count" to 42
12+
)
13+
14+
val call = FakeFlutterMethodCall(method = "getDpsMetadata", arguments = templateId)
15+
val expected: Map<String, Any> = mapOf(
16+
"key" to "value",
17+
"count" to 42
18+
)
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import Usercentrics
2+
3+
struct GetDpsMetadataBridge : MethodBridge {
4+
5+
let name: String = "getDpsMetadata"
6+
let usercentrics: UsercentricsProxyProtocol
7+
8+
func invoke(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) {
9+
assert(call.method == name)
10+
guard let templateId = call.arguments as? String else {
11+
result(FlutterError(code: "usercentrics_flutter_getDpsMetadata_error",
12+
message: "Invalid Parameter",
13+
details: nil ))
14+
return
15+
}
16+
17+
result(usercentrics.shared.getDpsMetadata(templateId: templateId))
18+
}
19+
}

ios/Classes/SwiftUsercentricsPlugin.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ public class SwiftUsercentricsPlugin: NSObject, FlutterPlugin {
5454
ClearUserSessionBridge(usercentrics: usercentrics),
5555
GetGPPDataBridge(usercentrics: usercentrics),
5656
GetGPPStringBridge(usercentrics: usercentrics),
57-
SetGPPConsentBridge(usercentrics: usercentrics)
57+
SetGPPConsentBridge(usercentrics: usercentrics),
58+
GetDpsMetadataBridge(usercentrics: usercentrics)
5859
]
5960
return bridges.reduce([String : MethodBridge]()) { dict, value in
6061
var dict = dict

lib/src/internal/bridge/bridge.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ export 'clear_user_session_bridge.dart';
2626
export 'get_gpp_data_bridge.dart';
2727
export 'get_gpp_string_bridge.dart';
2828
export 'set_gpp_consent_bridge.dart';
29+
export 'get_dps_metadata_bridge.dart';
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import 'package:flutter/services.dart';
2+
3+
abstract class GetDpsMetadataBridge {
4+
const GetDpsMetadataBridge();
5+
6+
Future<Map<String, dynamic>?> invoke({
7+
required MethodChannel channel,
8+
required String templateId,
9+
});
10+
}
11+
12+
class MethodChannelGetDpsMetadata extends GetDpsMetadataBridge {
13+
const MethodChannelGetDpsMetadata();
14+
15+
static const String _name = 'getDpsMetadata';
16+
17+
@override
18+
Future<Map<String, dynamic>?> invoke({
19+
required MethodChannel channel,
20+
required String templateId,
21+
}) async {
22+
final result = await channel.invokeMethod<Map?>(_name, templateId);
23+
return result?.cast<String, dynamic>();
24+
}
25+
}

lib/src/internal/platform/method_channel_usercentrics.dart

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ class MethodChannelUsercentrics extends UsercentricsPlatform {
3737
this.clearUserSessionBridge = const MethodChannelClearUserSession(),
3838
this.getGPPDataBridge = const MethodChannelGetGPPData(),
3939
this.getGPPStringBridge = const MethodChannelGetGPPString(),
40-
this.setGPPConsentBridge = const MethodChannelSetGPPConsent()});
40+
this.setGPPConsentBridge = const MethodChannelSetGPPConsent(),
41+
this.getDpsMetadataBridge = const MethodChannelGetDpsMetadata()});
4142

4243
static const MethodChannel _channel = MethodChannel('usercentrics');
4344
static const EventChannel _gppSectionChangeEventChannel =
@@ -71,6 +72,7 @@ class MethodChannelUsercentrics extends UsercentricsPlatform {
7172
final GetGPPDataBridge getGPPDataBridge;
7273
final GetGPPStringBridge getGPPStringBridge;
7374
final SetGPPConsentBridge setGPPConsentBridge;
75+
final GetDpsMetadataBridge getDpsMetadataBridge;
7476

7577
@visibleForTesting
7678
Completer<Object?>? isReadyCompleter;
@@ -379,6 +381,17 @@ class MethodChannelUsercentrics extends UsercentricsPlatform {
379381
);
380382
}
381383

384+
@override
385+
Future<Map<String, dynamic>?> getDpsMetadata({
386+
required String templateId,
387+
}) async {
388+
await _ensureIsReady();
389+
return await getDpsMetadataBridge.invoke(
390+
channel: _channel,
391+
templateId: templateId,
392+
);
393+
}
394+
382395
@override
383396
Stream<GppSectionChangePayload> get onGppSectionChange {
384397
return _gppSectionChangeEventChannel

lib/src/platform/usercentrics_platform.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,8 @@ abstract class UsercentricsPlatform {
114114
});
115115

116116
Stream<GppSectionChangePayload> get onGppSectionChange;
117+
118+
Future<Map<String, dynamic>?> getDpsMetadata({
119+
required String templateId,
120+
});
117121
}

0 commit comments

Comments
 (0)