Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 158 additions & 0 deletions UnitTests/MPRoktTests.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
#import <XCTest/XCTest.h>
#import <OCMock/OCMock.h>
#import "MParticle.h"
#import "MPKitContainer.h"
#import "MPForwardQueueParameters.h"

@interface MPRokt (Testing)
@end

@interface MPRoktTests : XCTestCase
@property (nonatomic, strong) MPRokt *rokt;
@end

@implementation MPRoktTests

- (void)setUp {
[super setUp];
self.rokt = [[MPRokt alloc] init];
}

- (void)tearDown {
self.rokt = nil;
[super tearDown];
}

- (void)testSelectPlacementsSimpleWithValidParameters {
id mockInstance = OCMClassMock([MParticle class]);
id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]);
[[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE];
[[[mockInstance stub] andReturn:mockInstance] sharedInstance];

// Set up test parameters
NSString *viewName = @"testView";
NSDictionary *attributes = @{@"key": @"value"};

// Set up expectations for kit container
XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for async operation"];
SEL roktSelector = @selector(executeWithViewName:attributes:placements:onLoad:onUnLoad:onShouldShowLoadingIndicator:onShouldHideLoadingIndicator:onEmbeddedSizeChange:filteredUser:);
OCMExpect([mockContainer forwardSDKCall:roktSelector
event:nil
parameters:[OCMArg checkWithBlock:^BOOL(MPForwardQueueParameters *params) {
XCTAssertEqualObjects(params[0], viewName);
XCTAssertEqualObjects(params[1], attributes);
XCTAssertNil(params[2]);
XCTAssertNil(params[3]);
XCTAssertNil(params[4]);
XCTAssertNil(params[5]);
XCTAssertNil(params[6]);
XCTAssertNil(params[7]);
return true;
}]
messageType:MPMessageTypeEvent
userInfo:nil]).andDo(^(NSInvocation *invocation) {
[expectation fulfill];
});

// Execute method
[self.rokt selectPlacements:viewName
attributes:attributes];

// Wait for async operation
[self waitForExpectationsWithTimeout:1.0 handler:nil];

// Verify
OCMVerifyAll(mockContainer);
}

- (void)testSelectPlacementsExpandedWithValidParameters {
id mockInstance = OCMClassMock([MParticle class]);
id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]);
[[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE];
[[[mockInstance stub] andReturn:mockInstance] sharedInstance];

// Set up test parameters
NSString *viewName = @"testView";
NSDictionary *attributes = @{@"key": @"value"};
NSDictionary *placements = @{@"placement": @"test"};
void (^onLoad)(void) = ^{};
void (^onUnLoad)(void) = ^{};
void (^onShouldShowLoadingIndicator)(void) = ^{};
void (^onShouldHideLoadingIndicator)(void) = ^{};
void (^onEmbeddedSizeChange)(NSString *, CGFloat) = ^(NSString *p, CGFloat s){};

// Set up expectations for kit container
XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for async operation"];
SEL roktSelector = @selector(executeWithViewName:attributes:placements:onLoad:onUnLoad:onShouldShowLoadingIndicator:onShouldHideLoadingIndicator:onEmbeddedSizeChange:filteredUser:);
OCMExpect([mockContainer forwardSDKCall:roktSelector
event:nil
parameters:[OCMArg checkWithBlock:^BOOL(MPForwardQueueParameters *params) {
XCTAssertEqualObjects(params[0], viewName);
XCTAssertEqualObjects(params[1], attributes);
XCTAssertEqualObjects(params[2], placements);
XCTAssertTrue(params[3] != nil);
XCTAssertTrue(params[4] != nil);
XCTAssertTrue(params[5] != nil);
XCTAssertTrue(params[6] != nil);
XCTAssertTrue(params[7] != nil);
return true;
}]
messageType:MPMessageTypeEvent
userInfo:nil]).andDo(^(NSInvocation *invocation) {
[expectation fulfill];
});

// Execute method
[self.rokt selectPlacements:viewName
attributes:attributes
placements:placements
onLoad:onLoad
onUnLoad:onUnLoad
onShouldShowLoadingIndicator:onShouldShowLoadingIndicator
onShouldHideLoadingIndicator:onShouldHideLoadingIndicator
onEmbeddedSizeChange:onEmbeddedSizeChange];

// Wait for async operation
[self waitForExpectationsWithTimeout:1.0 handler:nil];

// Verify
OCMVerifyAll(mockContainer);
}

