@@ -1422,6 +1422,64 @@ - (void)testIAMHTMLLoadWithDefaultLanguage {
14221422 XCTAssertTrue ([url containsString: OS_TEST_MESSAGE_ID]);
14231423}
14241424
1425+ - (void )testInAppMessageDisplayMultipleTimesSessionDurationTrigger {
1426+ [OneSignal pauseInAppMessages: NO ];
1427+ let trigger = [OSTrigger dynamicTriggerWithKind: OS_DYNAMIC_TRIGGER_KIND_SESSION_TIME withOperator: OSTriggerOperatorTypeGreaterThan withValue: @0.05 ];
1428+ let message = [OSInAppMessageTestHelper testMessageWithTriggers: @[@[trigger]] withRedisplayLimit: 5 delay: @30 ];
1429+ let registrationJson = [OSInAppMessageTestHelper testRegistrationJsonWithMessages: @[message.jsonRepresentation]];
1430+
1431+ // Init OneSignal IAM with redisplay
1432+ [self initOneSignalWithRegistrationJSON: registrationJson];
1433+
1434+ // No schedule should happen, IAM should evaluate to true
1435+ XCTAssertEqual (OSMessagingControllerOverrider.messageDisplayQueue .count , 1 );
1436+
1437+ // Dismiss IAM will make display quantity increase and last display time to change
1438+ [OSMessagingControllerOverrider dismissCurrentMessage ];
1439+ // Check IAMs was removed from queue
1440+ XCTAssertEqual (OSMessagingControllerOverrider.messageDisplayQueue .count , 0 );
1441+ // Check if data after dismiss is set correctly
1442+ XCTAssertEqual (OSMessagingControllerOverrider.messagesForRedisplay .count , 1 );
1443+ let displayQuantity = OSMessagingControllerOverrider.messagesForRedisplay .allValues [0 ].displayStats .displayQuantity ;
1444+ let displayTime = OSMessagingControllerOverrider.messagesForRedisplay .allValues [0 ].displayStats .lastDisplayTime ;
1445+ XCTAssertEqual (displayQuantity, 1 );
1446+ XCTAssertTrue (displayTime > 0 );
1447+
1448+ // 3. Kill the app and wait 31 seconds
1449+ [UnitTestCommonMethods backgroundApp ];
1450+ [UnitTestCommonMethods clearStateForAppRestart: self ];
1451+ [NSDateOverrider advanceSystemTimeBy: 31 ];
1452+ [UnitTestCommonMethods runBackgroundThreads ];
1453+
1454+ [OSInAppMessageTestHelper testRegistrationJsonWithMessages: @[message]];
1455+
1456+ // Init OneSignal IAM with redisplay
1457+ [UnitTestCommonMethods initOneSignalAndThreadWait ];
1458+
1459+ // No schedule should happen since session time period is very small, should evaluate to true on first run
1460+ // Wait for redisplay logic
1461+ let expectation = [self expectationWithDescription: @" wait for message to show" ];
1462+ expectation.expectedFulfillmentCount = 1 ;
1463+
1464+ dispatch_after (dispatch_time (DISPATCH_TIME_NOW, (int64_t )(1 * NSEC_PER_SEC)), dispatch_get_main_queue (), ^{
1465+ XCTAssertEqual (OSMessagingControllerOverrider.messageDisplayQueue .count , 1 );
1466+
1467+ [expectation fulfill ];
1468+ });
1469+
1470+ [self waitForExpectations: @[expectation] timeout: 1.5 ];
1471+
1472+ [OSMessagingControllerOverrider dismissCurrentMessage ];
1473+ // Check IAMs was removed from queue
1474+ XCTAssertEqual (OSMessagingControllerOverrider.messageDisplayQueue .count , 0 );
1475+ // Check if data after dismiss is set correctly
1476+ XCTAssertEqual (OSMessagingControllerOverrider.messagesForRedisplay .count , 1 );
1477+ let secondDisplayQuantity = OSMessagingControllerOverrider.messagesForRedisplay .allValues [0 ].displayStats .displayQuantity ;
1478+ let secondDisplayTime = OSMessagingControllerOverrider.messagesForRedisplay .allValues [0 ].displayStats .lastDisplayTime ;
1479+ XCTAssertEqual (secondDisplayQuantity, 2 );
1480+ XCTAssertTrue (secondDisplayTime - displayTime > 30 );
1481+ }
1482+
14251483// Helper method that adds an OSInAppMessage to the IAM messageDisplayQueue
14261484// Mock response JSON and initializes the OneSignal SDK
14271485- (void )initOneSignalWithInAppMessage : (OSInAppMessage *)message {
0 commit comments