Skip to content

Commit 422f442

Browse files
test: Add test coverage for logCommerceEvent and logEvent (#414)
* added test for logCommerceEvent when event is nil * full test coverage for logCommerceEvent * full test coverage for logEvent * added test for logCommerceEvent when event is nil * full test coverage for logCommerceEvent * full test coverage for logEvent * result of call with @BrandonStalnaker * remove unnecessary nil check from logCommerceEvent
1 parent 804edda commit 422f442

File tree

4 files changed

+231
-7
lines changed

4 files changed

+231
-7
lines changed

UnitTests/MParticle+PrivateMethods.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@
1212
- (void)startWithKeyCallback:(BOOL)firstRun options:(MParticleOptions * _Nonnull)options userDefaults:(id<MPUserDefaultsProtocol>)userDefaults;
1313
- (void)beginTimedEventCompletionHandler:(MPEvent *)event execStatus:(MPExecStatus)execStatus;
1414
- (void)logEventCallback:(MPEvent *)event execStatus:(MPExecStatus)execStatus;
15+
- (void)logEvent:(MPBaseEvent *)event;
1516
- (void)logCustomEvent:(MPEvent *)event;
1617
- (void)logScreenCallback:(MPEvent *)event execStatus:(MPExecStatus)execStatus;
1718
- (void)leaveBreadcrumbCallback:(MPEvent *)event execStatus:(MPExecStatus)execStatus;
1819
- (void)logErrorCallback:(NSDictionary<NSString *,id> * _Nullable)eventInfo execStatus:(MPExecStatus)execStatus message:(NSString *)message;
1920
- (void)logExceptionCallback:(NSException * _Nonnull)exception execStatus:(MPExecStatus)execStatus message:(NSString *)message topmostContext:(id _Nullable)topmostContext;
2021
- (void)logCrashCallback:(MPExecStatus)execStatus message:(NSString * _Nullable)message;
2122
- (void)logCommerceEventCallback:(MPCommerceEvent *)commerceEvent execStatus:(MPExecStatus)execStatus;
23+
- (void)logCommerceEvent:(MPCommerceEvent *)commerceEvent;
2224
- (void)logLTVIncreaseCallback:(MPEvent *)event execStatus:(MPExecStatus)execStatus;
2325
- (void)logNetworkPerformanceCallback:(MPExecStatus)execStatus;
2426
+ (void)setSharedInstance:(MParticle *)instance;

UnitTests/MParticleTestsSwift.swift

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -886,6 +886,105 @@ class MParticleTestsSwift: XCTestCase {
886886
#endif
887887
}
888888

889+
// MARK: - logEvent
890+
func testLogEventCalledLogCustomEvent() {
891+
let event = MPEvent(name: "test", type: .other)!
892+
mparticle.logEvent(event)
893+
wait(for: [listenerController.onAPICalledExpectation!], timeout: 0.1)
894+
XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logCustomEvent:")
895+
}
896+
897+
func testLogEventCalledLogCommerceEvent() {
898+
let commerceEvent = MPCommerceEvent(action: .purchase)!
899+
mparticle.logEvent(commerceEvent)
900+
wait(for: [listenerController.onAPICalledExpectation!], timeout: 0.1)
901+
XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logCommerceEvent:")
902+
}
903+
904+
func testLogEventWithFilterReturningNil_blocksEvent() {
905+
let event = MPBaseEvent(eventType: .other)!
906+
907+
let executor = ExecutorMock()
908+
mparticle.setExecutor(executor)
909+
910+
let backendController = MPBackendControllerMock()
911+
mparticle.backendController = backendController
912+
913+
let dataPlanFilter = MPDataPlanFilterMock()
914+
dataPlanFilter.transformEventForBaseEventReturnValue = nil
915+
mparticle.dataPlanFilter = dataPlanFilter
916+
917+
mparticle.logEvent(event)
918+
919+
// Verify listener was called
920+
XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logEvent:")
921+
XCTAssertTrue(listenerController.onAPICalledParameter1 === event)
922+
923+
// Verify backend was called
924+
XCTAssertTrue(backendController.logBaseEventCalled)
925+
XCTAssertTrue(backendController.logBaseEventEventParam === event)
926+
let completion = backendController.logBaseEventCompletionHandler!
927+
XCTAssertNotNil(completion)
928+
completion(event, .success)
929+
930+
// Verify executor usage
931+
XCTAssertTrue(executor.executeOnMessageQueueAsync)
932+
933+
// Verify filter transform event
934+
XCTAssertTrue(dataPlanFilter.transformEventForBaseEventCalled)
935+
XCTAssertTrue(dataPlanFilter.transformEventForBaseEventParam === event)
936+
937+
// Logger should record the blocked event message
938+
XCTAssertEqual(receivedMessage, "mParticle -> Blocked base event from kits: \(event)")
939+
}
940+
941+
func testLogBaseEventWithFilterReturningEvent_forwardsTransformedEvent() {
942+
let event = MPBaseEvent(eventType: .other)!
943+
let transformedEvent = MPBaseEvent(eventType: .addToCart)!
944+
945+
let executor = ExecutorMock()
946+
mparticle.setExecutor(executor)
947+
948+
let backendController = MPBackendControllerMock()
949+
mparticle.backendController = backendController
950+
951+
let dataPlanFilter = MPDataPlanFilterMock()
952+
dataPlanFilter.transformEventForBaseEventReturnValue = transformedEvent
953+
mparticle.dataPlanFilter = dataPlanFilter
954+
955+
let kitContainer = MPKitContainerMock()
956+
mparticle.setKitContainer(kitContainer)
957+
958+
mparticle.logEvent(event)
959+
960+
// Verify listener was called
961+
XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logEvent:")
962+
XCTAssertTrue(listenerController.onAPICalledParameter1 === event)
963+
964+
// Verify backend was called
965+
XCTAssertTrue(backendController.logBaseEventCalled)
966+
XCTAssertTrue(backendController.logBaseEventEventParam === event)
967+
let completion = backendController.logBaseEventCompletionHandler!
968+
XCTAssertNotNil(completion)
969+
completion(event, .success)
970+
971+
// Verify executor usage
972+
XCTAssertTrue(executor.executeOnMessageQueueAsync)
973+
XCTAssertTrue(executor.executeOnMainAsync)
974+
975+
// Verify filter transformed event
976+
XCTAssertTrue(dataPlanFilter.transformEventForBaseEventCalled)
977+
XCTAssertTrue(dataPlanFilter.transformEventForBaseEventParam === event)
978+
979+
// Verify kit container forwarded transformed event
980+
XCTAssertTrue(kitContainer.forwardSDKCallCalled)
981+
XCTAssertEqual(kitContainer.forwardSDKCallSelectorParam?.description, "logBaseEvent:")
982+
XCTAssertEqual(kitContainer.forwardSDKCallMessageTypeParam, .unknown)
983+
XCTAssertTrue(kitContainer.forwardSDKCallEventParam === transformedEvent)
984+
}
985+
986+
987+
// MARK: - logCustomEvent
889988

890989
func testLogCustomEventWithNilEvent_logsError() {
891990
mparticle.logCustomEvent(nil)
@@ -975,5 +1074,113 @@ class MParticleTestsSwift: XCTestCase {
9751074
XCTAssertEqual(kitContainer.forwardSDKCallMessageTypeParam, .event)
9761075
XCTAssertTrue(kitContainer.forwardSDKCallEventParam === transformedEvent)
9771076
}
1077+
1078+
// MARK: - logCommerceEvent
1079+
1080+
func testLogCommerceEvent_assignsTimestampWhenNil() {
1081+
let commerceEvent = MPCommerceEvent(action: .purchase)!
1082+
commerceEvent.setTimestamp(nil)
1083+
1084+
1085+
let executor = ExecutorMock()
1086+
mparticle.setExecutor(executor)
1087+
1088+
let backendController = MPBackendControllerMock()
1089+
mparticle.backendController = backendController
1090+
1091+
mparticle.logCommerceEvent(commerceEvent)
1092+
1093+
XCTAssertNotNil(commerceEvent.timestamp)
1094+
XCTAssertTrue(backendController.logCommerceEventCalled)
1095+
XCTAssertTrue(listenerController.onAPICalledParameter1 === commerceEvent)
1096+
XCTAssertTrue(executor.executeOnMessageQueueAsync)
1097+
}
1098+
1099+
1100+
func testLogCommerceEventWithFilterReturningNil_blocksEvent() {
1101+
let commerceEvent = MPCommerceEvent(eventType: .other)!
1102+
1103+
let executor = ExecutorMock()
1104+
mparticle.setExecutor(executor)
1105+
1106+
let backendController = MPBackendControllerMock()
1107+
mparticle.backendController = backendController
1108+
1109+
let dataPlanFilter = MPDataPlanFilterMock()
1110+
dataPlanFilter.transformEventForCommerceEventParam = nil
1111+
mparticle.dataPlanFilter = dataPlanFilter
1112+
1113+
mparticle.logCommerceEvent(commerceEvent)
1114+
1115+
// Verify event timestamp added
1116+
XCTAssertNotNil(commerceEvent.timestamp)
1117+
1118+
// Verify listener was called
1119+
XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logCommerceEvent:")
1120+
XCTAssertTrue(listenerController.onAPICalledParameter1 === commerceEvent)
1121+
1122+
// Verify backend was called
1123+
XCTAssertTrue(backendController.logCommerceEventCalled)
1124+
XCTAssertTrue(backendController.logCommerceEventParam === commerceEvent)
1125+
let completion = backendController.logCommerceEventCompletionHandler!
1126+
XCTAssertNotNil(completion)
1127+
completion(commerceEvent, .success)
1128+
1129+
// Verify executor usage
1130+
XCTAssertTrue(executor.executeOnMessageQueueAsync)
1131+
1132+
// Verify filter transform event
1133+
XCTAssertTrue(dataPlanFilter.transformEventForCommerceEventCalled)
1134+
XCTAssertTrue(dataPlanFilter.transformEventForCommerceEventParam === commerceEvent)
1135+
1136+
// Logger should record the blocked event message
1137+
XCTAssertEqual(receivedMessage, "mParticle -> Blocked commerce event from kits: \(commerceEvent)")
1138+
}
1139+
1140+
1141+
func testLogCommerceEventWithFilterReturningEvent_forwardsTransformedEvent() {
1142+
let commerceEvent = MPCommerceEvent(eventType: .other)!
1143+
let transformedCommerceEvent = MPCommerceEvent(eventType: .viewDetail)!
1144+
1145+
let executor = ExecutorMock()
1146+
mparticle.setExecutor(executor)
1147+
1148+
let backendController = MPBackendControllerMock()
1149+
mparticle.backendController = backendController
1150+
1151+
let dataPlanFilter = MPDataPlanFilterMock()
1152+
dataPlanFilter.transformEventForCommerceEventReturnValue = transformedCommerceEvent
1153+
mparticle.dataPlanFilter = dataPlanFilter
1154+
1155+
let kitContainer = MPKitContainerMock()
1156+
mparticle.setKitContainer(kitContainer)
1157+
1158+
mparticle.logCommerceEvent(commerceEvent)
1159+
1160+
// Verify event timestamp added
1161+
XCTAssertNotNil(commerceEvent.timestamp)
1162+
1163+
// Verify listener was called
1164+
XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logCommerceEvent:")
1165+
XCTAssertTrue(listenerController.onAPICalledParameter1 === commerceEvent)
1166+
1167+
// Verify backend was called
1168+
XCTAssertTrue(backendController.logCommerceEventCalled)
1169+
XCTAssertTrue(backendController.logCommerceEventParam === commerceEvent)
1170+
let completion = backendController.logCommerceEventCompletionHandler!
1171+
XCTAssertNotNil(completion)
1172+
completion(commerceEvent, .success)
1173+
1174+
// Verify executor usage
1175+
XCTAssertTrue(executor.executeOnMessageQueueAsync)
1176+
1177+
// Verify filter transformed event
1178+
XCTAssertTrue(dataPlanFilter.transformEventForCommerceEventCalled)
1179+
XCTAssertTrue(dataPlanFilter.transformEventForCommerceEventParam === commerceEvent)
1180+
1181+
// Verify kit container forwarded transformed event
1182+
XCTAssertTrue(kitContainer.forwardCommerceEventCallCalled)
1183+
XCTAssertTrue(kitContainer.forwardCommerceEventCallCommerceEventParam === transformedCommerceEvent)
1184+
}
9781185

9791186
}

UnitTests/Mocks/MPDataPlanFilterMock.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import mParticle_Apple_SDK_NoLocation
55
import mParticle_Apple_SDK
66
#endif
77

8+
@objcMembers
89
class MPDataPlanFilterMock: NSObject, MPDataPlanFilterProtocol {
910
var isBlockedUserIdentityTypeCalled = false
1011
var isBlockedUserIdentityTypeUserIdentityTypeParam: MPIdentity?
@@ -45,4 +46,24 @@ class MPDataPlanFilterMock: NSObject, MPDataPlanFilterProtocol {
4546
transformEventForScreenEventScreenEventParam = screenEvent
4647
return transformEventForScreenEventReturnValue
4748
}
49+
50+
var transformEventForCommerceEventCalled = false
51+
var transformEventForCommerceEventParam: MPCommerceEvent?
52+
var transformEventForCommerceEventReturnValue: MPCommerceEvent?
53+
54+
func transformEvent(forCommerceEvent commerceEvent: MPCommerceEvent) -> MPCommerceEvent? {
55+
transformEventForCommerceEventCalled = true
56+
transformEventForCommerceEventParam = commerceEvent
57+
return transformEventForCommerceEventReturnValue
58+
}
59+
60+
var transformEventForBaseEventCalled = false
61+
var transformEventForBaseEventParam: MPBaseEvent?
62+
var transformEventForBaseEventReturnValue: MPBaseEvent?
63+
64+
func transformEvent(forBaseEvent baseEvent: MPBaseEvent) -> MPBaseEvent? {
65+
transformEventForBaseEventCalled = true
66+
transformEventForBaseEventParam = baseEvent
67+
return transformEventForBaseEventReturnValue
68+
}
4869
}

mParticle-Apple-SDK/mParticle.m

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -799,9 +799,7 @@ - (MPEvent *)eventWithName:(NSString *)eventName {
799799
}
800800

801801
- (void)logEvent:(MPBaseEvent *)event {
802-
if (event == nil) {
803-
[logger error:@"Cannot log nil event!"];
804-
} else if ([event isKindOfClass:[MPEvent class]]) {
802+
if ([event isKindOfClass:[MPEvent class]]) {
805803
[self logCustomEvent:(MPEvent *)event];
806804
} else if ([event isKindOfClass:[MPCommerceEvent class]]) {
807805
#pragma clang diagnostic push
@@ -1188,10 +1186,6 @@ - (void)logCommerceEventCallback:(MPCommerceEvent *)commerceEvent execStatus:(MP
11881186
}
11891187

11901188
- (void)logCommerceEvent:(MPCommerceEvent *)commerceEvent {
1191-
if (commerceEvent == nil) {
1192-
[logger error:@"Cannot log nil commerce event!"];
1193-
return;
1194-
}
11951189
if (!commerceEvent.timestamp) {
11961190
commerceEvent.timestamp = [NSDate date];
11971191
}

0 commit comments

Comments
 (0)