- (void)testSelectPlacementsExpandedWithNilParameters {
id mockInstance = OCMClassMock([MParticle class]);
id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]);
[[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE];
[[[mockInstance stub] andReturn:mockInstance] sharedInstance];

// Execute method with nil parameters
[self.rokt selectPlacements:nil
attributes:nil
placements:nil
onLoad:nil
onUnLoad:nil
onShouldShowLoadingIndicator:nil
onShouldHideLoadingIndicator:nil
onEmbeddedSizeChange:nil];

// Wait for async operation
XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for async operation"];

// Verify the call is still forwarded with nil parameters
SEL roktSelector = @selector(executeWithViewName:attributes:placements:onLoad:onUnLoad:onShouldShowLoadingIndicator:onShouldHideLoadingIndicator:onEmbeddedSizeChange:filteredUser:);
OCMExpect([mockContainer forwardSDKCall:roktSelector
event:nil
parameters:[OCMArg any]
messageType:MPMessageTypeEvent
userInfo:nil]).andDo(^(NSInvocation *invocation) {
[expectation fulfill];
});

// Wait for async operation
[self waitForExpectationsWithTimeout:1.0 handler:nil];

// Verify
OCMVerifyAll(mockContainer);
}

@end
26 changes: 16 additions & 10 deletions mParticle-Apple-SDK.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 53;
objectVersion = 54;
objects = {

/* Begin PBXBuildFile section */
Expand Down Expand Up @@ -460,17 +460,19 @@
53E20DC82CBFFCD200146A97 /* NSArray+MPCaseInsensitiveTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E20DC62CBFFCD200146A97 /* NSArray+MPCaseInsensitiveTests.swift */; };
53FDD1BD2AE871AF003D5FA1 /* MPIHasher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FDD1BC2AE871AF003D5FA1 /* MPIHasher.swift */; };
53FDD1BE2AE871AF003D5FA1 /* MPIHasher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FDD1BC2AE871AF003D5FA1 /* MPIHasher.swift */; };
7E15B2062D94617900C1FF3E /* MPRoktTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E15B2052D94617900C1FF3E /* MPRoktTests.m */; };
7E15B2072D94617900C1FF3E /* MPRoktTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E15B2052D94617900C1FF3E /* MPRoktTests.m */; };
D30CD0CB2CFF5FB100F5148A /* MPStateMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0629CDFB1F00E7489F /* MPStateMachine.h */; settings = {ATTRIBUTES = (Public, ); }; };
D33C8B332B8510C20012EDFD /* MPAudience.h in Headers */ = {isa = PBXBuildFile; fileRef = D33C8B312B8510C20012EDFD /* MPAudience.h */; settings = {ATTRIBUTES = (Public, ); }; };
D33C8B342B8510C20012EDFD /* MPAudience.h in Headers */ = {isa = PBXBuildFile; fileRef = D33C8B312B8510C20012EDFD /* MPAudience.h */; settings = {ATTRIBUTES = (Public, ); }; };
D33C8B352B8510C20012EDFD /* MPAudience.m in Sources */ = {isa = PBXBuildFile; fileRef = D33C8B322B8510C20012EDFD /* MPAudience.m */; };
D33C8B362B8510C20012EDFD /* MPAudience.m in Sources */ = {isa = PBXBuildFile; fileRef = D33C8B322B8510C20012EDFD /* MPAudience.m */; };
D34286092D3806E600FEC2C8 /* MPUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34286082D3806CF00FEC2C8 /* MPUserDefaults.swift */; };
D342860A2D3806E600FEC2C8 /* MPUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34286082D3806CF00FEC2C8 /* MPUserDefaults.swift */; };
D342860F2D419CB800FEC2C8 /* MPUploadSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D342860E2D419CA700FEC2C8 /* MPUploadSettings.swift */; };
D34286102D419CB800FEC2C8 /* MPUploadSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D342860E2D419CA700FEC2C8 /* MPUploadSettings.swift */; };
D356E0242CFE08ED0020898D /* MPResponseConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D356E0232CFE08ED0020898D /* MPResponseConfig.swift */; };
D356E0252CFE08ED0020898D /* MPResponseConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D356E0232CFE08ED0020898D /* MPResponseConfig.swift */; };
D33C8B332B8510C20012EDFD /* MPAudience.h in Headers */ = {isa = PBXBuildFile; fileRef = D33C8B312B8510C20012EDFD /* MPAudience.h */; settings = {ATTRIBUTES = (Public, ); }; };
D33C8B342B8510C20012EDFD /* MPAudience.h in Headers */ = {isa = PBXBuildFile; fileRef = D33C8B312B8510C20012EDFD /* MPAudience.h */; settings = {ATTRIBUTES = (Public, ); }; };
D33C8B352B8510C20012EDFD /* MPAudience.m in Sources */ = {isa = PBXBuildFile; fileRef = D33C8B322B8510C20012EDFD /* MPAudience.m */; };
D33C8B362B8510C20012EDFD /* MPAudience.m in Sources */ = {isa = PBXBuildFile; fileRef = D33C8B322B8510C20012EDFD /* MPAudience.m */; };
D3724C192AE02AF60074CD67 /* mParticle_Apple_SDK_NoLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = D3724C182AE02AF60074CD67 /* mParticle_Apple_SDK_NoLocation.h */; settings = {ATTRIBUTES = (Public, ); }; };
D3961CD62CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3961CD52CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift */; };
D3961CD72CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3961CD52CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift */; };
Expand Down Expand Up @@ -761,11 +763,12 @@
53B33E892A4606CD00CC8A19 /* MPSideloadedKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPSideloadedKit.swift; sourceTree = "<group>"; };
53E20DC62CBFFCD200146A97 /* NSArray+MPCaseInsensitiveTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSArray+MPCaseInsensitiveTests.swift"; sourceTree = "<group>"; };
53FDD1BC2AE871AF003D5FA1 /* MPIHasher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPIHasher.swift; sourceTree = "<group>"; };
7E15B2052D94617900C1FF3E /* MPRoktTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPRoktTests.m; sourceTree = "<group>"; };
D33C8B312B8510C20012EDFD /* MPAudience.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPAudience.h; sourceTree = "<group>"; };
D33C8B322B8510C20012EDFD /* MPAudience.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPAudience.m; sourceTree = "<group>"; };
D34286082D3806CF00FEC2C8 /* MPUserDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPUserDefaults.swift; sourceTree = "<group>"; };
D342860E2D419CA700FEC2C8 /* MPUploadSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPUploadSettings.swift; sourceTree = "<group>"; };
D356E0232CFE08ED0020898D /* MPResponseConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPResponseConfig.swift; sourceTree = "<group>"; };
D33C8B312B8510C20012EDFD /* MPAudience.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPAudience.h; sourceTree = "<group>"; };
D33C8B322B8510C20012EDFD /* MPAudience.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPAudience.m; sourceTree = "<group>"; };
D3724C182AE02AF60074CD67 /* mParticle_Apple_SDK_NoLocation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mParticle_Apple_SDK_NoLocation.h; sourceTree = "<group>"; };
D3961CD52CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSArray+MPCaseInsensitive.swift"; sourceTree = "<group>"; };
D3961CDD2CC0B7E4003B3194 /* NSString+MPPercentEscape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSString+MPPercentEscape.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1088,6 +1091,7 @@
53A79B4A29CDFB1F00E7489F /* Kits */ = {
isa = PBXGroup;
children = (
53A79B5F29CDFB1F00E7489F /* MPKitConfiguration.h */,
53A79B4B29CDFB1F00E7489F /* MPDataPlanFilter.m */,
53A79B4C29CDFB1F00E7489F /* MPKitRegister.m */,
53A79B4D29CDFB1F00E7489F /* MPKitExecStatus.m */,
Expand All @@ -1107,7 +1111,6 @@
53A79B5C29CDFB1F00E7489F /* MPKitAPI.m */,
53A79B5D29CDFB1F00E7489F /* MPForwardQueueItem.m */,
53A79B5E29CDFB1F00E7489F /* MPKitActivity.h */,
53A79B5F29CDFB1F00E7489F /* MPKitConfiguration.h */,
53A79B6029CDFB1F00E7489F /* MPKitFilter.h */,
53A79B6129CDFB1F00E7489F /* MPBaseProjection.h */,
53B33E892A4606CD00CC8A19 /* MPSideloadedKit.swift */,
Expand Down Expand Up @@ -1248,6 +1251,7 @@
53A79CB529CE019F00E7489F /* MPAppNotificationHandlerTests.m */,
53A79CB629CE019F00E7489F /* MPKitRegisterTests.m */,
53A79CB729CE019F00E7489F /* HasherTests.m */,
7E15B2052D94617900C1FF3E /* MPRoktTests.m */,
531BCF392B28A83E00F5C573 /* MPIdentityCachingTests.m */,
);
path = UnitTests;
Expand Down Expand Up @@ -1321,9 +1325,9 @@
53A79BFB29CDFB2100E7489F /* MPAppDelegateProxy.h in Headers */,
53A79B9929CDFB2000E7489F /* MPIConstants.h in Headers */,
53A79B7129CDFB2000E7489F /* MPBackendController.h in Headers */,
53A79C1D29CDFB2100E7489F /* MPKitConfiguration.h in Headers */,
53A79B7929CDFB2000E7489F /* MPConnectorResponseProtocol.h in Headers */,
53A79B7C29CDFB2000E7489F /* MPConnectorFactoryProtocol.h in Headers */,
53A79C1D29CDFB2100E7489F /* MPKitConfiguration.h in Headers */,
53A79B7D29CDFB2000E7489F /* MPNetworkCommunication.h in Headers */,
53A79B7F29CDFB2000E7489F /* MPURL.h in Headers */,
53A79B8829CDFB2000E7489F /* MPDataModelAbstract.h in Headers */,
Expand Down Expand Up @@ -1410,11 +1414,11 @@
53A79D2A29CE23F700E7489F /* MPAppDelegateProxy.h in Headers */,
53A79D2C29CE23F700E7489F /* MPIConstants.h in Headers */,
53A79D2E29CE23F700E7489F /* MPBackendController.h in Headers */,
53A79D2F29CE23F700E7489F /* MPKitConfiguration.h in Headers */,
53A79D3029CE23F700E7489F /* MPConnectorResponseProtocol.h in Headers */,
53A79D3229CE23F700E7489F /* MPConnectorFactoryProtocol.h in Headers */,
53A79D3329CE23F700E7489F /* MPNetworkCommunication.h in Headers */,
53A79D3429CE23F700E7489F /* MPURL.h in Headers */,
53A79D2F29CE23F700E7489F /* MPKitConfiguration.h in Headers */,
53A79D3529CE23F700E7489F /* MPDataModelAbstract.h in Headers */,
53A79D3629CE23F700E7489F /* MPNetworkPerformance.h in Headers */,
53A79D3729CE23F700E7489F /* MPIntegrationAttributes.h in Headers */,
Expand Down Expand Up @@ -1670,6 +1674,7 @@
534CD29429CE2CE1008452B3 /* MPKitContainerTests.m in Sources */,
534CD29529CE2CE1008452B3 /* MPBase_Attribute_Event_ProjectionTests.m in Sources */,
534CD29629CE2CE1008452B3 /* MPConsumerInfoTests.m in Sources */,
7E15B2062D94617900C1FF3E /* MPRoktTests.m in Sources */,
534CD29729CE2CE1008452B3 /* MPURLRequestBuilderTests.m in Sources */,
534CD29829CE2CE1008452B3 /* MPForwardQueueItemTests.m in Sources */,
534CD29929CE2CE1008452B3 /* MPDateFormatterTests.m in Sources */,
Expand Down Expand Up @@ -1842,6 +1847,7 @@
53A79CD529CE019F00E7489F /* MPKitContainerTests.m in Sources */,
53A79CBC29CE019F00E7489F /* MPBase_Attribute_Event_ProjectionTests.m in Sources */,
53A79CEA29CE019F00E7489F /* MPConsumerInfoTests.m in Sources */,
7E15B2072D94617900C1FF3E /* MPRoktTests.m in Sources */,
53A79CDD29CE019F00E7489F /* MPURLRequestBuilderTests.m in Sources */,
53A79CDE29CE019F00E7489F /* MPForwardQueueItemTests.m in Sources */,
53A79CDF29CE019F00E7489F /* MPDateFormatterTests.m in Sources */,
Expand Down
11 changes: 11 additions & 0 deletions mParticle-Apple-SDK/Include/MPKitProtocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,17 @@
- (nullable NSString *)surveyURLWithUserAttributes:(nonnull NSDictionary *)userAttributes;
- (BOOL) shouldDelayMParticleUpload;
- (nonnull NSArray<MPForwardRecord *> *)logBatch:(nonnull NSDictionary *)batch;

#pragma mark First Party Kits
- (nonnull MPKitExecStatus *)executeWithViewName:(NSString * _Nullable)viewName
attributes:(NSDictionary<NSString *, NSString *> * _Nonnull)attributes
placements:(NSDictionary<NSString *, id> * _Nullable)placements
onLoad:(void (^ _Nullable)(void))onLoad
onUnLoad:(void (^ _Nullable)(void))onUnLoad
onShouldShowLoadingIndicator:(void (^ _Nullable)(void))onShouldShowLoadingIndicator
onShouldHideLoadingIndicator:(void (^ _Nullable)(void))onShouldHideLoadingIndicator
onEmbeddedSizeChange:(void (^ _Nullable)(NSString * _Nonnull, CGFloat))onEmbeddedSizeChange
filteredUser:(FilteredMParticleUser * _Nonnull)filteredUser;
@end

#endif
22 changes: 22 additions & 0 deletions mParticle-Apple-SDK/Include/mParticle.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,22 @@ NS_ASSUME_NONNULL_BEGIN

@end

@interface MPRokt : NSObject

- (void)selectPlacements:(NSString *)identifier
attributes:(NSDictionary<NSString *, NSString *> * _Nullable)attributes;

- (void)selectPlacements:(NSString *)identifier
attributes:(NSDictionary<NSString *, NSString *> * _Nullable)attributes
placements:(NSDictionary<NSString *, id> * _Nullable)placements
onLoad:(void (^ _Nullable)(void))onLoad
onUnLoad:(void (^ _Nullable)(void))onUnLoad
onShouldShowLoadingIndicator:(void (^ _Nullable)(void))onShouldShowLoadingIndicator
onShouldHideLoadingIndicator:(void (^ _Nullable)(void))onShouldHideLoadingIndicator
onEmbeddedSizeChange:(void (^ _Nullable)(NSString * _Nonnull, CGFloat))onEmbeddedSizeChange;

@end

/**
Allows you to override the default HTTPS hosts and certificates used by the SDK.
*/
Expand Down Expand Up @@ -485,6 +501,12 @@ Defaults to false. Prevents the eventsHost above from overwriting the alias endp
*/
@property (nonatomic, strong, readonly) MPIdentityApi * identity;

/**
This property is an instance of MPRokt. It allows you to access the Rokt SDK through mParticle
@see MPRokt
*/
@property (nonatomic, strong, readonly) MPRokt * rokt;

/**
If set to YES development logs will be output to the
console, if set to NO the development logs will be suppressed. This property works in conjunction with
Expand Down
Loading