Skip to content

Commit 73ce2cc

Browse files
feat: Implement SwiftUI Support (#18)
* feat: Implement SwiftUI Support
1 parent fbf2d9f commit 73ce2cc

8 files changed

Lines changed: 566 additions & 29 deletions

File tree

mParticle-Rokt.xcodeproj/project.pbxproj

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88

99
/* Begin PBXBuildFile section */
1010
2502325C2D7A7BF3004794A2 /* Rokt-Widget in Frameworks */ = {isa = PBXBuildFile; productRef = 2502325B2D7A7BF3004794A2 /* Rokt-Widget */; };
11+
7E084C862E0C4B3A0098059B /* MPRoktLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E084C842E0C4B340098059B /* MPRoktLayout.swift */; };
12+
7E084C8A2E12C4D30098059B /* mParticle_Rokt_SwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E084C892E12C4D30098059B /* mParticle_Rokt_SwiftTests.swift */; };
1113
7E15B20B2D9AE82600C1FF3E /* Rokt-Widget in Frameworks */ = {isa = PBXBuildFile; productRef = 7E15B20A2D9AE82600C1FF3E /* Rokt-Widget */; };
1214
7EDDAAB02E05A88E00D089CF /* mParticle-Apple-SDK in Frameworks */ = {isa = PBXBuildFile; productRef = 7EDDAAAF2E05A88E00D089CF /* mParticle-Apple-SDK */; };
1315
7EDDAAB22E05A89B00D089CF /* mParticle-Apple-SDK in Frameworks */ = {isa = PBXBuildFile; productRef = 7EDDAAB12E05A89B00D089CF /* mParticle-Apple-SDK */; };
1416
7EE7F13E2DA95BEE006C5440 /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = 7EE7F13D2DA95BEE006C5440 /* OCMock */; };
1517
B34CE55A2E04356F00712DE1 /* MPRoktEventMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3D778512E02845700D887A4 /* MPRoktEventMapper.swift */; };
16-
B3D778532E02845700D887A4 /* MPRoktEventMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3D778512E02845700D887A4 /* MPRoktEventMapper.swift */; };
1718
DBB01A601DC1478A00A7B188 /* mParticle_Rokt.h in Headers */ = {isa = PBXBuildFile; fileRef = DBB01A5E1DC1478A00A7B188 /* mParticle_Rokt.h */; settings = {ATTRIBUTES = (Public, ); }; };
18-
DBB01A681DC1480700A7B188 /* MPKitRokt.h in Headers */ = {isa = PBXBuildFile; fileRef = DBB01A661DC1480700A7B188 /* MPKitRokt.h */; };
19+
DBB01A681DC1480700A7B188 /* MPKitRokt.h in Headers */ = {isa = PBXBuildFile; fileRef = DBB01A661DC1480700A7B188 /* MPKitRokt.h */; settings = {ATTRIBUTES = (Public, ); }; };
1920
DBB01A691DC1480700A7B188 /* MPKitRokt.m in Sources */ = {isa = PBXBuildFile; fileRef = DBB01A671DC1480700A7B188 /* MPKitRokt.m */; };
2021
FF0BB63E217A84E800B0556C /* mParticle_RoktTests.m in Sources */ = {isa = PBXBuildFile; fileRef = FF0BB63D217A84E800B0556C /* mParticle_RoktTests.m */; };
2122
FF0BB640217A84E800B0556C /* mParticle_Rokt.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBB01A5B1DC1478A00A7B188 /* mParticle_Rokt.framework */; };
@@ -32,6 +33,9 @@
3233
/* End PBXContainerItemProxy section */
3334

