Skip to content

Commit 30d2494

Browse files
authored
feat: Add support for Get / Set SessionId on Rokt (#536)
1 parent 875473a commit 30d2494

File tree

3 files changed

+165
-3
lines changed

3 files changed

+165
-3
lines changed

UnitTests/ObjCTests/MPRoktTests.m

Lines changed: 107 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@
88
#import "MParticleSwift.h"
99
#import "MPIConstants.h"
1010

11+
// Rokt kit identifier for testing
12+
static NSNumber * const kTestRoktKitId = @181;
13+
14+
// Test helper class that simulates a kit with getSessionId method
15+
@interface MPRoktTestKitInstance : NSObject
16+
@property (nonatomic, copy) NSString *sessionIdToReturn;
17+
- (NSString *)getSessionId;
18+
@end
19+
20+
@implementation MPRoktTestKitInstance
21+
- (NSString *)getSessionId {
22+
return self.sessionIdToReturn;
23+
}
24+
@end
25+
1126
@interface MPRokt ()
1227
- (NSArray<NSDictionary<NSString *, NSString *> *> *)getRoktPlacementAttributesMapping;
1328
- (NSNumber *)getRoktHashedEmailUserIdentityType;
@@ -293,7 +308,7 @@ - (void)testGetRoktPlacementAttributesMapping {
293308
self.mockInstance = OCMPartialMock(instance);
294309
self.mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]);
295310
NSArray *kitConfig = @[@{
296-
@"id": @181,
311+
@"id": kTestRoktKitId,
297312
kMPRemoteConfigKitConfigurationKey: @{
298313
@"AllowJavaScriptResponse": @"True",
299314
@"accountId": @12345,
@@ -322,7 +337,7 @@ - (void)testGetRoktHashedEmailUserIdentityType {
322337
self.mockInstance = OCMPartialMock(instance);
323338
self.mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]);
324339
NSArray *kitConfig = @[@{
325-
@"id": @181,
340+
@"id": kTestRoktKitId,
326341
kMPRemoteConfigKitConfigurationKey: @{
327342
@"AllowJavaScriptResponse": @"True",
328343
@"accountId": @12345,
@@ -344,7 +359,7 @@ - (void)testGetRoktHashedEmailUserIdentityTypeReturnsNilWhenNotConfigured {
344359
self.mockInstance = OCMPartialMock(instance);
345360
self.mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]);
346361
NSArray *kitConfig = @[@{
347-
@"id": @181,
362+
@"id": kTestRoktKitId,
348363
kMPRemoteConfigKitConfigurationKey: @{
349364
@"AllowJavaScriptResponse": @"True",
350365
@"accountId": @12345,
@@ -745,4 +760,93 @@ - (void)testEventsWithIdentifierCallbackInvocation {
745760
OCMVerifyAll(self.mockContainer);
746761
}
747762

763+
#pragma mark - setSessionId Tests
764+
765+
- (void)testSetSessionIdForwardsToKitContainer {
766+
MParticle *instance = [MParticle sharedInstance];
767+
self.mockInstance = OCMPartialMock(instance);
768+
self.mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]);
769+
[[[self.mockInstance stub] andReturn:self.mockContainer] kitContainer_PRIVATE];
770+
[[[self.mockInstance stub] andReturn:self.mockInstance] sharedInstance];
771+
772+
// Set up test parameters
773+
NSString *sessionId = @"test-session-id-12345";
774+
775+
// Set up expectations for kit container
776+
XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for async operation"];
777+
SEL roktSelector = @selector(setSessionId:);
778+
OCMExpect([self.mockContainer forwardSDKCall:roktSelector
779+
event:nil
780+
parameters:[OCMArg checkWithBlock:^BOOL(MPForwardQueueParameters *params) {
781+
XCTAssertEqualObjects(params[0], sessionId);
782+
return true;
783+
}]
784+
messageType:MPMessageTypeEvent
785+
userInfo:nil]).andDo(^(NSInvocation *invocation) {
786+
[expectation fulfill];
787+
});
788+
789+
// Execute method
790+
[self.rokt setSessionId:sessionId];
791+
792+
// Wait for async operation
793+
[self waitForExpectationsWithTimeout:0.2 handler:nil];
794+
795+
// Verify
796+
OCMVerifyAll(self.mockContainer);
797+
}
798+
799+
#pragma mark - getSessionId Tests
800+
801+
- (void)testGetSessionIdReturnsSessionIdFromKit {
802+
MParticle *instance = [MParticle sharedInstance];
803+
self.mockInstance = OCMPartialMock(instance);
804+
self.mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]);
805+
[[[self.mockInstance stub] andReturn:self.mockContainer] kitContainer_PRIVATE];
806+
[[[self.mockInstance stub] andReturn:self.mockInstance] sharedInstance];
807+
808+
// Create a mock kit register with Rokt kit code
809+
id mockKitRegister = OCMProtocolMock(@protocol(MPExtensionKitProtocol));
810+
OCMStub([(id<MPExtensionKitProtocol>)mockKitRegister code]).andReturn(kTestRoktKitId);
811+
812+
// Create a real kit instance that responds to getSessionId
813+
NSString *expectedSessionId = @"mock-session-id-67890";
814+
MPRoktTestKitInstance *kitInstance = [[MPRoktTestKitInstance alloc] init];
815+
kitInstance.sessionIdToReturn = expectedSessionId;
816+
OCMStub([mockKitRegister wrapperInstance]).andReturn(kitInstance);
817+
818+
// Return the mock kit register from activeKitsRegistry
819+
NSArray *activeKits = @[mockKitRegister];
820+
OCMStub([self.mockContainer activeKitsRegistry]).andReturn(activeKits);
821+
822+
// Execute method
823+
NSString *result = [self.rokt getSessionId];
824+
825+
// Verify
826+
XCTAssertEqualObjects(result, expectedSessionId, @"Should return the session id from the kit");
827+
}
828+
829+
- (void)testGetSessionIdReturnsNilWhenKitInstanceIsNil {
830+
MParticle *instance = [MParticle sharedInstance];
831+
self.mockInstance = OCMPartialMock(instance);
832+
self.mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]);
833+
[[[self.mockInstance stub] andReturn:self.mockContainer] kitContainer_PRIVATE];
834+
[[[self.mockInstance stub] andReturn:self.mockInstance] sharedInstance];
835+
836+
// Create a mock kit register with Rokt kit code but nil wrapperInstance
837+
id mockKitRegister = OCMProtocolMock(@protocol(MPExtensionKitProtocol));
838+
OCMStub([(id<MPExtensionKitProtocol>)mockKitRegister code]).andReturn(kTestRoktKitId);
839+
OCMStub([mockKitRegister wrapperInstance]).andReturn(nil);
840+
841+
// Return the mock kit register from activeKitsRegistry
842+
NSArray *activeKits = @[mockKitRegister];
843+
OCMStub([self.mockContainer activeKitsRegistry]).andReturn(activeKits);
844+
845+
// Execute method
846+
NSString *result = [self.rokt getSessionId];
847+
848+
// Verify
849+
XCTAssertNil(result, @"Should return nil when kit wrapper instance is nil");
850+
}
851+
748852
@end

mParticle-Apple-SDK/Include/MPRokt.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,22 @@ typedef NS_ENUM(NSInteger, MPColorMode) {
114114
*/
115115
- (void)close;
116116

117+
/**
118+
* Set the session id to use for the next execute call.
119+
* This is useful for cases where you have a session id from a non-native integration,
120+
* e.g. WebView, and you want the session to be consistent across integrations.
121+
*
122+
* @note Empty strings are ignored and will not update the session.
123+
*
124+
* @param sessionId The session id to be set. Must be a non-empty string.
125+
*/
126+
- (void)setSessionId:(NSString * _Nonnull)sessionId;
127+
128+
/**
129+
* Get the session id to use within a non-native integration e.g. WebView.
130+
*
131+
* @return The session id or nil if no session is present.
132+
*/
133+
- (NSString * _Nullable)getSessionId;
134+
117135
@end

mParticle-Apple-SDK/MPRokt.m

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#import "MPILogger.h"
1212
#import "MPIConstants.h"
1313
#import "MPIdentityDTO.h"
14+
#import "MPExtensionProtocol.h"
1415

1516
// Constants for kit configuration keys
1617
static NSString * const kMPKitConfigurationIdKey = @"id";
@@ -172,6 +173,45 @@ - (void)close {
172173
});
173174
}
174175

