Browse Source

Add tests to show that failed transactions are not finished by SwiftyStoreKit when completeTransactions is called with atomically: false

Andrea Bizzotto 7 years ago
parent
commit
f1b01f7981
1 changed files with 63 additions and 4 deletions
  1. 63 4
      SwiftyStoreKitTests/CompleteTransactionsControllerTests.swift

+ 63 - 4
SwiftyStoreKitTests/CompleteTransactionsControllerTests.swift

@@ -28,7 +28,7 @@ import StoreKit
 
 class CompleteTransactionsControllerTests: XCTestCase {
 
-    func testProcessTransactions_when_oneRestoredTransaction_then_finishesTransaction_callsCallback_noRemainingTransactions() {
+    func testProcessTransactions_when_atomically_oneRestoredTransaction_then_finishesTransaction_callsCallback_noRemainingTransactions() {
 
         let productIdentifier = "com.SwiftyStoreKit.product1"
         let testProduct = TestProduct(productIdentifier: productIdentifier)
@@ -56,7 +56,65 @@ class CompleteTransactionsControllerTests: XCTestCase {
         XCTAssertEqual(spy.finishTransactionCalledCount, 1)
     }
 
-    func testProcessTransactions_when_oneTransactionForEachState_then_finishesTransactions_callsCallback_onePurchasingTransactionRemaining() {
+    func testProcessTransactions_when_atomically_oneFailedTransaction_then_finishesTransaction_callsCallback_noRemainingTransactions_noNeedsFinishTransactions() {
+        
+        let productIdentifier = "com.SwiftyStoreKit.product1"
+        let testProduct = TestProduct(productIdentifier: productIdentifier)
+        
+        let transaction = TestPaymentTransaction(payment: SKPayment(product: testProduct), transactionState: .failed)
+        
+        var callbackCalled = false
+        let completeTransactions = CompleteTransactions(atomically: true) { purchases in
+            callbackCalled = true
+            XCTAssertEqual(purchases.count, 1)
+            let purchase = purchases.first!
+            XCTAssertFalse(purchase.needsFinishTransaction)
+            XCTAssertEqual(purchase.productId, productIdentifier)
+        }
+        
+        let completeTransactionsController = makeCompleteTransactionsController(completeTransactions: completeTransactions)
+        
+        let spy = PaymentQueueSpy()
+        
+        let remainingTransactions = completeTransactionsController.processTransactions([transaction], on: spy)
+        
+        XCTAssertEqual(remainingTransactions.count, 0)
+        
+        XCTAssertTrue(callbackCalled)
+        
+        XCTAssertEqual(spy.finishTransactionCalledCount, 1)
+    }
+
+    func testProcessTransactions_when_notAtomically_oneFailedTransaction_then_finishesTransaction_callsCallback_noRemainingTransactions_noNeedsFinishTransactions() {
+        
+        let productIdentifier = "com.SwiftyStoreKit.product1"
+        let testProduct = TestProduct(productIdentifier: productIdentifier)
+        
+        let transaction = TestPaymentTransaction(payment: SKPayment(product: testProduct), transactionState: .failed)
+        
+        var callbackCalled = false
+        let completeTransactions = CompleteTransactions(atomically: false) { purchases in
+            callbackCalled = true
+            XCTAssertEqual(purchases.count, 1)
+            let purchase = purchases.first!
+            XCTAssertFalse(purchase.needsFinishTransaction)
+            XCTAssertEqual(purchase.productId, productIdentifier)
+        }
+        
+        let completeTransactionsController = makeCompleteTransactionsController(completeTransactions: completeTransactions)
+        
+        let spy = PaymentQueueSpy()
+        
+        let remainingTransactions = completeTransactionsController.processTransactions([transaction], on: spy)
+        
+        XCTAssertEqual(remainingTransactions.count, 0)
+        
+        XCTAssertTrue(callbackCalled)
+        
+        XCTAssertEqual(spy.finishTransactionCalledCount, 1)
+    }
+
+    func testProcessTransactions_when_atomically_oneTransactionForEachState_then_finishesTransactions_callsCallback_onePurchasingTransactionRemaining() {
 
         let transactions = [
             makeTestPaymentTransaction(productIdentifier: "com.SwiftyStoreKit.product1", transactionState: .purchased),
@@ -89,7 +147,7 @@ class CompleteTransactionsControllerTests: XCTestCase {
         XCTAssertEqual(spy.finishTransactionCalledCount, 4)
     }
 
-    func testProcessTransactions_when_zeroTransactions_then_noFinishedTransactions_noCallback_noTransactionsRemaining() {
+    func testProcessTransactions_when_atomically_zeroTransactions_then_noFinishedTransactions_noCallback_noTransactionsRemaining() {
 
         let transactions: [TestPaymentTransaction] = []
 
@@ -108,7 +166,7 @@ class CompleteTransactionsControllerTests: XCTestCase {
         XCTAssertEqual(spy.finishTransactionCalledCount, 0)
     }
 
-    func testProcessTransactions_when_onePurchasingTransaction_then_noFinishedTransactions_noCallback_oneTransactionsRemaining() {
+    func testProcessTransactions_when_atomically_onePurchasingTransaction_then_noFinishedTransactions_noCallback_oneTransactionsRemaining() {
 
         let productIdentifier = "com.SwiftyStoreKit.product1"
         let testProduct = TestProduct(productIdentifier: productIdentifier)
@@ -130,6 +188,7 @@ class CompleteTransactionsControllerTests: XCTestCase {
         XCTAssertEqual(spy.finishTransactionCalledCount, 0)
     }
 
+    
     func makeTestPaymentTransaction(productIdentifier: String, transactionState: SKPaymentTransactionState) -> TestPaymentTransaction {
 
         let testProduct = TestProduct(productIdentifier: productIdentifier)