@@ -354,3 +354,67 @@ extension CheckoutAPIServiceTests {
354354 }
355355 }
356356}
357+
358+ // Risk SDK Timeout Recovery Tests
359+ extension CheckoutAPIServiceTests {
360+ func testWhenRiskSDKCallsCompletionThenFramesReturnsSuccess( ) {
361+ let card = StubProvider . createCard ( )
362+ let tokenRequest = StubProvider . createTokenRequest ( )
363+ let requestParameters = StubProvider . createRequestParameters ( )
364+ let tokenResponse = StubProvider . createTokenResponse ( )
365+ let tokenDetails = StubProvider . createTokenDetails ( )
366+
367+ stubTokenRequestFactory. createToReturn = . success( tokenRequest)
368+ stubRequestFactory. createToReturn = . success( requestParameters)
369+ stubTokenDetailsFactory. createToReturn = tokenDetails
370+
371+ var result : Result < TokenDetails , TokenisationError . TokenRequest > ?
372+ subject. createToken ( . card( card) ) { result = $0 }
373+ stubRequestExecutor. executeCalledWithCompletion ? ( . response( tokenResponse) , HTTPURLResponse ( ) )
374+
375+ XCTAssertEqual ( stubRisk. configureCalledCount, 1 )
376+ XCTAssertEqual ( stubRisk. publishDataCalledCount, 1 )
377+ XCTAssertEqual ( result, . success( tokenDetails) )
378+ }
379+
380+ func testWhenRiskSDKConfigureHangsThenFramesSDKCancelsWaitingRiskSDKAndCallsCompletionBlockAnywayAfterTimeout( ) {
381+ stubRisk. shouldConfigureFunctionCallCompletion = false // Configure function will hang forever before it calls its completion closure
382+ verifyRiskSDKTimeoutRecovery ( timeoutAddition: 1 , expectedConfigureCallCount: 1 , expectedPublishDataCallCount: 0 )
383+ }
384+
385+ func testWhenRiskSDKPublishHangsThenFramesSDKCancelsWaitingRiskSDKAndCallsCompletionBlockAnywayAfterTimeout( ) {
386+ stubRisk. shouldPublishFunctionCallCompletion = false // Publish data function will hang forever before it calls its completion closure
387+ verifyRiskSDKTimeoutRecovery ( timeoutAddition: 1 , expectedConfigureCallCount: 1 , expectedPublishDataCallCount: 1 )
388+ }
389+
390+ func verifyRiskSDKTimeoutRecovery( timeoutAddition: Double ,
391+ expectedConfigureCallCount: Int ,
392+ expectedPublishDataCallCount: Int ,
393+ file: StaticString = #file,
394+ line: UInt = #line) {
395+ let card = StubProvider . createCard ( )
396+ let tokenRequest = StubProvider . createTokenRequest ( )
397+ let tokenResponse = StubProvider . createTokenResponse ( )
398+ let requestParameters = StubProvider . createRequestParameters ( )
399+ let tokenDetails = StubProvider . createTokenDetails ( )
400+
401+ stubTokenRequestFactory. createToReturn = . success( tokenRequest)
402+ stubRequestFactory. createToReturn = . success( requestParameters)
403+ stubTokenDetailsFactory. createToReturn = tokenDetails
404+
405+ let expectation = self . expectation ( description: " Frames will time out awaiting Risk SDK result " )
406+
407+ var _: Result < TokenDetails , TokenisationError . TokenRequest > ?
408+ subject. createToken ( . card( card) ) {
409+
410+ XCTAssertEqual ( self . stubRisk. configureCalledCount, expectedConfigureCallCount, file: file, line: line)
411+ XCTAssertEqual ( self . stubRisk. publishDataCalledCount, expectedPublishDataCallCount, file: file, line: line)
412+ XCTAssertEqual ( $0, . success( tokenDetails) , file: file, line: line)
413+
414+ expectation. fulfill ( )
415+ }
416+ stubRequestExecutor. executeCalledWithCompletion ? ( . response( tokenResponse) , HTTPURLResponse ( ) )
417+
418+ waitForExpectations ( timeout: subject. timeoutInterval + timeoutAddition)
419+ }
420+ }
0 commit comments