@@ -95,7 +95,9 @@ - (void)setUp {
9595- (void )tearDown {
9696 // Wait for IAM viewDidLoad if available to not conflict with other tests
9797 [UnitTestCommonMethods runBackgroundThreads ];
98-
98+ [OneSignal setInAppMessageClickHandler: nil ];
99+ [OneSignal pauseInAppMessages: true ];
100+
99101 OneSignalOverrider.shouldOverrideSessionLaunchTime = false ;
100102
101103 [OSMessagingController.sharedInstance resetState ];
@@ -877,6 +879,98 @@ - (void)testIAMClickedLaunchesOutcomeWithValueAPIV2Request {
877879 XCTAssertEqual (outcomeWeight, [[OneSignalClientOverrider.lastHTTPRequest objectForKey: @" weight" ] intValue ]);
878880}
879881
882+ - (void )testIAMClickedLaunchesClickHandlerSendDirectOutcomeV2Request {
883+ [self setOutcomesParamsEnabled ];
884+ [self setOutcomesV2Enabled ];
885+
886+ let firstTrigger = [OSTrigger customTriggerWithProperty: @" testProp" withOperator: OSTriggerOperatorTypeExists withValue: nil ];
887+
888+ OSInAppMessage * message = [OSInAppMessageTestHelper testMessageWithTriggers: @[@[firstTrigger]]];
889+
890+ [self initOneSignalWithInAppMessage: message];
891+
892+ XCTAssertEqual (0 , OSMessagingControllerOverrider.messageDisplayQueue .count );
893+
894+ __block OSInAppMessageAction *actionReceived = nil ;
895+ id inAppMessagingActionClickBlock = ^(OSInAppMessageAction *action) {
896+ actionReceived = action;
897+
898+ [OneSignal sendOutcome: @" test" ];
899+ [UnitTestCommonMethods runBackgroundThreads ];
900+
901+ // The action should cause an "outcome" API request
902+ XCTAssertEqualObjects (OneSignalClientOverrider.lastUrl , @" https://api.onesignal.com/outcomes/measure_sources" );
903+ XCTAssertEqualObjects (OneSignalClientOverrider.lastHTTPRequestType , NSStringFromClass ([OSRequestSendOutcomesV2ToServer class ]));
904+ id source = [OneSignalClientOverrider.lastHTTPRequest objectForKey: @" sources" ];
905+ id directBody = [source objectForKey: @" direct" ];
906+ id indirectBody = [source objectForKey: @" indirect" ];
907+ id iamIds = [directBody objectForKey: @" in_app_message_ids" ];
908+ XCTAssertEqual (1 , [iamIds count ]);
909+ XCTAssertNil (indirectBody);
910+ XCTAssertNil ([OneSignalClientOverrider.lastHTTPRequest objectForKey: @" weight" ]);
911+ };
912+ [OneSignal setInAppMessageClickHandler: inAppMessagingActionClickBlock];
913+
914+ [OneSignal addTrigger: @" testProp" withValue: @2 ];
915+ [UnitTestCommonMethods runBackgroundThreads ];
916+ // the message should now be displayed
917+ // simulate a button press (action) on the inapp message
918+ let action = [OSInAppMessageAction instanceWithJson: OSInAppMessageTestHelper.testActionJson];
919+ [OSMessagingController.sharedInstance messageViewDidSelectAction: message withAction: action];
920+
921+ XCTAssertNotNil (actionReceived);
922+ }
923+
924+ - (void )testIAMClickedLaunchesClickHandlerDismissIAMSendIndirectOutcomeV2Request {
925+ [OneSignal pauseInAppMessages: false ];
926+ [self setOutcomesParamsEnabled ];
927+ [self setOutcomesV2Enabled ];
928+
929+ let firstTrigger = [OSTrigger customTriggerWithProperty: @" testProp" withOperator: OSTriggerOperatorTypeExists withValue: nil ];
930+
931+ OSInAppMessage * message = [OSInAppMessageTestHelper testMessageWithTriggers: @[@[firstTrigger]]];
932+
933+ [self initOneSignalWithInAppMessage: message];
934+
935+ XCTAssertEqual (0 , OSMessagingControllerOverrider.messageDisplayQueue .count );
936+
937+ // Check no influence id saved
938+ NSArray *lastReceivedIds = [[[[OSTrackerFactory alloc ] init ] iamChannelTracker ] lastReceivedIds ];
939+ XCTAssertEqual (lastReceivedIds.count , 0 );
940+
941+ __block OSInAppMessageAction *actionReceived = nil ;
942+ id inAppMessagingActionClickBlock = ^(OSInAppMessageAction *action) {
943+ actionReceived = action;
944+ };
945+ [OneSignal setInAppMessageClickHandler: inAppMessagingActionClickBlock];
946+
947+ [OneSignal addTrigger: @" testProp" withValue: @2 ];
948+ [UnitTestCommonMethods runBackgroundThreads ];
949+
950+ // the message should now be displayed
951+ // simulate a button press (action) on the inapp message
952+ let action = [OSInAppMessageAction instanceWithJson: OSInAppMessageTestHelper.testActionJson];
953+ [OSMessagingController.sharedInstance messageViewDidSelectAction: message withAction: action];
954+
955+ XCTAssertNotNil (actionReceived);
956+
957+ [OSMessagingControllerOverrider dismissCurrentMessage ];
958+
959+ [OneSignal sendOutcome: @" test" ];
960+ [UnitTestCommonMethods runBackgroundThreads ];
961+
962+ // The action should cause an "outcome" API request
963+ XCTAssertEqualObjects (OneSignalClientOverrider.lastUrl , @" https://api.onesignal.com/outcomes/measure_sources" );
964+ XCTAssertEqualObjects (OneSignalClientOverrider.lastHTTPRequestType , NSStringFromClass ([OSRequestSendOutcomesV2ToServer class ]));
965+ id source = [OneSignalClientOverrider.lastHTTPRequest objectForKey: @" sources" ];
966+ id directBody = [source objectForKey: @" direct" ];
967+ id indirectBody = [source objectForKey: @" indirect" ];
968+ id iamIds = [indirectBody objectForKey: @" in_app_message_ids" ];
969+ XCTAssertEqual (1 , [iamIds count ]);
970+ XCTAssertNil (directBody);
971+ XCTAssertNil ([OneSignalClientOverrider.lastHTTPRequest objectForKey: @" weight" ]);
972+ }
973+
880974- (void )testIAMClickedLaunchesMultipleOutcomesAPIRequest {
881975 [self setOutcomesParamsEnabled ];
882976
0 commit comments