3435
/* Begin PBXFileReference section */
36+
7E084C842E0C4B340098059B /* MPRoktLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPRoktLayout.swift; sourceTree = "<group>"; };
37+
7E084C882E12C4D30098059B /* mParticle_RoktTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "mParticle_RoktTests-Bridging-Header.h"; sourceTree = "<group>"; };
38+
7E084C892E12C4D30098059B /* mParticle_Rokt_SwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = mParticle_Rokt_SwiftTests.swift; sourceTree = "<group>"; };
3539
B3D778512E02845700D887A4 /* MPRoktEventMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPRoktEventMapper.swift; sourceTree = "<group>"; };
3640
DBB01A5B1DC1478A00A7B188 /* mParticle_Rokt.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = mParticle_Rokt.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3741
DBB01A5E1DC1478A00A7B188 /* mParticle_Rokt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mParticle_Rokt.h; sourceTree = "<group>"; };
@@ -89,6 +93,7 @@
8993
DBB01A5D1DC1478A00A7B188 /* mParticle-Rokt */ = {
9094
isa = PBXGroup;
9195
children = (
96+
7E084C842E0C4B340098059B /* MPRoktLayout.swift */,
9297
B3D778512E02845700D887A4 /* MPRoktEventMapper.swift */,
9398
DBB01A661DC1480700A7B188 /* MPKitRokt.h */,
9499
DBB01A671DC1480700A7B188 /* MPKitRokt.m */,
@@ -102,7 +107,9 @@
102107
isa = PBXGroup;
103108
children = (
104109
FF0BB63D217A84E800B0556C /* mParticle_RoktTests.m */,
110+
7E084C892E12C4D30098059B /* mParticle_Rokt_SwiftTests.swift */,
105111
FF0BB63F217A84E800B0556C /* Info.plist */,
112+
7E084C882E12C4D30098059B /* mParticle_RoktTests-Bridging-Header.h */,
106113
);
107114
path = mParticle_RoktTests;
108115
sourceTree = "<group>";
@@ -237,6 +244,7 @@
237244
buildActionMask = 2147483647;
238245
files = (
239246
B34CE55A2E04356F00712DE1 /* MPRoktEventMapper.swift in Sources */,
247+
7E084C862E0C4B3A0098059B /* MPRoktLayout.swift in Sources */,
240248
DBB01A691DC1480700A7B188 /* MPKitRokt.m in Sources */,
241249
);
242250
runOnlyForDeploymentPostprocessing = 0;
@@ -245,8 +253,8 @@
245253
isa = PBXSourcesBuildPhase;
246254
buildActionMask = 2147483647;
247255
files = (
248-
B3D778532E02845700D887A4 /* MPRoktEventMapper.swift in Sources */,
249256
FF0BB63E217A84E800B0556C /* mParticle_RoktTests.m in Sources */,
257+
7E084C8A2E12C4D30098059B /* mParticle_Rokt_SwiftTests.swift in Sources */,
250258
);
251259
runOnlyForDeploymentPostprocessing = 0;
252260
};
@@ -449,6 +457,7 @@
449457
MTL_FAST_MATH = YES;
450458
PRODUCT_BUNDLE_IDENTIFIER = "com.mparticle.mParticle-RoktTests";
451459
PRODUCT_NAME = "$(TARGET_NAME)";
460+
SWIFT_OBJC_BRIDGING_HEADER = "mParticle_RoktTests/mParticle_RoktTests-Bridging-Header.h";
452461
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
453462
SWIFT_VERSION = 6.0;
454463
TARGETED_DEVICE_FAMILY = "1,2";
@@ -489,6 +498,7 @@
489498
MTL_FAST_MATH = YES;
490499
PRODUCT_BUNDLE_IDENTIFIER = "com.mparticle.mParticle-RoktTests";
491500
PRODUCT_NAME = "$(TARGET_NAME)";
501+
SWIFT_OBJC_BRIDGING_HEADER = "mParticle_RoktTests/mParticle_RoktTests-Bridging-Header.h";
492502
SWIFT_VERSION = 6.0;
493503
TARGETED_DEVICE_FAMILY = "1,2";
494504
};

mParticle-Rokt/MPKitRokt.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@
1616
@property (nonatomic, strong, nullable) NSDictionary *launchOptions;
1717
@property (nonatomic, unsafe_unretained, readonly) BOOL started;
1818

19+
+ (NSDictionary<NSString *, NSString *> * _Nonnull)prepareAttributes:(NSDictionary<NSString *, NSString *> * _Nonnull)attributes filteredUser:(FilteredMParticleUser * _Nullable)filteredUser performMapping:(BOOL)performMapping;
20+
1921
@end

mParticle-Rokt/MPKitRokt.m