176+
/// Set the session id to use for the next execute call.
177+
/// This is useful for cases where you have a session id from a non-native integration,
178+
/// e.g. WebView, and you want the session to be consistent across integrations.
179+
/// - Note: Empty strings are ignored and will not update the session.
180+
/// - Parameters:
181+
/// - sessionId: The session id to be set. Must be a non-empty string.
182+
- (void)setSessionId:(NSString * _Nonnull)sessionId {
183+
dispatch_async(dispatch_get_main_queue(), ^{
184+
MPForwardQueueParameters *queueParameters = [[MPForwardQueueParameters alloc] init];
185+
[queueParameters addParameter:sessionId];
186+
187+
[[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(setSessionId:)
188+
event:nil
189+
parameters:queueParameters
190+
messageType:MPMessageTypeEvent
191+
userInfo:nil
192+
];
193+
});
194+
}
195+
196+
/// Get the session id to use within a non-native integration e.g. WebView.
197+
/// - Returns: The session id or nil if no session is present.
198+
- (NSString * _Nullable)getSessionId {
199+
__block NSString *result = nil;
200+
201+
NSArray<id<MPExtensionKitProtocol>> *activeKits = [[MParticle sharedInstance].kitContainer_PRIVATE activeKitsRegistry];
202+
for (id<MPExtensionKitProtocol> kitRegister in activeKits) {
203+
if ([kitRegister.code integerValue] == kMPRoktKitId) {
204+
id kitInstance = kitRegister.wrapperInstance;
205+
if (kitInstance && [kitInstance respondsToSelector:@selector(getSessionId)]) {
206+
result = [kitInstance performSelector:@selector(getSessionId)];
207+
break;
208+
}
209+
}
210+
}
211+
212+
return result;
213+
}
214+
175215
#pragma mark - Private Helper Methods
176216

177217
/// Retrieves the Rokt Kit configuration from the kit container.

0 commit comments

Comments
 (0)