@@ -354,3 +354,67 @@ extension CheckoutAPIServiceTests {
354
354
}
355
355
}
356
356
}
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