Lines changed: 126 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
NSString * const kMPRemoteConfigUserAttributeFilter = @"ua";
77
NSString * const MPKitRoktErrorDomain = @"com.mparticle.kits.rokt";
88
NSString * const MPKitRoktErrorMessageKey = @"mParticle-Rokt Error";
9+
NSString * const kMPPlacementAttributesMapping = @"placementAttributesMapping";
10+
static __weak MPKitRokt *roktKit = nil;
911

1012
@interface MPKitRokt () <MPKitProtocol>
1113

@@ -42,6 +44,7 @@ - (MPKitExecStatus *)didFinishLaunchingWithConfiguration:(NSDictionary *)configu
4244
}
4345

4446
_configuration = configuration;
47+
roktKit = self;
4548

4649
NSString *sdkVersion = [MParticle sharedInstance].version;
4750
// https://go.mparticle.com/work/SQDSDKS-7379
@@ -93,23 +96,7 @@ - (MPKitExecStatus *)executeWithIdentifier:(NSString * _Nullable)identifier
9396
config:(MPRoktConfig * _Nullable)mpRoktConfig
9497
callbacks:(MPRoktEventCallback * _Nullable)callbacks
9598
filteredUser:(FilteredMParticleUser * _Nonnull)filteredUser {
96-
NSDictionary<NSString *, NSString *> *mpAttributes = [filteredUser.userAttributes transformValuesToString];
97-
NSMutableDictionary<NSString *, NSString *> *finalAtt = [[NSMutableDictionary alloc] init];
98-
[finalAtt addEntriesFromDictionary:mpAttributes];
99-
100-
// Add MPID to the attributes being passed to the Rokt SDK
101-
if (filteredUser.userId.stringValue != nil) {
102-
[finalAtt addEntriesFromDictionary:@{@"mpid": filteredUser.userId.stringValue}];
103-
}
104-
105-
// Add all known user identities to the attributes being passed to the Rokt SDK
106-
[self addIdentityAttributes:finalAtt filteredUser:filteredUser];
107-
108-
// The core SDK does not set sandbox on the user, but we must pass it to Rokt if provided
109-
NSString *sandboxKey = @"sandbox";
110-
if (attributes[sandboxKey] != nil) {
111-
[finalAtt addEntriesFromDictionary:@{sandboxKey: attributes[sandboxKey]}];
112-
}
99+
NSDictionary<NSString *, NSString *> *finalAtt = [MPKitRokt prepareAttributes:attributes filteredUser:filteredUser performMapping:NO];
113100

114101
//Convert MPRoktConfig to RoktConfig
115102
RoktConfig *roktConfig = [MPKitRokt convertMPRoktConfig:mpRoktConfig];
@@ -171,7 +158,128 @@ - (RoktFrameworkType)mapMPWrapperSdkToRoktFrameworkType:(MPWrapperSdk)wrapperSdk
171158
return safePlacements;
172159
}
173160

174-
- (void)addIdentityAttributes:(NSMutableDictionary<NSString *, NSString *> * _Nullable)attributes filteredUser:(FilteredMParticleUser * _Nonnull)filteredUser {
161+
+ (NSDictionary<NSString *, NSString *> *)confirmSandboxAttribute:(NSDictionary<NSString *, NSString *> * _Nullable)attributes {
162+
NSMutableDictionary<NSString *, NSString *> *finalAttributes = attributes.mutableCopy;
163+
NSString *sandboxKey = @"sandbox";
164+
165+
// Determine the value of the sandbox attribute based off the current environment
166+
NSString *sandboxValue = ([[MParticle sharedInstance] environment] == MPEnvironmentDevelopment) ? @"true" : @"false";
167+
168+
if (finalAttributes != nil) {
169+
// Only set sandbox if it`s not set by the client
170+
if (![finalAttributes.allKeys containsObject:sandboxKey]) {
171+
finalAttributes[sandboxKey] = sandboxValue;
172+
}
173+
} else {
174+
finalAttributes = [[NSMutableDictionary alloc] initWithDictionary:@{sandboxKey: sandboxValue}];
175+
}
176+
177+
return finalAttributes;
178+
}
179+
180+
+ (NSDictionary<NSString *, NSString *> * _Nonnull)prepareAttributes:(NSDictionary<NSString *, NSString *> * _Nonnull)attributes filteredUser:(FilteredMParticleUser * _Nullable)filteredUser performMapping:(BOOL)performMapping {
181+
if (filteredUser == nil && roktKit != nil) {
182+
filteredUser = [[[MPKitAPI alloc] init] getCurrentUserWithKit:roktKit];
183+
}
184+
NSDictionary<NSString *, NSString *> *mpAttributes = [filteredUser.userAttributes transformValuesToString];
185+
if (performMapping) {
186+
mpAttributes = [self mapAttributes:attributes filteredUser:filteredUser];
187+
}
188+
189+
NSMutableDictionary<NSString *, NSString *> *finalAtt = [[NSMutableDictionary alloc] init];
190+
[finalAtt addEntriesFromDictionary:mpAttributes];
191+
192+
// Add MPID to the attributes being passed to the Rokt SDK
193+
if (filteredUser.userId.stringValue != nil) {
194+
[finalAtt addEntriesFromDictionary:@{@"mpid": filteredUser.userId.stringValue}];
195+
}
196+
197+
// Add all known user identities to the attributes being passed to the Rokt SDK
198+
[self addIdentityAttributes:finalAtt filteredUser:filteredUser];
199+
200+
// The core SDK does not set sandbox on the user, but we must pass it to Rokt if provided
201+
NSString *sandboxKey = @"sandbox";
202+
if (attributes[sandboxKey] != nil) {
203+
[finalAtt addEntriesFromDictionary:@{sandboxKey: attributes[sandboxKey]}];
204+
}
205+
206+
return [self confirmSandboxAttribute:finalAtt];
207+
}
208+
209+
+ (NSDictionary<NSString *, NSString *> *)mapAttributes:(NSDictionary<NSString *, NSString *> * _Nullable)attributes filteredUser:(FilteredMParticleUser * _Nonnull)filteredUser {
210+
NSArray<NSDictionary<NSString *, NSString *> *> *attributeMap = nil;
211+
212+
// Get the kit configuration
213+
NSArray<NSDictionary *> *kitConfigs = [MParticle sharedInstance].kitContainer_PRIVATE.originalConfig.copy;
214+
NSDictionary *roktKitConfig;
215+
for (NSDictionary *kitConfig in kitConfigs) {
216+
if (kitConfig[@"id"] != nil && [kitConfig[@"id"] integerValue] == 181) {
217+
roktKitConfig = kitConfig;
218+
}
219+
}
220+
221+
// Return nil if no Rokt Kit configuration found
222+
if (!roktKitConfig) {
223+
return attributes;
224+
}
225+
226+
// Get the placement attributes map
227+
NSString *strAttributeMap;
228+
NSData *dataAttributeMap;
229+
// Rokt Kit is available though there may not be an attribute map
230+
attributeMap = @[];
231+
if (roktKitConfig[kMPPlacementAttributesMapping] != [NSNull null]) {
232+
strAttributeMap = [roktKitConfig[kMPPlacementAttributesMapping] stringByRemovingPercentEncoding];
233+
dataAttributeMap = [strAttributeMap dataUsingEncoding:NSUTF8StringEncoding];
234+
}
235+
236+
if (dataAttributeMap != nil) {
237+
// Convert it to an array of dictionaries
238+
NSError *error = nil;
239+
240+
@try {
241+
attributeMap = [NSJSONSerialization JSONObjectWithData:dataAttributeMap options:kNilOptions error:&error];
242+
} @catch (NSException *exception) {
243+
}
244+
245+
if (attributeMap && !error) {
246+
NSLog(@"%@", attributeMap);
247+
} else {
248+
NSLog(@"%@", error);
249+
}
250+
}
251+
252+
if (attributeMap) {
253+
NSMutableDictionary *mappedAttributes = attributes.mutableCopy;
254+
for (NSDictionary<NSString *, NSString *> *map in attributeMap) {
255+
NSString *mapFrom = map[@"map"];
256+
NSString *mapTo = map[@"value"];
257+
if (mappedAttributes[mapFrom]) {
258+
NSString * value = mappedAttributes[mapFrom];
259+
[mappedAttributes removeObjectForKey:mapFrom];
260+
mappedAttributes[mapTo] = value;
261+
}
262+
}
263+
for (NSString *key in mappedAttributes) {
264+
if (![key isEqual:@"sandbox"]) {
265+
[[MParticle sharedInstance].identity.currentUser setUserAttribute:key value:mappedAttributes[key]];
266+
}
267+
}
268+
269+
// Add userAttributes to the attributes sent to Rokt
270+
for (NSString *uaKey in filteredUser.userAttributes) {
271+
if (![mappedAttributes.allKeys containsObject:uaKey]) {
272+
mappedAttributes[uaKey] = filteredUser.userAttributes[uaKey];
273+
}
274+
}
275+
276+
return [mappedAttributes transformValuesToString];
277+
} else {
278+
return attributes;
279+
}
280+
}
281+
282+
+ (void)addIdentityAttributes:(NSMutableDictionary<NSString *, NSString *> * _Nullable)attributes filteredUser:(FilteredMParticleUser * _Nonnull)filteredUser {
175283
NSMutableDictionary<NSString *, NSString *> *identityAttributes = [[NSMutableDictionary alloc] init];
176284
for (NSNumber *identityNumberKey in filteredUser.userIdentities) {
177285
NSString *identityStringKey = [MPKitRokt stringForIdentityType:identityNumberKey.unsignedIntegerValue];

mParticle-Rokt/MPRoktLayout.swift

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//
2+
// MPRoktLayout.swift
3+
// mParticle-Rokt
4+
//
5+
// Copyright 2025 Rokt Pte Ltd
6+
//
7+
// Licensed under the Rokt Software Development Kit (SDK) Terms of Use
8+
// Version 2.0 (the "License");
9+
//
10+
// You may not use this file except in compliance with the License.
11+
//
12+
// You may obtain a copy of the License at https://rokt.com/sdk-license-2-0/
13+
14+
import SwiftUI
15+
import Rokt_Widget
16+
import mParticle_Apple_SDK
17+
18+
@available(iOS 15, *)
19+
public struct MPRoktLayout: View {
20+
private var roktLayout: RoktLayout
21+
22+
public init(
23+
sdkTriggered: Binding<Bool>,
24+
viewName: String? = nil,
25+
locationName: String = "",
26+
attributes: [String: String],
27+
config: RoktConfig? = nil,
28+
onEvent: ((RoktEvent) -> Void)? = nil
29+
) {
30+
let preparedAttributes = MPKitRokt.prepareAttributes(attributes, filteredUser: Optional<FilteredMParticleUser>.none, performMapping: true)
31+
32+
self.roktLayout = RoktLayout.init(
33+
sdkTriggered: sdkTriggered,
34+
viewName: viewName,
35+
locationName: locationName,
36+
attributes: preparedAttributes,
37+
config: config,
38+
onEvent: onEvent
39+
)
40+
}
41+
42+
public var body: some View {
43+
return self.roktLayout.body
44+
}
45+
}

mParticle-Rokt/mParticle_Rokt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#import <UIKit/UIKit.h>
2+
#import "MPKitRokt.h"
23

34
FOUNDATION_EXPORT double mParticle_RoktVersionNumber;
45
FOUNDATION_EXPORT const unsigned char mParticle_RoktVersionString[];
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//
2+
// Use this file to import your target's public headers that you would like to expose to Swift.
3+
//
4+
#import <OCMock/OCMock.h>
5+
#import <Rokt_Widget/Rokt_Widget-Swift.h>
6+
#import <mParticle_Rokt/mParticle_Rokt.h>
7+
#import "MPKitRokt.h"
8+
#import <mParticle_Rokt/mParticle_Rokt-Swift.h>

mParticle_RoktTests/mParticle_RoktTests.m

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ - (MPKitExecStatus *)purchaseFinalized:(NSString *)placementId
2121

2222
- (NSDictionary<NSString *, RoktEmbeddedView *> * _Nullable) confirmEmbeddedViews:(NSDictionary<NSString *, MPRoktEmbeddedView *> * _Nullable)embeddedViews;
2323

24-
- (NSDictionary<NSString *, NSString *> *) filteredUserAttributes:(NSDictionary<NSString *, NSString *> * _Nonnull)attributes kitConfiguration:(MPKitConfiguration *)kitConfiguration;
25-
26-
- (void)addIdentityAttributes:(NSMutableDictionary<NSString *, NSString *> * _Nullable)attributes filteredUser:(FilteredMParticleUser * _Nonnull)filteredUser;
24+
+ (void)addIdentityAttributes:(NSMutableDictionary<NSString *, NSString *> * _Nullable)attributes filteredUser:(FilteredMParticleUser * _Nonnull)filteredUser;
2725

2826
+ (RoktConfig *)convertMPRoktConfig:(MPRoktConfig *)mpRoktConfig;
2927

@@ -132,7 +130,45 @@ - (void)testExecuteWithIdentifier {
132130
MPRoktEmbeddedView *view = [[MPRoktEmbeddedView alloc] init];
133131
NSString *identifier = @"TestView";
134132
NSDictionary *embeddedViews = @{@"placement1": view};
135-
NSDictionary *attributes = @{@"attr1": @"value1", @"sandbox": @"true"};
133+
NSDictionary *attributes = @{@"attr1": @"value1", @"sandbox": @"false"};
134+
FilteredMParticleUser *user = [[FilteredMParticleUser alloc] init];
135+
136+
// Expected attributes in final call
137+
NSDictionary *expectedAttributes = @{
138+
@"sandbox": @"false"
139+
};
140+
141+
// Expect Rokt execute call with correct parameters
142+
OCMExpect([mockRoktSDK executeWithViewName:identifier
143+
attributes:expectedAttributes
144+
placements:OCMOCK_ANY
145+
config:nil
146+
onLoad:nil
147+
onUnLoad:nil
148+
onShouldShowLoadingIndicator:nil
149+
onShouldHideLoadingIndicator:nil
150+
onEmbeddedSizeChange:nil]);
151+
152+
MPKitExecStatus *status = [self.kitInstance executeWithIdentifier:identifier
153+
attributes:attributes
154+
embeddedViews:embeddedViews
155+
config:nil
156+
callbacks:nil
157+
filteredUser:user];
158+
159+
// Verify
160+
XCTAssertNotNil(status);
161+
XCTAssertEqual(status.returnCode, MPKitReturnCodeSuccess);
162+
OCMVerifyAll(mockRoktSDK);
163+
}
164+
165+
- (void)testExecuteSandboxDetection {
166+
id mockRoktSDK = OCMClassMock([Rokt class]);
167+
168+
MPRoktEmbeddedView *view = [[MPRoktEmbeddedView alloc] init];
169+
NSString *identifier = @"TestView";
170+
NSDictionary *embeddedViews = @{@"placement1": view};
171+
NSDictionary *attributes = @{@"attr1": @"value1"};
136172
FilteredMParticleUser *user = [[FilteredMParticleUser alloc] init];
137173

138174
// Expected attributes in final call
@@ -196,8 +232,7 @@ - (void)testAddIdentityAttributes {
196232
id mockfilteredUser = OCMPartialMock(filteredUser);
197233
[[[mockfilteredUser stub] andReturn:testIdentities] userIdentities];
198234

199-
MPKitRokt *kit = [[MPKitRokt alloc] init];
200-
[kit addIdentityAttributes:passedAttributes filteredUser:filteredUser];
235+
[MPKitRokt addIdentityAttributes:passedAttributes filteredUser:filteredUser];
201236

202237
XCTAssertEqualObjects(passedAttributes[@"customerid"], @"testCustomerID");
203238
XCTAssertEqualObjects(passedAttributes[@"email"], @"testEmail@gmail.com");
@@ -259,8 +294,7 @@ - (void)testAddIdentityAttributesWithExistingAttributes {
259294
id mockfilteredUser = OCMPartialMock(filteredUser);
260295
[[[mockfilteredUser stub] andReturn:testIdentities] userIdentities];
261296

262-
MPKitRokt *kit = [[MPKitRokt alloc] init];
263-
[kit addIdentityAttributes:passedAttributes filteredUser:filteredUser];
297+
[MPKitRokt addIdentityAttributes:passedAttributes filteredUser:filteredUser];
264298

265299
XCTAssertEqualObjects(passedAttributes[@"foo"], @"bar");
266300
XCTAssertEqualObjects(passedAttributes[@"customerid"], @"testCustomerID");

0 commit comments

Comments
 (0)