From 22b569ad30bd27fb4668f3ce8de9b9496cb09f93 Mon Sep 17 00:00:00 2001 From: Nikita Vasilev Date: Thu, 14 Sep 2023 08:06:29 +0400 Subject: [PATCH] Release 2.0.0 (#4) * Update `README.md` * Add `CHANGELOG.md` * Update `Makefile` * Implement `async` requests * Revise the documentation for the methods. * Update `pre-commit` hooks - Integrate `SwiftLint` for validating modified lines. * Resolve `SwiftLint` warnings * Implement `ReceiptRefreshProvider` tests * Increase project's test-coverage * Update comments * Rewrite `async/await` blocks * Refactor test's target structure * Update method names and improve the documentation * Implement `SKProductTests` * Update package's documentation * Integrate `CodeCov` * Integrate `SwiftLint` validation into GitHub Actions * Update `Usage.md` layout * Update `CHANGELOG.md` * Update `ci.yml` * Increase the `tvOS` version to `13.0` * Update `README.md` * Update `ci.yml` * `Codecov` Integration [#2] * Update `README.md` * Create `dependabot.yml` * Update GitHub workflow (#3) * Implement issues and PR templates * Update `README.md` --- .github/ISSUE_TEMPLATE/bug_report.md | 41 ++ .github/ISSUE_TEMPLATE/feature_request.md | 11 + .../PULL_REQUEST_TEMPLATE/bug_template.yml | 9 + .../feature_template.yml | 12 + .github/dependabot.yml | 11 + .github/workflows/ci.yml | 28 +- .swiftlint.yml | 7 +- .../xcshareddata/xcschemes/Flare.xcscheme | 102 +++++ CHANGELOG.md | 12 + Documentation/Resources/flare.png | Bin 0 -> 326359 bytes Documentation/Usage.md | 75 +++- Package.swift | 16 +- README.md | 10 +- .../Bundle+IAppStoreReceiptProvider.swift | 8 + .../Extensions/FileManager+IFileManager.swift | 8 + .../SKRequest+IReceiptRefreshRequest.swift | 10 + .../Helpers/FileManager/IFileManager.swift | 10 + .../Helpers/PaymentQueue/PaymentQueue.swift | 3 + .../PaymentTransaction.swift | 2 +- Sources/Flare/Classes/Models/IAPError.swift | 40 ++ .../IAppStoreReceiptProvider.swift | 12 + .../Providers/IAPProvider/IAPProvider.swift | 40 +- .../Providers/IAPProvider/IIAPProvider.swift | 67 +++- .../PaymentProvider/IPaymentProvider.swift | 42 ++- .../PaymentProvider/PaymentProvider.swift | 23 +- .../ProductProvider/IProductProvider.swift | 10 +- .../ProductProvider/ProductProvider.swift | 8 +- .../Factories/IReceiptRefreshRequest.swift | 15 + .../IReceiptRefreshRequestFactory.swift | 19 + .../ReceiptRefreshRequestFactory.swift | 17 + .../IReceiptRefreshProvider.swift | 16 +- .../ReceiptRefreshProvider.swift | 39 +- Sources/Flare/Flare.swift | 21 +- Sources/Flare/IFlare.swift | 63 +++- Tests/FlareTests/Classes/FlareTests.swift | 83 ---- .../Classes/Mocks/IAPProviderMock.swift | 87 ----- .../Classes/Mocks/ProductProviderMock.swift | 20 - .../Mocks/ReceiptRefreshProviderMock.swift | 30 -- .../Classes/Providers/IAPProviderTests.swift | 121 ------ .../ReceiptRefreshProviderTests.swift | 73 ---- .../Helpers/PurchaseManagerTestHelper.swift | 0 .../Mocks/AppStoreReceiptProviderMock.swift | 19 + Tests/FlareTests/Mocks/FileManagerMock.swift | 23 ++ Tests/FlareTests/Mocks/IAPProviderMock.swift | 140 +++++++ .../Mocks/PaymentProviderMock.swift | 18 +- .../Mocks/PaymentQueueMock.swift | 0 .../Mocks/PaymentTransactionMock.swift | 10 + .../{Classes => }/Mocks/ProductMock.swift | 14 +- .../Mocks/ProductProviderMock.swift | 26 ++ .../Mocks/ProductResponseMock.swift | 0 .../Mocks/ProductsRequestMock.swift | 0 .../Mocks/ReceiptRefreshProviderMock.swift | 47 +++ .../Mocks/ReceiptRefreshRequestFactory.swift | 24 ++ .../Mocks/ReceiptRefreshRequestMock.swift | 41 ++ .../ReceiptRefreshFactoryTests.swift | 42 +++ Tests/FlareTests/UnitTests/FlareTests.swift | 249 ++++++++++++ .../Models/PaymentTransactionTests.swift | 144 +++++++ .../UnitTests/Models/SKProductTests.swift | 36 ++ .../Providers/IAPProviderTests.swift | 357 ++++++++++++++++++ .../Providers/PaymentProviderTests.swift | 121 ++++-- .../Providers/ProductProviderTests.swift | 39 +- .../ReceiptRefreshProviderTests.swift | 179 +++++++++ codecov.yml | 48 +++ hooks/pre-commit | 29 +- 64 files changed, 2238 insertions(+), 589 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/bug_template.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE/feature_template.yml create mode 100644 .github/dependabot.yml create mode 100644 .swiftpm/xcode/xcshareddata/xcschemes/Flare.xcscheme create mode 100644 Documentation/Resources/flare.png create mode 100644 Sources/Flare/Classes/Extensions/Bundle+IAppStoreReceiptProvider.swift create mode 100644 Sources/Flare/Classes/Extensions/FileManager+IFileManager.swift create mode 100644 Sources/Flare/Classes/Extensions/SKRequest+IReceiptRefreshRequest.swift create mode 100644 Sources/Flare/Classes/Helpers/FileManager/IFileManager.swift create mode 100644 Sources/Flare/Classes/Providers/AppStoreReceiptProvider/IAppStoreReceiptProvider.swift create mode 100644 Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/IReceiptRefreshRequest.swift create mode 100644 Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/ReceiptRefreshRequestFactory/IReceiptRefreshRequestFactory.swift create mode 100644 Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/ReceiptRefreshRequestFactory/ReceiptRefreshRequestFactory.swift delete mode 100644 Tests/FlareTests/Classes/FlareTests.swift delete mode 100644 Tests/FlareTests/Classes/Mocks/IAPProviderMock.swift delete mode 100644 Tests/FlareTests/Classes/Mocks/ProductProviderMock.swift delete mode 100644 Tests/FlareTests/Classes/Mocks/ReceiptRefreshProviderMock.swift delete mode 100644 Tests/FlareTests/Classes/Providers/IAPProviderTests.swift delete mode 100644 Tests/FlareTests/Classes/Providers/ReceiptRefreshProviderTests.swift rename Tests/FlareTests/{Classes => }/Helpers/PurchaseManagerTestHelper.swift (100%) create mode 100644 Tests/FlareTests/Mocks/AppStoreReceiptProviderMock.swift create mode 100644 Tests/FlareTests/Mocks/FileManagerMock.swift create mode 100644 Tests/FlareTests/Mocks/IAPProviderMock.swift rename Tests/FlareTests/{Classes => }/Mocks/PaymentProviderMock.swift (85%) rename Tests/FlareTests/{Classes => }/Mocks/PaymentQueueMock.swift (100%) rename Tests/FlareTests/{Classes => }/Mocks/PaymentTransactionMock.swift (81%) rename Tests/FlareTests/{Classes => }/Mocks/ProductMock.swift (59%) create mode 100644 Tests/FlareTests/Mocks/ProductProviderMock.swift rename Tests/FlareTests/{Classes => }/Mocks/ProductResponseMock.swift (100%) rename Tests/FlareTests/{Classes => }/Mocks/ProductsRequestMock.swift (100%) create mode 100644 Tests/FlareTests/Mocks/ReceiptRefreshProviderMock.swift create mode 100644 Tests/FlareTests/Mocks/ReceiptRefreshRequestFactory.swift create mode 100644 Tests/FlareTests/Mocks/ReceiptRefreshRequestMock.swift create mode 100644 Tests/FlareTests/UnitTests/Factories/ReceiptRefreshFactoryTests.swift create mode 100644 Tests/FlareTests/UnitTests/FlareTests.swift create mode 100644 Tests/FlareTests/UnitTests/Models/PaymentTransactionTests.swift create mode 100644 Tests/FlareTests/UnitTests/Models/SKProductTests.swift create mode 100644 Tests/FlareTests/UnitTests/Providers/IAPProviderTests.swift rename Tests/FlareTests/{Classes => UnitTests}/Providers/PaymentProviderTests.swift (60%) rename Tests/FlareTests/{Classes => UnitTests}/Providers/ProductProviderTests.swift (75%) create mode 100644 Tests/FlareTests/UnitTests/Providers/ReceiptRefreshProviderTests.swift create mode 100644 codecov.yml mode change 100644 => 100755 hooks/pre-commit diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..8dc7e75ce --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,41 @@ +--- +name: "🐛 Bug Report" +about: Report a reproducible bug or regression. +title: 'Bug: ' +labels: 'bug' + +--- + + + +Application version: + +## Steps To Reproduce + +1. +2. + + + +Link to code example: + + + +## The current behavior + + +## The expected behavior \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..97d08de18 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,11 @@ +--- +name: 🛠 Feature request +about: If you have a feature request for the Firebase iOS SDK, file it here. +labels: 'type: enhancement' +--- + +**Feature description** +Clearly and concisely describe the feature. + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/bug_template.yml b/.github/PULL_REQUEST_TEMPLATE/bug_template.yml new file mode 100644 index 000000000..7d6a149d1 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/bug_template.yml @@ -0,0 +1,9 @@ +## Bug description +Clearly and concisely describe the problem. + +## Solution description +Describe your code changes in detail for reviewers. Explain the technical solution you have provided and how it fixes the issue case. + +## Covered unit test cases +- [x] yes +- [x] no \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/feature_template.yml b/.github/PULL_REQUEST_TEMPLATE/feature_template.yml new file mode 100644 index 000000000..ab3978bc5 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/feature_template.yml @@ -0,0 +1,12 @@ +## Feature description +Clearly and concisely describe the feature. + +## Solution description +Describe your code changes in detail for reviewers. + +## Areas affected and ensured +List out the areas affected by your code changes. + +## Covered unit test cases +- [x] yes +- [x] no \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..0f8f7ed67 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "swift" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95c58a62b..587f5487e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,13 +6,27 @@ on: - main - dev pull_request: - branches: [ main ] + paths: + - '.swiftlint.yml' + branches: + - main + - dev concurrency: group: ci cancel-in-progress: true jobs: + SwiftLint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: GitHub Action for SwiftLint + uses: norio-nomura/action-swiftlint@3.2.1 + with: + args: --strict + env: + DIFF_BASE: ${{ github.base_ref }} Latest: name: Test Latest (iOS, macOS, tvOS, watchOS) runs-on: macOS-12 @@ -26,16 +40,26 @@ jobs: - destination: "OS=16.1,name=iPhone 14 Pro" name: "iOS" scheme: "Flare" + sdk: iphonesimulator - destination: "OS=16.1,name=Apple TV" name: "tvOS" scheme: "Flare" + sdk: appletvsimulator - destination: "OS=9.1,name=Apple Watch Series 8 (45mm)" name: "watchOS" scheme: "Flare" + sdk: watchsimulator - destination: "platform=macOS" name: "macOS" scheme: "Flare" + sdk: macosx steps: - uses: actions/checkout@v3 - name: ${{ matrix.name }} - run: xcodebuild test -scheme "${{ matrix.scheme }}" -destination "${{ matrix.destination }}" clean \ No newline at end of file + run: xcodebuild test -scheme "${{ matrix.scheme }}" -destination "${{ matrix.destination }}" clean -enableCodeCoverage YES -resultBundlePath "./${{ matrix.sdk }}.xcresult" | xcpretty -r junit + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3.1.0 + with: + token: ${{ secrets.CODECOV_TOKEN }} + xcode: true + xcode_archive_path: "./${{ matrix.sdk }}.xcresult" \ No newline at end of file diff --git a/.swiftlint.yml b/.swiftlint.yml index c25e9471f..b5956417d 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -13,12 +13,10 @@ disabled_rules: opt_in_rules: # some rules are only opt-in - anyobject_protocol - array_init - - attributes - closure_body_length - closure_end_indentation - closure_spacing - collection_alignment - - conditional_returns_on_newline - contains_over_filter_count - contains_over_filter_is_empty - contains_over_first_not_nil @@ -131,4 +129,7 @@ nesting: type_name: max_length: warning: 40 - error: 50 \ No newline at end of file + error: 50 + +file_name: + excluded: ["Types.swift"] \ No newline at end of file diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/Flare.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/Flare.xcscheme new file mode 100644 index 000000000..46bcfc41a --- /dev/null +++ b/.swiftpm/xcode/xcshareddata/xcschemes/Flare.xcscheme @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CHANGELOG.md b/CHANGELOG.md index c64915145..0ca19a1bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ # Change Log All notable changes to this project will be documented in this file. +#### 2.x Releases +- `2.0.x` Releases - [2.0.0](#200) + +## [2.0.0](https://github.com/space-code/flare/releases/tag/2.0.0) +Released on 2023-09-13. + +#### Added +- Support for Swift Concurrency, including async-await for requests. + +#### Updated +- Rename public methods and parameters to increase readability. + #### 1.x Releases - `1.0.x` Releases - [1.0.0](#100) diff --git a/Documentation/Resources/flare.png b/Documentation/Resources/flare.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac3514757c14ddac508e0257a9e6279be9deec4 GIT binary patch literal 326359 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

h%k0{2MA8 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 z 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≈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%0Dd^Ga%jrH-kP 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ξwl=(uIA{kHI(!- zK6EIs|4;4Vqvsy&jonMKI{>}_dg7Cm&rhL&eKU0mg8gVzncxHM)Q7Xj#>S9m=BK9{ zMLok!O8Z7$F0`c8H#W-4%06kMTT5-x8K{2dwC?$gss6F{C8O>QBSTWT!c8irQ&$f* zNJtc|JOVR#=2ghp@Xt^r&Oy&y|FksHTu1cv;Jc7)K8d?+3J1%FCUY%PplMEcjc4?wf<_>n02^y;b>P58KVS7&CQ5>b$arOz?Q|5t$(kO+54CaTVP$2SX@s?= z@@IpKX)>>)6^8OG`Df4y>eP3)9om-Id1KI}kKl@g{;1w)PyL%sw|zS&!rQgf0z5WU zbr}b3aW?g7Gm5JD&A9E=N^$VRU^Lbpj^|{ZVkHY%cg*vw=aMI*)@gp)E4`5}%itNj zYoeyGf|D>-r=_Bz0&D>-oA!>5^zn}-?HzDQLc8b`AwS)=CNKr=Hv6wU^ZnzG1*FPx zs%;E*9r^gjy~|a`zS|1C78DRjN>0|(*9U+>Ikf?E4y&pxpacOL zA>Tn@W?bie%q$Av)8*E7!35-|yZnJ@1Z_WAIl1Zx>Aj4!^F>|5XiV42zhN1>w-NSZ z(HCiC49`p3HJo*9H#}XS*xD#cX%)zAIQ>ASPQa~Q*>o3io`CqPq2b#U$26nt?j{>^ zLZ=b{*Pxk?Nax5a{nDjcHRn~Qw^n*d6%=g6vnw_lsID+vHMKJ1V~3UV9lLD{ombqh0k~JO<^6`6rSLEe#Xw8Bd znS+mU8MiJ609C<|@}@w}ffkCvK=f=oQD(*0O}Sf_b%z~Vw?mJet`15F^!K%7e=@Ko zz$Zze#H#mzG+h9Liscence Platform Swift5.5 - CI - +CI +CodeCov + +CI

## Description @@ -32,7 +34,7 @@ Flare is a framework written in Swift that makes it easy for you to work with in Check out [flare documentation](https://github.com/space-code/flare/blob/main/Documentation/Usage.md). ## Requirements -- iOS 13.0+ / macOS 10.15+ / tvOS 11.0+ / watchOS 7.0+ +- iOS 13.0+ / macOS 10.15+ / tvOS 13.0+ / watchOS 7.0+ - Xcode 14.0 - Swift 5.5 @@ -45,7 +47,7 @@ Once you have your Swift package set up, adding `flare` as a dependency is as ea ```swift dependencies: [ - .package(url: "https://github.com/space-code/flare.git", .upToNextMajor(from: "1.0.0")) + .package(url: "https://github.com/space-code/flare.git", .upToNextMajor(from: "2.0.0")) ] ``` diff --git a/Sources/Flare/Classes/Extensions/Bundle+IAppStoreReceiptProvider.swift b/Sources/Flare/Classes/Extensions/Bundle+IAppStoreReceiptProvider.swift new file mode 100644 index 000000000..f762c9d2b --- /dev/null +++ b/Sources/Flare/Classes/Extensions/Bundle+IAppStoreReceiptProvider.swift @@ -0,0 +1,8 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +import Foundation + +extension Bundle: IAppStoreReceiptProvider {} diff --git a/Sources/Flare/Classes/Extensions/FileManager+IFileManager.swift b/Sources/Flare/Classes/Extensions/FileManager+IFileManager.swift new file mode 100644 index 000000000..43c2f32c2 --- /dev/null +++ b/Sources/Flare/Classes/Extensions/FileManager+IFileManager.swift @@ -0,0 +1,8 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +import Foundation + +extension FileManager: IFileManager {} diff --git a/Sources/Flare/Classes/Extensions/SKRequest+IReceiptRefreshRequest.swift b/Sources/Flare/Classes/Extensions/SKRequest+IReceiptRefreshRequest.swift new file mode 100644 index 000000000..deea382c5 --- /dev/null +++ b/Sources/Flare/Classes/Extensions/SKRequest+IReceiptRefreshRequest.swift @@ -0,0 +1,10 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +import StoreKit + +// MARK: - SKRequest + IReceiptRefreshRequest + +extension SKRequest: IReceiptRefreshRequest {} diff --git a/Sources/Flare/Classes/Helpers/FileManager/IFileManager.swift b/Sources/Flare/Classes/Helpers/FileManager/IFileManager.swift new file mode 100644 index 000000000..f53e1ca11 --- /dev/null +++ b/Sources/Flare/Classes/Helpers/FileManager/IFileManager.swift @@ -0,0 +1,10 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +import Foundation + +protocol IFileManager { + func fileExists(atPath path: String) -> Bool +} diff --git a/Sources/Flare/Classes/Helpers/PaymentQueue/PaymentQueue.swift b/Sources/Flare/Classes/Helpers/PaymentQueue/PaymentQueue.swift index fc181c0b4..6bcfe38e6 100644 --- a/Sources/Flare/Classes/Helpers/PaymentQueue/PaymentQueue.swift +++ b/Sources/Flare/Classes/Helpers/PaymentQueue/PaymentQueue.swift @@ -9,12 +9,14 @@ import StoreKit public protocol PaymentQueue: AnyObject { /// `False` if this device is not able or allowed to make payments var canMakePayments: Bool { get } + /// Payment transactions. var transactions: [SKPaymentTransaction] { get } /// The transactions array will only be synchronized with the server while the queue has observers. /// This may require that the user authenticate. func add(_ observer: SKPaymentTransactionObserver) + /// The transactions array will only be synchronized with the server while the queue has observers. /// This may require that the user authenticate. func remove(_ observer: SKPaymentTransactionObserver) @@ -22,6 +24,7 @@ public protocol PaymentQueue: AnyObject { /// Add a payment to the server queue. The payment is copied to add an SKPaymentTransaction to the transactions array. /// The same payment can be added multiple times to create multiple transactions. func add(_ payment: SKPayment) + /// Will add completed transactions for the current user back to the queue to be re-completed. /// User will be asked to authenticate. Observers will receive 0 or more -paymentQueue:updatedTransactions:, /// followed by either -paymentQueueRestoreCompletedTransactionsFinished: on success or diff --git a/Sources/Flare/Classes/Helpers/PaymentTransaction/PaymentTransaction.swift b/Sources/Flare/Classes/Helpers/PaymentTransaction/PaymentTransaction.swift index 72735c854..ff71880d3 100644 --- a/Sources/Flare/Classes/Helpers/PaymentTransaction/PaymentTransaction.swift +++ b/Sources/Flare/Classes/Helpers/PaymentTransaction/PaymentTransaction.swift @@ -5,7 +5,7 @@ import StoreKit -public struct PaymentTransaction { +public struct PaymentTransaction: Equatable { // MARK: Lifecycle init(_ skTransaction: SKPaymentTransaction) { diff --git a/Sources/Flare/Classes/Models/IAPError.swift b/Sources/Flare/Classes/Models/IAPError.swift index e69668023..65fae3136 100644 --- a/Sources/Flare/Classes/Models/IAPError.swift +++ b/Sources/Flare/Classes/Models/IAPError.swift @@ -7,15 +7,26 @@ import StoreKit // MARK: - IAPError +/// `IAPError` is the error type returned by Flare. +/// It encompasses a few different types of errors, each with their own associated reasons. public enum IAPError: Swift.Error { + /// The empty array of products were fetched. case emptyProducts + /// The attempt to fetch products with invalid identifiers. case invalid(productIds: [String]) + /// The attempt to purchase a product when payments are not allowed. case paymentNotAllowed + /// The payment was cancelled. case paymentCancelled + /// The attempt to fetch a product that doesn't available. case storeProductNotAvailable + /// The `SKPayment` returned unknown error. case storeTrouble + /// The operation failed with an underlying error. case with(error: Swift.Error) + /// The App Store receipt wasn't found. case receiptNotFound + /// The unknown error occurred. case unknown } @@ -49,3 +60,32 @@ extension IAPError { } } } + +// MARK: Equatable + +extension IAPError: Equatable { + public static func == (lhs: IAPError, rhs: IAPError) -> Bool { + switch (lhs, rhs) { + case (.emptyProducts, .emptyProducts): + return true + case let (.invalid(lhs), .invalid(rhs)): + return lhs == rhs + case (.paymentNotAllowed, .paymentNotAllowed): + return true + case (.paymentCancelled, .paymentCancelled): + return true + case (.storeProductNotAvailable, .storeProductNotAvailable): + return true + case (.storeTrouble, .storeTrouble): + return true + case let (.with(lhs), .with(rhs)): + return (lhs as NSError) == (rhs as NSError) + case (.receiptNotFound, .receiptNotFound): + return true + case (.unknown, .unknown): + return true + default: + return false + } + } +} diff --git a/Sources/Flare/Classes/Providers/AppStoreReceiptProvider/IAppStoreReceiptProvider.swift b/Sources/Flare/Classes/Providers/AppStoreReceiptProvider/IAppStoreReceiptProvider.swift new file mode 100644 index 000000000..f13e50f3c --- /dev/null +++ b/Sources/Flare/Classes/Providers/AppStoreReceiptProvider/IAppStoreReceiptProvider.swift @@ -0,0 +1,12 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +import Foundation + +/// Type that retrieves the App Store receipt URL. +protocol IAppStoreReceiptProvider { + /// The App Store receipt URL for the app. + var appStoreReceiptURL: URL? { get } +} diff --git a/Sources/Flare/Classes/Providers/IAPProvider/IAPProvider.swift b/Sources/Flare/Classes/Providers/IAPProvider/IAPProvider.swift index 8782266c2..001843387 100644 --- a/Sources/Flare/Classes/Providers/IAPProvider/IAPProvider.swift +++ b/Sources/Flare/Classes/Providers/IAPProvider/IAPProvider.swift @@ -33,16 +33,24 @@ final class IAPProvider: IIAPProvider { paymentQueue.canMakePayments } - func fetch(productsIds: Set, completion: @escaping Closure>) { + func fetch(productIDs: Set, completion: @escaping Closure>) { productProvider.fetch( - productIds: productsIds, - requestId: UUID().uuidString, + productIDs: productIDs, + requestID: UUID().uuidString, completion: completion ) } - func purchase(productId: String, completion: @escaping Closure>) { - productProvider.fetch(productIds: [productId], requestId: UUID().uuidString) { result in + func fetch(productIDs: Set) async throws -> [SKProduct] { + try await withCheckedThrowingContinuation { continuation in + self.fetch(productIDs: productIDs) { result in + continuation.resume(with: result) + } + } + } + + func purchase(productID: String, completion: @escaping Closure>) { + productProvider.fetch(productIDs: [productID], requestID: UUID().uuidString) { result in switch result { case let .success(products): guard let product = products.first else { @@ -66,15 +74,19 @@ final class IAPProvider: IIAPProvider { } } - func refreshReceipt(completion: @escaping Closure>) { - receiptRefreshProvider.refresh(requestId: UUID().uuidString) { [weak self] result in - guard let self = self else { - return + func purchase(productID: String) async throws -> PaymentTransaction { + try await withCheckedThrowingContinuation { continuation in + purchase(productID: productID) { result in + continuation.resume(with: result) } + } + } + func refreshReceipt(completion: @escaping Closure>) { + receiptRefreshProvider.refresh(requestID: UUID().uuidString) { [weak self] result in switch result { case .success: - if let receipt = self.receiptRefreshProvider.receipt { + if let receipt = self?.receiptRefreshProvider.receipt { completion(.success(receipt)) } else { completion(.failure(.receiptNotFound)) @@ -85,6 +97,14 @@ final class IAPProvider: IIAPProvider { } } + func refreshReceipt() async throws -> String { + try await withCheckedThrowingContinuation { continuation in + refreshReceipt { result in + continuation.resume(with: result) + } + } + } + func finish(transaction: PaymentTransaction) { paymentProvider.finish(transaction: transaction) } diff --git a/Sources/Flare/Classes/Providers/IAPProvider/IIAPProvider.swift b/Sources/Flare/Classes/Providers/IAPProvider/IIAPProvider.swift index db5c627fe..c4e88043b 100644 --- a/Sources/Flare/Classes/Providers/IAPProvider/IIAPProvider.swift +++ b/Sources/Flare/Classes/Providers/IAPProvider/IIAPProvider.swift @@ -5,37 +5,78 @@ import StoreKit +/// Type that provides in-app purchase functionality. public protocol IIAPProvider { /// False if this device is not able or allowed to make payments var canMakePayments: Bool { get } - /// Retrieve localized information from the App Store about a specified list of products. + /// Retrieves localized information from the App Store about a specified list of products. /// /// - Parameters: - /// - productsIds: The list of product identifiers for the products you wish to retrieve descriptions of. - /// - completion: A products handler. - func fetch(productsIds: Set, completion: @escaping Closure>) + /// - productIDs: The list of product identifiers for which you wish to retrieve descriptions. + /// - completion: The completion containing the response of retrieving products. + func fetch(productIDs: Set, completion: @escaping Closure>) - /// Perform purchase a product with given id. + /// Retrieves localized information from the App Store about a specified list of products. + /// + /// - Parameter productIDs: The list of product identifiers for which you wish to retrieve descriptions. + /// + /// - Throws: `IAPError(error:)` if the request did fail with error. + /// + /// - Returns: An array of products. + func fetch(productIDs: Set) async throws -> [SKProduct] + + /// Performs a purchase of a product with a given ID. + /// + /// - Note: The method automatically checks if the user can purchase a product. + /// If the user can't make a payment, the method returns an error + /// with the type `IAPError.paymentNotAllowed`. /// /// - Parameters: - /// - productId: A product identifier. - /// - completion: A block object to be executed when the purchase operation ends. - func purchase(productId: String, completion: @escaping Closure>) + /// - productID: The product identifier. + /// - completion: The closure to be executed once the purchase is complete. + func purchase(productID: String, completion: @escaping Closure>) - /// A request to refresh the receipt, which represents the user’s transactions with your app. + /// Purchases a product with a given ID. + /// + /// - Note: The method automatically checks if the user can purchase a product. + /// If the user can't make a payment, the method returns an error + /// with the type `IAPError.paymentNotAllowed`. + /// + /// - Parameter productID: The product identifier. + /// + /// - Throws: `IAPError.paymentNotAllowed` if user can't make payment. /// - /// - Parameter completion: A block object to be executed when the refresh operation ends. + /// - Returns: A payment transaction. + func purchase(productID: String) async throws -> PaymentTransaction + + /// Refreshes the receipt, representing the user's transactions with your app. + /// + /// - Parameter completion: The closure to be executed when the refresh operation ends. func refreshReceipt(completion: @escaping Closure>) - /// Remove a finished (i.e. failed or completed) transaction from the queue. Attempting to finish a purchasing transaction will throw an exception. + /// Refreshes the receipt, representing the user's transactions with your app. + /// + /// `IAPError(error:)` if the request did fail with error. + /// + /// - Returns: A receipt. + func refreshReceipt() async throws -> String + + /// Removes a finished (i.e. failed or completed) transaction from the queue. + /// Attempting to finish a purchasing transaction will throw an exception. /// /// - Parameter transaction: An object in the payment queue. func finish(transaction: PaymentTransaction) - /// The transactions array will only be synchronized with the server while the queue has observers. This may require that the user authenticate. + /// Adds transaction observer to the payment queue. + /// The transactions array will only be synchronized with the server while the queue has observers. + /// + /// - Note: This may require that the user authenticate. func addTransactionObserver(fallbackHandler: Closure>?) - /// The transactions array will only be synchronized with the server while the queue has observers. This may require that the user authenticate + /// Removes transaction observer from the payment queue. + /// The transactions array will only be synchronized with the server while the queue has observers. + /// + /// - Note: This may require that the user authenticate. func removeTransactionObserver() } diff --git a/Sources/Flare/Classes/Providers/PaymentProvider/IPaymentProvider.swift b/Sources/Flare/Classes/Providers/PaymentProvider/IPaymentProvider.swift index df5a248e5..2d511767d 100644 --- a/Sources/Flare/Classes/Providers/PaymentProvider/IPaymentProvider.swift +++ b/Sources/Flare/Classes/Providers/PaymentProvider/IPaymentProvider.swift @@ -5,51 +5,59 @@ import StoreKit -/// Payment provider. +/// Type that provides payment functionality. public protocol IPaymentProvider: AnyObject { /// False if this device is not able or allowed to make payments var canMakePayments: Bool { get } - /// Payment transactions. + /// The active payment transactinos. var transactions: [PaymentTransaction] { get } + /// Adds transaction observer to a payment queue. /// The transactions array will only be synchronized with the server while the queue has observers. - /// This may require that the user authenticate. + /// + /// - Note: This may require that the user authenticate. func addTransactionObserver() + + /// Removes transaction observer from a payment queue. /// The transactions array will only be synchronized with the server while the queue has observers. - /// This may require that the user authenticate. + /// + /// - Note: This may require that the user authenticate. func removeTransactionObserver() - /// Will add completed transactions for the current user back to the queue to be re-completed. User will be asked to authenticate. + /// Restores completed transactions for the current user back to the queue for re-completion. + /// + /// - Note: A user will be asked to authenticate. /// /// - Parameter handler: A restore handler. func restoreCompletedTransactions(handler: @escaping RestoreHandler) - /// Add a payment to the server queue. + /// Adds a payment to the payment queue. /// /// - Parameters: - /// - payment: A payment object identifies a product and the quantity of those items the user would like to purchase. - /// - handler: A payment handler. + /// - payment: The payment object identifies a product and specifies the quantity of + /// those items the user would like to purchase. + /// - handler: The closure to be executed once the purchase is complete. func add(payment: SKPayment, handler: @escaping PaymentHandler) - /// Add handler to the payment with specific id. + /// Adds a handler to the payment queue with a specific ID. /// /// - Parameters: - /// - withProductIdentifier: Product identifier. - /// - handler: A payment handler. - func addPaymentHandler(withProductIdentifier: String, handler: @escaping PaymentHandler) + /// - productID: The product identifier. + /// - handler: The closure to be executed once the purchase is complete. + func addPaymentHandler(productID: String, handler: @escaping PaymentHandler) - /// Add App Store payment handler. + /// Adds an App Store payment handler to the system. func set(shouldAddStorePaymentHandler: @escaping ShouldAddStorePaymentHandler) - /// Common handler for transactions that don't have a dedicated payment handler. + /// Sets a common handler for transactions that do not have a dedicated payment handler. /// - /// - Parameter fallbackHandler: A payment handler. + /// - Parameter fallbackHandler: The closure to be executed for all payments that don't have a dedicated payment handler. func set(fallbackHandler: @escaping PaymentHandler) - /// Remove a finished (i.e. failed or completed) transaction from the queue. + /// Removes a finished (i.e. failed or completed) transaction from the queue. /// Attempting to finish a purchasing transaction will throw an exception. /// - /// - Parameter transaction: An object in the payment queue. + /// - Parameter transaction: The payment transaction. func finish(transaction: PaymentTransaction) } diff --git a/Sources/Flare/Classes/Providers/PaymentProvider/PaymentProvider.swift b/Sources/Flare/Classes/Providers/PaymentProvider/PaymentProvider.swift index db2bb80eb..aacf89156 100644 --- a/Sources/Flare/Classes/Providers/PaymentProvider/PaymentProvider.swift +++ b/Sources/Flare/Classes/Providers/PaymentProvider/PaymentProvider.swift @@ -47,17 +47,17 @@ extension PaymentProvider: IPaymentProvider { } func add(payment: SKPayment, handler: @escaping PaymentHandler) { - addPaymentHandler(withProductIdentifier: payment.productIdentifier, handler: handler) + addPaymentHandler(productID: payment.productIdentifier, handler: handler) dispatchQueueFactory.main().async { self.paymentQueue.add(payment) } } - func addPaymentHandler(withProductIdentifier productIdentifier: String, handler: @escaping PaymentHandler) { + func addPaymentHandler(productID: String, handler: @escaping PaymentHandler) { privateQueue.async { - var handlers: [PaymentHandler] = self.paymentHandlers[productIdentifier] ?? [] + var handlers: [PaymentHandler] = self.paymentHandlers[productID] ?? [] handlers.append(handler) - self.paymentHandlers[productIdentifier] = handlers + self.paymentHandlers[productID] = handlers } } @@ -98,13 +98,12 @@ extension PaymentProvider: SKPaymentTransactionObserver { @unknown default: continue } - privateQueue.async { [weak self] in - guard let self = self else { - return - } + guard let self = self else { return } - if let handlers = self.paymentHandlers.removeValue(forKey: transaction.payment.productIdentifier), !handlers.isEmpty { + if let handlers = self.paymentHandlers.removeValue( + forKey: transaction.payment.productIdentifier + ), !handlers.isEmpty { self.dispatchQueueFactory.main().async { handlers.forEach { $0(queue, .success(transaction)) } } @@ -139,9 +138,9 @@ extension PaymentProvider: SKPaymentTransactionObserver { } #if os(iOS) || os(tvOS) || os(macOS) - func paymentQueue(_ queue: SKPaymentQueue, shouldAddStorePayment payment: SKPayment, for product: SKProduct) -> Bool { - shouldAddStorePaymentHandler?(queue, payment, product) ?? false - } + func paymentQueue(_ queue: SKPaymentQueue, shouldAddStorePayment payment: SKPayment, for product: SKProduct) -> Bool { + shouldAddStorePaymentHandler?(queue, payment, product) ?? false + } #endif func finish(transaction: PaymentTransaction) { diff --git a/Sources/Flare/Classes/Providers/ProductProvider/IProductProvider.swift b/Sources/Flare/Classes/Providers/ProductProvider/IProductProvider.swift index e9177f7c8..f9e5376ba 100644 --- a/Sources/Flare/Classes/Providers/ProductProvider/IProductProvider.swift +++ b/Sources/Flare/Classes/Providers/ProductProvider/IProductProvider.swift @@ -16,11 +16,11 @@ public typealias ReceiptRefreshHandler = (Result) -> Void public protocol IProductProvider { typealias ProductsHandler = Closure> - /// Retrieve localized information from the App Store about a specified list of products. + /// Retrieves localized information from the App Store about a specified list of products. /// /// - Parameters: - /// - productIds: The list of product identifiers for the products you wish to retrieve descriptions of. - /// - requestId: A request id. - /// - completion: A products handler. - func fetch(productIds: Set, requestId: String, completion: @escaping ProductsHandler) + /// - productIDs: The list of product identifiers for which you wish to retrieve descriptions. + /// - requestID: The request identifier. + /// - completion: The completion containing the response of retrieving products. + func fetch(productIDs: Set, requestID: String, completion: @escaping ProductsHandler) } diff --git a/Sources/Flare/Classes/Providers/ProductProvider/ProductProvider.swift b/Sources/Flare/Classes/Providers/ProductProvider/ProductProvider.swift index 104fddd44..c9f3dc6b1 100644 --- a/Sources/Flare/Classes/Providers/ProductProvider/ProductProvider.swift +++ b/Sources/Flare/Classes/Providers/ProductProvider/ProductProvider.swift @@ -17,8 +17,8 @@ final class ProductProvider: NSObject, IProductProvider { // MARK: Internal - func fetch(productIds ids: Set, requestId: String, completion: @escaping ProductsHandler) { - let request = makeRequest(ids: ids, requestId: requestId) + func fetch(productIDs ids: Set, requestID: String, completion: @escaping ProductsHandler) { + let request = makeRequest(ids: ids, requestID: requestID) fetch(request: request, completion: completion) } @@ -29,9 +29,9 @@ final class ProductProvider: NSObject, IProductProvider { private lazy var dispatchQueue: IDispatchQueue = dispatchQueueFactory.privateQueue(label: String(describing: self)) - private func makeRequest(ids: Set, requestId: String) -> SKProductsRequest { + private func makeRequest(ids: Set, requestID: String) -> SKProductsRequest { let request = SKProductsRequest(productIdentifiers: ids) - request.id = requestId + request.id = requestID request.delegate = self return request } diff --git a/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/IReceiptRefreshRequest.swift b/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/IReceiptRefreshRequest.swift new file mode 100644 index 000000000..aa0f37c5c --- /dev/null +++ b/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/IReceiptRefreshRequest.swift @@ -0,0 +1,15 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +import Foundation + +/// A type that represents a receipt refresh request. +protocol IReceiptRefreshRequest { + /// The request's identifier. + var id: String { get set } + + /// Performs receipt refreshing logic. + func start() +} diff --git a/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/ReceiptRefreshRequestFactory/IReceiptRefreshRequestFactory.swift b/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/ReceiptRefreshRequestFactory/IReceiptRefreshRequestFactory.swift new file mode 100644 index 000000000..1446ff301 --- /dev/null +++ b/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/ReceiptRefreshRequestFactory/IReceiptRefreshRequestFactory.swift @@ -0,0 +1,19 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +import Foundation +import protocol StoreKit.SKRequestDelegate + +/// A type that is responsible for create a receipt request. +protocol IReceiptRefreshRequestFactory { + /// Makes a new instance of `IReceiptRefreshRequest`. + /// + /// - Parameters: + /// - requestID: The request's identifier. + /// - delegate: The request's delegate. + /// + /// - Returns: A request. + func make(requestID: String, delegate: SKRequestDelegate?) -> IReceiptRefreshRequest +} diff --git a/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/ReceiptRefreshRequestFactory/ReceiptRefreshRequestFactory.swift b/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/ReceiptRefreshRequestFactory/ReceiptRefreshRequestFactory.swift new file mode 100644 index 000000000..1dc2d38ff --- /dev/null +++ b/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/Factories/ReceiptRefreshRequestFactory/ReceiptRefreshRequestFactory.swift @@ -0,0 +1,17 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +import Foundation +import class StoreKit.SKReceiptRefreshRequest +import protocol StoreKit.SKRequestDelegate + +final class ReceiptRefreshRequestFactory: IReceiptRefreshRequestFactory { + func make(requestID: String, delegate: SKRequestDelegate?) -> IReceiptRefreshRequest { + let request = SKReceiptRefreshRequest() + request.id = requestID + request.delegate = delegate + return request + } +} diff --git a/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/IReceiptRefreshProvider.swift b/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/IReceiptRefreshProvider.swift index c7b4811d9..44c9c1c9a 100644 --- a/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/IReceiptRefreshProvider.swift +++ b/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/IReceiptRefreshProvider.swift @@ -5,14 +5,22 @@ import StoreKit +/// A type that can refresh the bundle's App Store receipt. public protocol IReceiptRefreshProvider { /// The bundle’s App Store receipt. var receipt: String? { get } - /// A request to refresh the receipt, which represents the user’s transactions with your app. + /// Refreshes the receipt, representing the user's transactions with your app. /// /// - Parameters: - /// - requestId: A request identifier. - /// - handler: A receipt refresh handler. - func refresh(requestId: String, handler: @escaping ReceiptRefreshHandler) + /// - requestID: The request identifier. + /// - handler: The closure to be executed when the refresh operation ends. + func refresh(requestID: String, handler: @escaping ReceiptRefreshHandler) + + /// Refreshes the receipt, representing the user's transactions with your app. + /// + /// - Parameter requestID: The request identifier. + /// + /// - Throws: `IAPError(error:)` if the request did fail with error. + func refresh(requestID: String) async throws } diff --git a/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/ReceiptRefreshProvider.swift b/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/ReceiptRefreshProvider.swift index 2ed574331..fcfdc6fd0 100644 --- a/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/ReceiptRefreshProvider.swift +++ b/Sources/Flare/Classes/Providers/ReceiptRefreshProvider/ReceiptRefreshProvider.swift @@ -13,21 +13,33 @@ final class ReceiptRefreshProvider: NSObject { // MARK: Properties private let dispatchQueueFactory: IDispatchQueueFactory + private let fileManager: IFileManager + private let appStoreReceiptProvider: IAppStoreReceiptProvider + private let receiptRefreshRequestFactory: IReceiptRefreshRequestFactory + private var handlers: [String: ReceiptRefreshHandler] = [:] private lazy var dispatchQueue: IDispatchQueue = dispatchQueueFactory.privateQueue(label: String(describing: self)) // MARK: Initialization - init(dispatchQueueFactory: IDispatchQueueFactory = DispatchQueueFactory()) { + init( + dispatchQueueFactory: IDispatchQueueFactory = DispatchQueueFactory(), + fileManager: IFileManager = FileManager.default, + appStoreReceiptProvider: IAppStoreReceiptProvider = Bundle.main, + receiptRefreshRequestFactory: IReceiptRefreshRequestFactory = ReceiptRefreshRequestFactory() + ) { self.dispatchQueueFactory = dispatchQueueFactory + self.fileManager = fileManager + self.appStoreReceiptProvider = appStoreReceiptProvider + self.receiptRefreshRequestFactory = receiptRefreshRequestFactory } // MARK: Internal var receipt: String? { - if let appStoreReceiptURL = Bundle.main.appStoreReceiptURL, - FileManager.default.fileExists(atPath: appStoreReceiptURL.path) + if let appStoreReceiptURL = appStoreReceiptProvider.appStoreReceiptURL, + fileManager.fileExists(atPath: appStoreReceiptURL.path) { let receiptData = try? Data(contentsOf: appStoreReceiptURL, options: .alwaysMapped) let receiptString = receiptData?.base64EncodedString(options: []) @@ -38,14 +50,11 @@ final class ReceiptRefreshProvider: NSObject { // MARK: Private - private func makeRequest(id: String) -> SKReceiptRefreshRequest { - let request = SKReceiptRefreshRequest() - request.id = id - request.delegate = self - return request + private func makeRequest(id: String) -> IReceiptRefreshRequest { + receiptRefreshRequestFactory.make(requestID: id, delegate: self) } - private func fetch(request: SKRequest, handler: @escaping ReceiptRefreshHandler) { + private func fetch(request: IReceiptRefreshRequest, handler: @escaping ReceiptRefreshHandler) { dispatchQueue.async { self.handlers[request.id] = handler self.dispatchQueueFactory.main().async { @@ -58,10 +67,18 @@ final class ReceiptRefreshProvider: NSObject { // MARK: IReceiptRefreshProvider extension ReceiptRefreshProvider: IReceiptRefreshProvider { - func refresh(requestId: String, handler: @escaping ReceiptRefreshHandler) { - let request = makeRequest(id: requestId) + func refresh(requestID: String, handler: @escaping ReceiptRefreshHandler) { + let request = makeRequest(id: requestID) fetch(request: request, handler: handler) } + + func refresh(requestID: String) async throws { + try await withCheckedThrowingContinuation { continuation in + refresh(requestID: requestID) { result in + continuation.resume(with: result) + } + } + } } // MARK: SKRequestDelegate diff --git a/Sources/Flare/Flare.swift b/Sources/Flare/Flare.swift index c560800f9..e733b19e5 100644 --- a/Sources/Flare/Flare.swift +++ b/Sources/Flare/Flare.swift @@ -26,17 +26,21 @@ public final class Flare { // MARK: IFlare extension Flare: IFlare { - public func fetch(ids: Set, completion: @escaping Closure>) { - iapProvider.fetch(productsIds: ids, completion: completion) + public func fetch(productIDs: Set, completion: @escaping Closure>) { + iapProvider.fetch(productIDs: productIDs, completion: completion) } - public func buy(id: String, completion: @escaping Closure>) { + public func fetch(productIDs: Set) async throws -> [SKProduct] { + try await iapProvider.fetch(productIDs: productIDs) + } + + public func purchase(productID: String, completion: @escaping Closure>) { guard iapProvider.canMakePayments else { completion(.failure(.paymentNotAllowed)) return } - iapProvider.purchase(productId: id) { result in + iapProvider.purchase(productID: productID) { result in switch result { case let .success(transaction): completion(.success(transaction)) @@ -46,6 +50,11 @@ extension Flare: IFlare { } } + public func purchase(productID: String) async throws -> PaymentTransaction { + guard iapProvider.canMakePayments else { throw IAPError.paymentNotAllowed } + return try await iapProvider.purchase(productID: productID) + } + public func receipt(completion: @escaping Closure>) { iapProvider.refreshReceipt { result in switch result { @@ -57,6 +66,10 @@ extension Flare: IFlare { } } + public func receipt() async throws -> String { + try await iapProvider.refreshReceipt() + } + public func finish(transaction: PaymentTransaction) { iapProvider.finish(transaction: transaction) } diff --git a/Sources/Flare/IFlare.swift b/Sources/Flare/IFlare.swift index 881fec7e9..36676fa09 100644 --- a/Sources/Flare/IFlare.swift +++ b/Sources/Flare/IFlare.swift @@ -6,37 +6,74 @@ import Foundation import StoreKit +/// `Flare` creates and manages in-app purchases. public protocol IFlare { - /// Retrieve localized information from the App Store about a specified list of products. + /// Retrieves localized information from the App Store about a specified list of products. /// /// - Parameters: - /// - ids: The list of product identifiers for the products you wish to retrieve descriptions of. - /// - completion: A products handler. - func fetch(ids: Set, completion: @escaping Closure>) + /// - productIDs: The list of product identifiers for which you wish to retrieve descriptions. + /// - completion: The completion containing the response of retrieving products. + func fetch(productIDs: Set, completion: @escaping Closure>) - /// Perform purchase a product with given id. + /// Retrieves localized information from the App Store about a specified list of products. + /// + /// - Parameter productIDs: The list of product identifiers for which you wish to retrieve descriptions. + /// + /// - Throws: `IAPError(error:)` if the request did fail with error. + /// + /// - Returns: An array of products. + func fetch(productIDs: Set) async throws -> [SKProduct] + + /// Performs a purchase of a product with a given ID. + /// + /// - Note: The method automatically checks if the user can purchase a product. + /// If the user can't make a payment, the method returns an error + /// with the type `IAPError.paymentNotAllowed`. /// /// - Parameters: - /// - id: A product identifier. - /// - completion: A block object to be executed when the purchase operation ends. - func buy(id: String, completion: @escaping Closure>) + /// - productID: The product identifier. + /// - completion: The closure to be executed once the purchase is complete. + func purchase(productID: String, completion: @escaping Closure>) - /// A request to refresh the receipt, which represents the user’s transactions with your app. + /// Purchases a product with a given ID. + /// + /// - Note: The method automatically checks if the user can purchase a product. + /// If the user can't make a payment, the method returns an error + /// with the type `IAPError.paymentNotAllowed`. + /// + /// - Parameter productID: The product identifier. + /// + /// - Throws: `IAPError.paymentNotAllowed` if user can't make payment. /// - /// - Parameter completion: A block object to be executed when the refresh operation ends. + /// - Returns: A payment transaction. + func purchase(productID: String) async throws -> PaymentTransaction + + /// Refreshes the receipt, representing the user's transactions with your app. + /// + /// - Parameter completion: The closure to be executed when the refresh operation ends. func receipt(completion: @escaping Closure>) - /// Remove a finished (i.e. failed or completed) transaction from the queue. + /// Refreshes the receipt, representing the user's transactions with your app. + /// + /// `IAPError(error:)` if the request did fail with error. + /// + /// - Returns: A receipt. + func receipt() async throws -> String + + /// Removes a finished (i.e. failed or completed) transaction from the queue. /// Attempting to finish a purchasing transaction will throw an exception. /// /// - Parameter transaction: An object in the payment queue. func finish(transaction: PaymentTransaction) /// The transactions array will only be synchronized with the server while the queue has observers. - /// This may require that the user authenticate + /// + /// - Note: This may require that the user authenticate. func addTransactionObserver(fallbackHandler: Closure>?) + /// Removes transaction observer from the payment queue. /// The transactions array will only be synchronized with the server while the queue has observers. - /// This may require that the user authenticate + /// + /// - Note: This may require that the user authenticate. func removeTransactionObserver() } diff --git a/Tests/FlareTests/Classes/FlareTests.swift b/Tests/FlareTests/Classes/FlareTests.swift deleted file mode 100644 index 323e977ab..000000000 --- a/Tests/FlareTests/Classes/FlareTests.swift +++ /dev/null @@ -1,83 +0,0 @@ -// -// Flare -// Copyright © 2023 Space Code. All rights reserved. -// - -@testable import Flare -import StoreKit -import XCTest - -class FlareTests: XCTestCase { - // MARK: - Properties - - private var iapProviderMock: IAPProviderMock! - private var flare: Flare! - - // MARK: - XCTestCase - - override func setUp() { - super.setUp() - iapProviderMock = IAPProviderMock() - flare = Flare(iapProvider: iapProviderMock) - } - - override func tearDown() { - iapProviderMock = nil - flare = nil - super.tearDown() - } - - // MARK: - Tests - - func testThatPurchaseManagerFetchProducts() { - // given - let ids = Set(arrayLiteral: "1", "2", "3") - - // when - flare.fetch(ids: ids, completion: { _ in }) - - // then - XCTAssertTrue(iapProviderMock.invokedFetch) - } - - func testThatPurchaseManagerBuyProductWhenCanMakePayments() { - // given - let productId = "product_identifier" - iapProviderMock.stubbedCanMakePayments = true - - // when - flare.buy(id: productId, completion: { _ in }) - - // then - XCTAssertTrue(iapProviderMock.invokedPurchase) - XCTAssertEqual(iapProviderMock.invokedPurchaseParameters?.productId, productId) - } - - func testThatPurchaseManagerDontBuyProductWhenCannotMakePayments() { - // given - let productId = "product_identifier" - iapProviderMock.stubbedCanMakePayments = false - - // when - flare.buy(id: productId, completion: { _ in }) - - // then - XCTAssertFalse(iapProviderMock.invokedPurchase) - } - - func testThatPurchaseManagerFetchReceipt() { - // when - flare.receipt(completion: { _ in }) - - // then - XCTAssertTrue(iapProviderMock.invokedRefreshReceipt) - } - - func testThatPurchaseManagerRemoveTransactionObserver() { - // when - flare.removeTransactionObserver() - - // then - XCTAssertTrue(iapProviderMock.invokedRemoveTransactionObserver) - } -} diff --git a/Tests/FlareTests/Classes/Mocks/IAPProviderMock.swift b/Tests/FlareTests/Classes/Mocks/IAPProviderMock.swift deleted file mode 100644 index 5b1ff51de..000000000 --- a/Tests/FlareTests/Classes/Mocks/IAPProviderMock.swift +++ /dev/null @@ -1,87 +0,0 @@ -// -// Flare -// Copyright © 2023 Space Code. All rights reserved. -// - -@testable import Flare -import StoreKit - -final class IAPProviderMock: IIAPProvider { - var invokedCanMakePayments = false - var invokedCanMakePaymentsCount = 0 - var stubbedCanMakePayments: Bool = false - - var canMakePayments: Bool { - invokedCanMakePayments = true - invokedCanMakePaymentsCount += 1 - return stubbedCanMakePayments - } - - var invokedFetch = false - var invokedFetchCount = 0 - var invokedFetchParameters: (productsIds: Set, completion: Closure>)? - var invokedFetchParametersList = [(productsIds: Set, completion: Closure>)]() - - func fetch(productsIds: Set, completion: @escaping Closure>) { - invokedFetch = true - invokedFetchCount += 1 - invokedFetchParameters = (productsIds, completion) - invokedFetchParametersList.append((productsIds, completion)) - } - - var invokedPurchase = false - var invokedPurchaseCount = 0 - var invokedPurchaseParameters: (productId: String, completion: Closure>)? - var invokedPurchaseParametersList = [(productId: String, completion: Closure>)]() - - func purchase(productId: String, completion: @escaping Closure>) { - invokedPurchase = true - invokedPurchaseCount += 1 - invokedPurchaseParameters = (productId, completion) - invokedPurchaseParametersList.append((productId, completion)) - } - - var invokedRefreshReceipt = false - var invokedRefreshReceiptCount = 0 - var invokedRefreshReceiptParameters: (Closure>, Void)? - var invokedRefreshReceiptParametersList = [(Closure>, Void)]() - - func refreshReceipt(completion: @escaping Closure>) { - invokedRefreshReceipt = true - invokedRefreshReceiptCount += 1 - invokedRefreshReceiptParameters = (completion, ()) - invokedRefreshReceiptParametersList.append((completion, ())) - } - - var invokedFinishTransaction = false - var invokedFinishTransactionCount = 0 - var invokedFinishTransactionParameters: (PaymentTransaction, Void)? - var invokedFinishTransactionParanetersList = [(PaymentTransaction, Void)]() - - func finish(transaction: PaymentTransaction) { - invokedFinishTransaction = true - invokedFinishTransactionCount += 1 - invokedFinishTransactionParameters = (transaction, ()) - invokedFinishTransactionParanetersList.append((transaction, ())) - } - - var invokedAddTransactionObserver = false - var invokedAddTransactionObserverCount = 0 - var invokedAddTransactionObserverParameters: (fallbackHandler: Closure>?, Void)? - var invokedAddTransactionObserverParametersList = [(fallbackHandler: Closure>?, Void)]() - - func addTransactionObserver(fallbackHandler: Closure>?) { - invokedAddTransactionObserver = true - invokedAddTransactionObserverCount += 1 - invokedAddTransactionObserverParameters = (fallbackHandler, ()) - invokedAddTransactionObserverParametersList.append((fallbackHandler, ())) - } - - var invokedRemoveTransactionObserver = false - var invokedRemoveTransactionObserverCount = 0 - - func removeTransactionObserver() { - invokedRemoveTransactionObserver = true - invokedRemoveTransactionObserverCount += 1 - } -} diff --git a/Tests/FlareTests/Classes/Mocks/ProductProviderMock.swift b/Tests/FlareTests/Classes/Mocks/ProductProviderMock.swift deleted file mode 100644 index 48e5ee4b5..000000000 --- a/Tests/FlareTests/Classes/Mocks/ProductProviderMock.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// Flare -// Copyright © 2023 Space Code. All rights reserved. -// - -@testable import Flare - -final class ProductProviderMock: IProductProvider { - var invokedFetch = false - var invokedFetchCount = 0 - var invokedFetchParameters: (productIds: Set, requestId: String, completion: ProductsHandler)? - var invokedFetchParamtersList = [(productIds: Set, requestId: String, completion: ProductsHandler)]() - - func fetch(productIds: Set, requestId: String, completion: @escaping ProductsHandler) { - invokedFetch = true - invokedFetchCount += 1 - invokedFetchParameters = (productIds, requestId, completion) - invokedFetchParamtersList.append((productIds, requestId, completion)) - } -} diff --git a/Tests/FlareTests/Classes/Mocks/ReceiptRefreshProviderMock.swift b/Tests/FlareTests/Classes/Mocks/ReceiptRefreshProviderMock.swift deleted file mode 100644 index 886e9aedc..000000000 --- a/Tests/FlareTests/Classes/Mocks/ReceiptRefreshProviderMock.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// Flare -// Copyright © 2023 Space Code. All rights reserved. -// - -@testable import Flare - -final class ReceiptRefreshProviderMock: IReceiptRefreshProvider { - var invokedReceipt = false - var invokedReceiptCount = 0 - var stubbedReceipt: String? - - var receipt: String? { - invokedReceipt = true - invokedReceiptCount += 1 - return stubbedReceipt - } - - var invokedRefresh = false - var invokedRefreshCount = 0 - var invokedRefreshParameters: (requestId: String, handler: ReceiptRefreshHandler)? - var invokedRefreshParametersList = [(requestId: String, handler: ReceiptRefreshHandler)]() - - func refresh(requestId: String, handler: @escaping ReceiptRefreshHandler) { - invokedRefresh = true - invokedRefreshCount += 1 - invokedRefreshParameters = (requestId, handler) - invokedRefreshParametersList.append((requestId, handler)) - } -} diff --git a/Tests/FlareTests/Classes/Providers/IAPProviderTests.swift b/Tests/FlareTests/Classes/Providers/IAPProviderTests.swift deleted file mode 100644 index e18083bf5..000000000 --- a/Tests/FlareTests/Classes/Providers/IAPProviderTests.swift +++ /dev/null @@ -1,121 +0,0 @@ -// -// Flare -// Copyright © 2023 Space Code. All rights reserved. -// - -@testable import Flare -import StoreKit -import XCTest - -private extension String { - static let productId = "product_identifier" -} - -private extension Set where Element == String { - static let productIds: Set = .init(arrayLiteral: "1", "2", "3") -} - -// MARK: - IAPProviderTests - -class IAPProviderTests: XCTestCase { - // MARK: - Properties - - private var paymentQueueMock: PaymentQueueMock! - private var productProviderMock: ProductProviderMock! - private var paymentProviderMock: PaymentProviderMock! - private var receiptRefreshProviderMock: ReceiptRefreshProviderMock! - private var iapProvider: IIAPProvider! - - // MARK: - XCTestCase - - override func setUp() { - super.setUp() - paymentQueueMock = PaymentQueueMock() - productProviderMock = ProductProviderMock() - paymentProviderMock = PaymentProviderMock() - receiptRefreshProviderMock = ReceiptRefreshProviderMock() - iapProvider = IAPProvider( - paymentQueue: paymentQueueMock, - productProvider: productProviderMock, - paymentProvider: paymentProviderMock, - receiptRefreshProvider: receiptRefreshProviderMock - ) - } - - override func tearDown() { - paymentQueueMock = nil - productProviderMock = nil - paymentProviderMock = nil - receiptRefreshProviderMock = nil - iapProvider = nil - super.tearDown() - } - - // MARK: - Tests - - func testThatIAPProviderCanMakePayments() { - // given - paymentQueueMock.stubbedCanMakePayments = true - - // then - XCTAssertTrue(iapProvider.canMakePayments) - } - - func testThatIAPProviderFetchProducts() throws { - // given - - // when - iapProvider.fetch(productsIds: .productIds, completion: { _ in }) - - // then - let parameters = try XCTUnwrap(productProviderMock.invokedFetchParameters) - XCTAssertEqual(parameters.productIds, .productIds) - XCTAssertTrue(!parameters.requestId.isEmpty) - } - - func testThatIAPProviderPurchaseProduct() throws { - // given - - // when - iapProvider.purchase(productId: .productId, completion: { _ in }) - - // then - XCTAssertTrue(productProviderMock.invokedFetch) - } - - func testThatIAPProviderRefreshReceipt() { - // when - iapProvider.refreshReceipt(completion: { _ in }) - - // then - XCTAssertTrue(receiptRefreshProviderMock.invokedRefresh) - } - - func testThatIAPProviderFinishTransaction() { - // given - let transaction = PurchaseManagerTestHelper.makePaymentTransaction(state: .purchased) - - // when - iapProvider.finish(transaction: PaymentTransaction(transaction)) - - // then - XCTAssertTrue(paymentProviderMock.invokedFinishTransaction) - } - - func testThatIAPProviderAddTransactionObserver() { - // when - iapProvider.addTransactionObserver(fallbackHandler: { _ in }) - - // then - XCTAssertTrue(paymentProviderMock.invokedFallbackHandler) - XCTAssertTrue(paymentProviderMock.invokedAddTransactionObserver) - } - - func testThatIAPProviderRemoveTransactionObserver() { - // when - iapProvider.removeTransactionObserver() - - // then - XCTAssertTrue(paymentProviderMock.invokedRemoveTransactionObserver) - } -} diff --git a/Tests/FlareTests/Classes/Providers/ReceiptRefreshProviderTests.swift b/Tests/FlareTests/Classes/Providers/ReceiptRefreshProviderTests.swift deleted file mode 100644 index 112fd8261..000000000 --- a/Tests/FlareTests/Classes/Providers/ReceiptRefreshProviderTests.swift +++ /dev/null @@ -1,73 +0,0 @@ -// -// Flare -// Copyright © 2023 Space Code. All rights reserved. -// - -@testable import Flare -import TestConcurrency -import XCTest - -private extension String { - static let requestId = "request_identifier" -} - -// MARK: - ReceiptRefreshProviderTests - -class ReceiptRefreshProviderTests: XCTestCase { - // MARK: - Properties - - private var testDispatchQueue: TestDispatchQueue! - private var dispatchQueueFactory: TestDispatchQueueFactory! - private var receiptRefreshProvider: ReceiptRefreshProvider! - - // MARK: - XCTestCase - - override func setUp() { - super.setUp() - testDispatchQueue = TestDispatchQueue() - dispatchQueueFactory = TestDispatchQueueFactory(testQueue: testDispatchQueue) - receiptRefreshProvider = ReceiptRefreshProvider(dispatchQueueFactory: dispatchQueueFactory) - } - - override func tearDown() { - testDispatchQueue = nil - dispatchQueueFactory = nil - receiptRefreshProvider = nil - super.tearDown() - } - - // MARK: - Tests - - func testThatReceiptRefreshProviderHandleRequestError() { - // given - var result: Result? - let request = PurchaseManagerTestHelper.makeRequest(with: .requestId) - let handler: ReceiptRefreshHandler = { result = $0 } - let error = IAPError.paymentCancelled - - // when - receiptRefreshProvider.refresh(requestId: .requestId, handler: handler) - receiptRefreshProvider.request(request, didFailWithError: error) - - // then - if case let .failure(resultError) = result { - XCTAssertEqual(resultError.plainError as NSError, error.plainError as NSError) - } - } - - func testThatReceiptRefreshProviderFinishRequest() { - // given - var result: Result? - let request = PurchaseManagerTestHelper.makeRequest(with: .requestId) - let handler: ReceiptRefreshHandler = { result = $0 } - - // when - receiptRefreshProvider.refresh(requestId: .requestId, handler: handler) - receiptRefreshProvider.requestDidFinish(request) - - // then - if case .failure = result { - XCTFail() - } - } -} diff --git a/Tests/FlareTests/Classes/Helpers/PurchaseManagerTestHelper.swift b/Tests/FlareTests/Helpers/PurchaseManagerTestHelper.swift similarity index 100% rename from Tests/FlareTests/Classes/Helpers/PurchaseManagerTestHelper.swift rename to Tests/FlareTests/Helpers/PurchaseManagerTestHelper.swift diff --git a/Tests/FlareTests/Mocks/AppStoreReceiptProviderMock.swift b/Tests/FlareTests/Mocks/AppStoreReceiptProviderMock.swift new file mode 100644 index 000000000..f5d1ea48f --- /dev/null +++ b/Tests/FlareTests/Mocks/AppStoreReceiptProviderMock.swift @@ -0,0 +1,19 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import Foundation + +final class AppStoreReceiptProviderMock: IAppStoreReceiptProvider { + var invokedAppStoreReceiptURLGetter = false + var invokedAppStoreReceiptURLGetterCount = 0 + var stubbedAppStoreReceiptURL: URL! + + var appStoreReceiptURL: URL? { + invokedAppStoreReceiptURLGetter = true + invokedAppStoreReceiptURLGetterCount += 1 + return stubbedAppStoreReceiptURL + } +} diff --git a/Tests/FlareTests/Mocks/FileManagerMock.swift b/Tests/FlareTests/Mocks/FileManagerMock.swift new file mode 100644 index 000000000..f80a2b988 --- /dev/null +++ b/Tests/FlareTests/Mocks/FileManagerMock.swift @@ -0,0 +1,23 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import Foundation + +final class FileManagerMock: IFileManager { + var invokedFileExists = false + var invokedFileExistsCount = 0 + var invokedFileExistsParameters: (path: String, Void)? + var invokedFileExistsParametersList = [(path: String, Void)]() + var stubbedFileExistsResult: Bool! = false + + func fileExists(atPath path: String) -> Bool { + invokedFileExists = true + invokedFileExistsCount += 1 + invokedFileExistsParameters = (path, ()) + invokedFileExistsParametersList.append((path, ())) + return stubbedFileExistsResult + } +} diff --git a/Tests/FlareTests/Mocks/IAPProviderMock.swift b/Tests/FlareTests/Mocks/IAPProviderMock.swift new file mode 100644 index 000000000..a6ea5b23a --- /dev/null +++ b/Tests/FlareTests/Mocks/IAPProviderMock.swift @@ -0,0 +1,140 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import StoreKit + +final class IAPProviderMock: IIAPProvider { + var invokedCanMakePayments = false + var invokedCanMakePaymentsCount = 0 + var stubbedCanMakePayments: Bool = false + + var canMakePayments: Bool { + invokedCanMakePayments = true + invokedCanMakePaymentsCount += 1 + return stubbedCanMakePayments + } + + var invokedFetch = false + var invokedFetchCount = 0 + var invokedFetchParameters: (productIDs: Set, completion: Closure>)? + var invokedFetchParametersList = [(productIDs: Set, completion: Closure>)]() + + func fetch(productIDs: Set, completion: @escaping Closure>) { + invokedFetch = true + invokedFetchCount += 1 + invokedFetchParameters = (productIDs, completion) + invokedFetchParametersList.append((productIDs, completion)) + } + + var invokedPurchase = false + var invokedPurchaseCount = 0 + var invokedPurchaseParameters: (productID: String, completion: Closure>)? + var invokedPurchaseParametersList = [(productID: String, completion: Closure>)]() + + func purchase(productID: String, completion: @escaping Closure>) { + invokedPurchase = true + invokedPurchaseCount += 1 + invokedPurchaseParameters = (productID, completion) + invokedPurchaseParametersList.append((productID, completion)) + } + + var invokedRefreshReceipt = false + var invokedRefreshReceiptCount = 0 + var invokedRefreshReceiptParameters: (completion: Closure>, Void)? + var invokedRefreshReceiptParametersList = [(completion: Closure>, Void)]() + var stubbedRefreshReceiptResult: Result? + + func refreshReceipt(completion: @escaping Closure>) { + invokedRefreshReceipt = true + invokedRefreshReceiptCount += 1 + invokedRefreshReceiptParameters = (completion, ()) + invokedRefreshReceiptParametersList.append((completion, ())) + + if let result = stubbedRefreshReceiptResult { + completion(result) + } + } + + var invokedFinishTransaction = false + var invokedFinishTransactionCount = 0 + var invokedFinishTransactionParameters: (PaymentTransaction, Void)? + var invokedFinishTransactionParanetersList = [(PaymentTransaction, Void)]() + + func finish(transaction: PaymentTransaction) { + invokedFinishTransaction = true + invokedFinishTransactionCount += 1 + invokedFinishTransactionParameters = (transaction, ()) + invokedFinishTransactionParanetersList.append((transaction, ())) + } + + var invokedAddTransactionObserver = false + var invokedAddTransactionObserverCount = 0 + var invokedAddTransactionObserverParameters: (fallbackHandler: Closure>?, Void)? + var invokedAddTransactionObserverParametersList = [(fallbackHandler: Closure>?, Void)]() + + func addTransactionObserver(fallbackHandler: Closure>?) { + invokedAddTransactionObserver = true + invokedAddTransactionObserverCount += 1 + invokedAddTransactionObserverParameters = (fallbackHandler, ()) + invokedAddTransactionObserverParametersList.append((fallbackHandler, ())) + } + + var invokedRemoveTransactionObserver = false + var invokedRemoveTransactionObserverCount = 0 + + func removeTransactionObserver() { + invokedRemoveTransactionObserver = true + invokedRemoveTransactionObserverCount += 1 + } + + var invokedFetchAsync = false + var invokedFetchAsyncCount = 0 + var invokedFetchAsyncParameters: (productIDs: Set, Void)? + var invokedFetchAsyncParametersList = [(productIDs: Set, Void)]() + var fetchAsyncResult: [SKProduct] = [] + + func fetch(productIDs: Set) async throws -> [SKProduct] { + invokedFetchAsync = true + invokedFetchAsyncCount += 1 + invokedFetchAsyncParameters = (productIDs, ()) + invokedFetchAsyncParametersList.append((productIDs, ())) + return fetchAsyncResult + } + + var invokedAsyncPurchase = false + var invokedAsyncPurchaseCount = 0 + var invokedAsyncPurchaseParameters: (productID: String, Void)? + var invokedAsyncPurchaseParametersList = [(productID: String, Void)?]() + var stubbedAsyncPurchase: PaymentTransaction! + + func purchase(productID: String) async throws -> PaymentTransaction { + invokedAsyncPurchase = true + invokedAsyncPurchaseCount += 1 + invokedAsyncPurchaseParameters = (productID, ()) + invokedAsyncPurchaseParametersList.append((productID, ())) + return stubbedAsyncPurchase + } + + var invokedAsyncRefreshReceipt = false + var invokedAsyncRefreshReceiptCounter = 0 + var stubbedRefreshReceiptAsyncResult: Result! + + func refreshReceipt() async throws -> String { + invokedAsyncRefreshReceipt = true + invokedAsyncRefreshReceiptCounter += 1 + + let result = stubbedRefreshReceiptAsyncResult + + switch result { + case let .success(receipt): + return receipt + case let .failure(error): + throw error + default: + fatalError("An unknown type") + } + } +} diff --git a/Tests/FlareTests/Classes/Mocks/PaymentProviderMock.swift b/Tests/FlareTests/Mocks/PaymentProviderMock.swift similarity index 85% rename from Tests/FlareTests/Classes/Mocks/PaymentProviderMock.swift rename to Tests/FlareTests/Mocks/PaymentProviderMock.swift index 8e2558e35..902f19210 100644 --- a/Tests/FlareTests/Classes/Mocks/PaymentProviderMock.swift +++ b/Tests/FlareTests/Mocks/PaymentProviderMock.swift @@ -59,24 +59,29 @@ final class PaymentProviderMock: IPaymentProvider { var invokedAddCount = 0 var invokedAddParameters: (payment: SKPayment, handler: PaymentHandler)? var invokedAddParametersList = [(payment: SKPayment, handler: PaymentHandler)]() + var stubbedAddResult: (queue: PaymentQueue, result: Result)? func add(payment: SKPayment, handler: @escaping PaymentHandler) { invokedAdd = true invokedAddCount += 1 invokedAddParameters = (payment, handler) invokedAddParametersList.append((payment, handler)) + + if let result = stubbedAddResult { + handler(result.0, result.1) + } } var invokedAddPaymentHandler = false var invokedAddPaymentHandlerCount = 0 - var invokedAddPaymentHandlerParameters: (productIdentifier: String, handler: PaymentHandler)? + var invokedAddPaymentHandlerParameters: (productID: String, handler: PaymentHandler)? var invokedAddPaymentHandlerParametersList = [(productIdentifier: String, handler: PaymentHandler)]() - func addPaymentHandler(withProductIdentifier: String, handler: @escaping PaymentHandler) { + func addPaymentHandler(productID: String, handler: @escaping PaymentHandler) { invokedAddPaymentHandler = true invokedAddPaymentHandlerCount += 1 - invokedAddPaymentHandlerParameters = (withProductIdentifier, handler) - invokedAddPaymentHandlerParametersList.append((withProductIdentifier, handler)) + invokedAddPaymentHandlerParameters = (productID, handler) + invokedAddPaymentHandlerParametersList.append((productID, handler)) } var invokedSetAddStorePaymentHandler = false @@ -95,12 +100,17 @@ final class PaymentProviderMock: IPaymentProvider { var invokedFallbackHandlerCount = 0 var invokedFallbackHandlerParameters: (PaymentHandler, Void)? var invokedFallbackHandlerParametersList = [(PaymentHandler, Void)]() + var stubbedFallbackHandlerResult: (queue: PaymentQueue, result: Result)? func set(fallbackHandler: @escaping PaymentHandler) { invokedFallbackHandler = true invokedFallbackHandlerCount += 1 invokedFallbackHandlerParameters = (fallbackHandler, ()) invokedFallbackHandlerParametersList.append((fallbackHandler, ())) + + if let result = stubbedFallbackHandlerResult { + fallbackHandler(result.queue, result.result) + } } var invokedFinishTransaction = false diff --git a/Tests/FlareTests/Classes/Mocks/PaymentQueueMock.swift b/Tests/FlareTests/Mocks/PaymentQueueMock.swift similarity index 100% rename from Tests/FlareTests/Classes/Mocks/PaymentQueueMock.swift rename to Tests/FlareTests/Mocks/PaymentQueueMock.swift diff --git a/Tests/FlareTests/Classes/Mocks/PaymentTransactionMock.swift b/Tests/FlareTests/Mocks/PaymentTransactionMock.swift similarity index 81% rename from Tests/FlareTests/Classes/Mocks/PaymentTransactionMock.swift rename to Tests/FlareTests/Mocks/PaymentTransactionMock.swift index 26838815d..efae4bd7d 100644 --- a/Tests/FlareTests/Classes/Mocks/PaymentTransactionMock.swift +++ b/Tests/FlareTests/Mocks/PaymentTransactionMock.swift @@ -33,4 +33,14 @@ final class PaymentTransactionMock: SKPaymentTransaction { invokedPaymentCount += 1 return stubbedPayment } + + var stubbedOriginal: SKPaymentTransaction? + override var original: SKPaymentTransaction? { + stubbedOriginal + } + + var stubbedError: Error? + override var error: Error? { + stubbedError + } } diff --git a/Tests/FlareTests/Classes/Mocks/ProductMock.swift b/Tests/FlareTests/Mocks/ProductMock.swift similarity index 59% rename from Tests/FlareTests/Classes/Mocks/ProductMock.swift rename to Tests/FlareTests/Mocks/ProductMock.swift index 797690d58..e15937e91 100644 --- a/Tests/FlareTests/Classes/Mocks/ProductMock.swift +++ b/Tests/FlareTests/Mocks/ProductMock.swift @@ -8,11 +8,23 @@ import StoreKit final class ProductMock: SKProduct { var invokedProductIdentifier = false var invokedProductIdentifierCount = 0 - var stubbedProductIdentifier: String! + var stubbedProductIdentifier: String = "" override var productIdentifier: String { invokedProductIdentifier = true invokedProductIdentifierCount += 1 return stubbedProductIdentifier } + + var stubbedPriceLocale: Locale! + + override var priceLocale: Locale { + stubbedPriceLocale + } + + var stubbedPrice: NSDecimalNumber! + + override var price: NSDecimalNumber { + stubbedPrice + } } diff --git a/Tests/FlareTests/Mocks/ProductProviderMock.swift b/Tests/FlareTests/Mocks/ProductProviderMock.swift new file mode 100644 index 000000000..5480426d4 --- /dev/null +++ b/Tests/FlareTests/Mocks/ProductProviderMock.swift @@ -0,0 +1,26 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import class StoreKit.SKProduct + +final class ProductProviderMock: IProductProvider { + var invokedFetch = false + var invokedFetchCount = 0 + var invokedFetchParameters: (productIDs: Set, requestID: String, completion: ProductsHandler)? + var invokedFetchParamtersList = [(productIDs: Set, requestID: String, completion: ProductsHandler)]() + var stubbedFetchResult: Result<[SKProduct], IAPError>? + + func fetch(productIDs: Set, requestID: String, completion: @escaping ProductsHandler) { + invokedFetch = true + invokedFetchCount += 1 + invokedFetchParameters = (productIDs, requestID, completion) + invokedFetchParamtersList.append((productIDs, requestID, completion)) + + if let result = stubbedFetchResult { + completion(result) + } + } +} diff --git a/Tests/FlareTests/Classes/Mocks/ProductResponseMock.swift b/Tests/FlareTests/Mocks/ProductResponseMock.swift similarity index 100% rename from Tests/FlareTests/Classes/Mocks/ProductResponseMock.swift rename to Tests/FlareTests/Mocks/ProductResponseMock.swift diff --git a/Tests/FlareTests/Classes/Mocks/ProductsRequestMock.swift b/Tests/FlareTests/Mocks/ProductsRequestMock.swift similarity index 100% rename from Tests/FlareTests/Classes/Mocks/ProductsRequestMock.swift rename to Tests/FlareTests/Mocks/ProductsRequestMock.swift diff --git a/Tests/FlareTests/Mocks/ReceiptRefreshProviderMock.swift b/Tests/FlareTests/Mocks/ReceiptRefreshProviderMock.swift new file mode 100644 index 000000000..bfcdc3ba4 --- /dev/null +++ b/Tests/FlareTests/Mocks/ReceiptRefreshProviderMock.swift @@ -0,0 +1,47 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare + +final class ReceiptRefreshProviderMock: IReceiptRefreshProvider { + var invokedReceipt = false + var invokedReceiptCount = 0 + var stubbedReceipt: String? + + var receipt: String? { + invokedReceipt = true + invokedReceiptCount += 1 + return stubbedReceipt + } + + var invokedRefresh = false + var invokedRefreshCount = 0 + var invokedRefreshParameters: (requestID: String, handler: ReceiptRefreshHandler)? + var invokedRefreshParametersList = [(requestID: String, handler: ReceiptRefreshHandler)]() + var stubbedRefreshResult: Result? + + func refresh(requestID: String, handler: @escaping ReceiptRefreshHandler) { + invokedRefresh = true + invokedRefreshCount += 1 + invokedRefreshParameters = (requestID, handler) + invokedRefreshParametersList.append((requestID, handler)) + + if let result = stubbedRefreshResult { + handler(result) + } + } + + var invokedAsyncRefresh = false + var invokedAsyncRefreshCount = 0 + var invokedAsyncRefreshParameters: (requestID: String, Void)? + var invokedAsyncRefreshParametersList = [(requestID: String, Void)]() + + func refresh(requestID: String) async throws { + invokedAsyncRefresh = true + invokedAsyncRefreshCount += 1 + invokedAsyncRefreshParameters = (requestID, ()) + invokedAsyncRefreshParametersList.append((requestID, ())) + } +} diff --git a/Tests/FlareTests/Mocks/ReceiptRefreshRequestFactory.swift b/Tests/FlareTests/Mocks/ReceiptRefreshRequestFactory.swift new file mode 100644 index 000000000..256400c75 --- /dev/null +++ b/Tests/FlareTests/Mocks/ReceiptRefreshRequestFactory.swift @@ -0,0 +1,24 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import Foundation +import protocol StoreKit.SKRequestDelegate + +final class ReceiptRefreshRequestFactoryMock: IReceiptRefreshRequestFactory { + var invokedMake = false + var invokedMakeCount = 0 + var invokedMakeParameters: (requestID: String, delegate: SKRequestDelegate?)? + var invokedMakeParametersList = [(requestID: String, delegate: SKRequestDelegate?)]() + var stubbedMakeResult: IReceiptRefreshRequest! + + func make(requestID: String, delegate: SKRequestDelegate?) -> IReceiptRefreshRequest { + invokedMake = true + invokedMakeCount += 1 + invokedMakeParameters = (requestID, delegate) + invokedMakeParametersList.append((requestID, delegate)) + return stubbedMakeResult + } +} diff --git a/Tests/FlareTests/Mocks/ReceiptRefreshRequestMock.swift b/Tests/FlareTests/Mocks/ReceiptRefreshRequestMock.swift new file mode 100644 index 000000000..9ffbfc7c4 --- /dev/null +++ b/Tests/FlareTests/Mocks/ReceiptRefreshRequestMock.swift @@ -0,0 +1,41 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import Foundation + +final class ReceiptRefreshRequestMock: IReceiptRefreshRequest { + var invokedIdSetter = false + var invokedIdSetterCount = 0 + var invokedId: String? + var invokedIdList = [String]() + var invokedIdGetter = false + var invokedIdGetterCount = 0 + var stubbedId: String! = "" + + var id: String { + set { + invokedIdSetter = true + invokedIdSetterCount += 1 + invokedId = newValue + invokedIdList.append(newValue) + } + get { + invokedIdGetter = true + invokedIdGetterCount += 1 + return stubbedId + } + } + + var invokedStart = false + var invokedStartCount = 0 + var stubbedStartAction: (() -> Void)? + + func start() { + invokedStart = true + invokedStartCount += 1 + stubbedStartAction?() + } +} diff --git a/Tests/FlareTests/UnitTests/Factories/ReceiptRefreshFactoryTests.swift b/Tests/FlareTests/UnitTests/Factories/ReceiptRefreshFactoryTests.swift new file mode 100644 index 000000000..96fd2c3da --- /dev/null +++ b/Tests/FlareTests/UnitTests/Factories/ReceiptRefreshFactoryTests.swift @@ -0,0 +1,42 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import Foundation +import XCTest + +// MARK: - IReceiptRefreshRequestFactoryTests + +final class IReceiptRefreshRequestFactoryTests: XCTestCase { + // MARK: Properties + + private var factory: ReceiptRefreshRequestFactory! + + // MARK: Initialization + + override func setUp() { + super.setUp() + factory = ReceiptRefreshRequestFactory() + } + + override func tearDown() { + factory = nil + super.tearDown() + } + + func test_thatFactoryMakesReceipt() { + // when + let receipt = factory.make(requestID: .requestID, delegate: nil) + + // then + XCTAssertEqual(receipt.id, .requestID) + } +} + +// MARK: - Constants + +private extension String { + static let requestID = "request_id" +} diff --git a/Tests/FlareTests/UnitTests/FlareTests.swift b/Tests/FlareTests/UnitTests/FlareTests.swift new file mode 100644 index 000000000..01e403dbd --- /dev/null +++ b/Tests/FlareTests/UnitTests/FlareTests.swift @@ -0,0 +1,249 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import StoreKit +import XCTest + +// MARK: - FlareTests + +class FlareTests: XCTestCase { + // MARK: - Properties + + private var iapProviderMock: IAPProviderMock! + private var flare: Flare! + + // MARK: - XCTestCase + + override func setUp() { + super.setUp() + iapProviderMock = IAPProviderMock() + flare = Flare(iapProvider: iapProviderMock) + } + + override func tearDown() { + iapProviderMock = nil + flare = nil + super.tearDown() + } + + // MARK: - Tests + + func test_thatFlareFetchesProductsWithGivenProductIDs() { + // when + flare.fetch(productIDs: .ids, completion: { _ in }) + + // then + XCTAssertTrue(iapProviderMock.invokedFetch) + } + + func test_thatFlareFetchesProductsWithGivenProductIDs() async throws { + // given + let productMocks = [ProductMock(), ProductMock(), ProductMock()] + iapProviderMock.fetchAsyncResult = productMocks + + // when + let products = try await flare.fetch(productIDs: .ids) + + // then + XCTAssertEqual(products, productMocks) + } + + func test_thatFlarePurchasesAProduct_whenUserCanMakePayments() { + // given + iapProviderMock.stubbedCanMakePayments = true + + // when + flare.purchase(productID: .productID, completion: { _ in }) + + // then + XCTAssertTrue(iapProviderMock.invokedPurchase) + XCTAssertEqual(iapProviderMock.invokedPurchaseParameters?.productID, .productID) + } + + func test_thatFlareDoesNotPurchaseAProduct_whenUserCannotMakePayments() { + // given + iapProviderMock.stubbedCanMakePayments = false + + // when + flare.purchase(productID: .productID, completion: { _ in }) + + // then + XCTAssertFalse(iapProviderMock.invokedPurchase) + } + + func test_thatFlarePurchasesAProduct_whenRequestCompletedSuccessfully() { + // given + let paymentTransaction = PaymentTransaction(PaymentTransactionMock()) + iapProviderMock.stubbedCanMakePayments = true + + // when + var transaction: PaymentTransaction? + flare.purchase(productID: .productID, completion: { result in + if case let .success(result) = result { + transaction = result + } + }) + iapProviderMock.invokedPurchaseParameters?.completion(.success(paymentTransaction)) + + // then + XCTAssertTrue(iapProviderMock.invokedPurchase) + XCTAssertEqual(transaction, paymentTransaction) + } + + func test_thatFlareDoesNotPurchaseAProduct_whenUnknownErrorOccurred() { + // given + let errorMock = IAPError.paymentNotAllowed + iapProviderMock.stubbedCanMakePayments = true + + // when + var error: IAPError? + flare.purchase(productID: .productID, completion: { result in + if case let .failure(result) = result { + error = result + } + }) + iapProviderMock.invokedPurchaseParameters?.completion(.failure(errorMock)) + + // then + XCTAssertTrue(iapProviderMock.invokedPurchase) + XCTAssertEqual(error, errorMock) + } + + func test_thatFlareDoesNotPurchaseAProduct_whenUserCannotMakePayments() async { + // given + iapProviderMock.stubbedCanMakePayments = false + iapProviderMock.stubbedAsyncPurchase = PaymentTransaction(PaymentTransactionMock()) + + // when + var iapError: IAPError? + do { + _ = try await flare.purchase(productID: .productID) + } catch { + iapError = error as? IAPError + } + + // then + XCTAssertFalse(iapProviderMock.invokedAsyncPurchase) + XCTAssertEqual(iapError, .paymentNotAllowed) + } + + func test_thatFlareDoesNotPurchaseAProduct_whenUnknownErrorOccurred() async { + // given + let transactionMock = PaymentTransaction(PaymentTransactionMock()) + + iapProviderMock.stubbedCanMakePayments = true + iapProviderMock.stubbedAsyncPurchase = transactionMock + + // when + var transaction: PaymentTransaction? + var iapError: IAPError? + do { + transaction = try await flare.purchase(productID: .productID) + } catch { + iapError = error as? IAPError + } + + // then + XCTAssertTrue(iapProviderMock.invokedAsyncPurchase) + XCTAssertNil(iapError) + XCTAssertEqual(transaction, transactionMock) + } + + func test_thatFlareFetchesReceipt_whenRequestCompletedSuccessfully() { + // when + var receipt: String? + flare.receipt(completion: { result in + if case let .success(result) = result { + receipt = result + } + }) + iapProviderMock.invokedRefreshReceiptParameters?.completion(.success(.receipt)) + + // then + XCTAssertTrue(iapProviderMock.invokedRefreshReceipt) + XCTAssertEqual(receipt, .receipt) + } + + func test_thatFlareDoesNotFetchReceipt_whenRequestFailed() { + // when + var error: IAPError? + flare.receipt(completion: { result in + if case let .failure(result) = result { + error = result + } + }) + iapProviderMock.invokedRefreshReceiptParameters?.completion(.failure(.paymentNotAllowed)) + + // then + XCTAssertTrue(iapProviderMock.invokedRefreshReceipt) + XCTAssertEqual(error, .paymentNotAllowed) + } + + func test_thatFlareRemovesTransactionObserver() { + // when + flare.removeTransactionObserver() + + // then + XCTAssertTrue(iapProviderMock.invokedRemoveTransactionObserver) + } + + func test_thatFlareFetchesReceipt_whenRequestCompletedSuccessfully() async throws { + // given + iapProviderMock.stubbedRefreshReceiptAsyncResult = .success(.receipt) + + // when + let receipt = try await flare.receipt() + + // then + XCTAssertEqual(receipt, .receipt) + } + + func test_thatFlareDoesNotFetchReceipt_whenRequestFailed() async throws { + // given + iapProviderMock.stubbedRefreshReceiptAsyncResult = .failure(.paymentNotAllowed) + + // when + var iapError: IAPError? + do { + _ = try await flare.receipt() + } catch { + iapError = error as? IAPError + } + + // then + XCTAssertEqual(iapError, .paymentNotAllowed) + } + + func test_thatFlareFinishesTransaction() { + // given + let transaction = PaymentTransaction(PaymentTransactionMock()) + + // when + flare.finish(transaction: transaction) + + // then + XCTAssertTrue(iapProviderMock.invokedFinishTransaction) + } + + func test_thatFlareAddsTransactionObserver() { + // when + flare.addTransactionObserver(fallbackHandler: { _ in }) + + // then + XCTAssertTrue(iapProviderMock.invokedAddTransactionObserver) + } +} + +// MARK: - Constants + +private extension Set where Element == String { + static let ids = Set(arrayLiteral: "1", "2", "3") +} + +private extension String { + static let productID = "product_ID" + static let receipt = "receipt" +} diff --git a/Tests/FlareTests/UnitTests/Models/PaymentTransactionTests.swift b/Tests/FlareTests/UnitTests/Models/PaymentTransactionTests.swift new file mode 100644 index 000000000..b5345c068 --- /dev/null +++ b/Tests/FlareTests/UnitTests/Models/PaymentTransactionTests.swift @@ -0,0 +1,144 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import struct StoreKit.SKError +import class StoreKit.SKPaymentTransaction +import enum StoreKit.SKPaymentTransactionState +import XCTest + +final class PaymentTransactionTests: XCTestCase { + func test_thatTransactionHasTransactionIdentifierEqualsToSKPaymentTransactionIdentifier() { + // given + let skPaymentTransaction = SKPaymentTransaction() + let paymentTransaction = PaymentTransaction(skPaymentTransaction) + + // when + let identifier = paymentTransaction.transactionIdentifier + + // then + XCTAssertEqual(identifier, skPaymentTransaction.transactionIdentifier) + } + + func test_thatTransactionHasOriginalTransactionIdentifierEqualsToSKPaymentOriginalTransactionIdentifier() { + // given + let skPaymentTransaction = SKPaymentTransaction() + let paymentTransaction = PaymentTransaction(skPaymentTransaction) + + // when + let identifier = paymentTransaction.originalTransactionIdentifier + + // then + XCTAssertEqual(identifier, skPaymentTransaction.original?.transactionIdentifier) + } + + func test_thatTransactionHasProductIdentifierEqualsToSKPaymentProductIdentifier() { + // given + let skPaymentTransaction = SKPaymentTransaction() + let paymentTransaction = PaymentTransaction(skPaymentTransaction) + + // when + let identifier = paymentTransaction.productIdentifier + + // then + XCTAssertEqual(identifier, skPaymentTransaction.payment.productIdentifier) + } + + func test_thatTransactionHasTransactionStateEqualsToDeffered() { + test_transactionState(stubbedState: .deferred, expectedState: .deferred) + } + + func test_thatTransactionHasTransactionStateEqualsToFailed() { + test_transactionState(stubbedState: .failed, expectedState: .failed) + } + + func test_thatTransactionHasTransactionStateEqualsToPurchased() { + test_transactionState(stubbedState: .purchased, expectedState: .purchased) + } + + func test_thatTransactionHasTransactionStateEqualsToPurchasing() { + test_transactionState(stubbedState: .purchasing, expectedState: .purchasing) + } + + func test_thatTransactionHasTransactionStateEqualsToRestored() { + test_transactionState(stubbedState: .restored, expectedState: .restored) + } + + func test_thatTransactionHasOriginalTransactionEqualsToSKPaymentTransaction() { + // given + let originalTransactionMock = PaymentTransactionMock() + let skPaymentTransaction = PaymentTransactionMock() + skPaymentTransaction.stubbedOriginal = originalTransactionMock + + let paymentTransaction = PaymentTransaction(skPaymentTransaction) + + // when + let originalTransaction = paymentTransaction.original + + // then + XCTAssertTrue(originalTransaction?.skTransaction === originalTransactionMock) + } + + func test_thatTransactionHasErrorEqualsToSKPaymentTransactionError() { + // given + let skPaymentTransaction = PaymentTransactionMock() + skPaymentTransaction.stubbedError = IAPError.unknown + let paymentTransaction = PaymentTransaction(skPaymentTransaction) + + // when + let error = paymentTransaction.error + + // then + XCTAssertEqual(error as? NSError, IAPError.unknown as NSError) + } + + func test_thatTransactionWrappsErrorIntoIAPError_whenErrorIsSKError() { + // given + let errorMock = SKError(SKError.clientInvalid) + let skPaymentTransaction = PaymentTransactionMock() + skPaymentTransaction.stubbedError = errorMock + let paymentTransaction = PaymentTransaction(skPaymentTransaction) + + // when + let error = paymentTransaction.error as? IAPError + + // then + if let error = error, case let IAPError.with(error) = error { + XCTAssertEqual(error as? SKError, errorMock) + } else { + XCTFail("Errors must be equal.") + } + } + + func test_thatTransactionMarksAsCancelled_whenOriginalPaymentTransactionIsCancelled() { + // given + let skPaymentTransaction = PaymentTransactionMock() + skPaymentTransaction.stubbedError = SKError(SKError.Code.paymentCancelled) + + let paymentTransaction = PaymentTransaction(skPaymentTransaction) + + // when + let isCancelled = paymentTransaction.isCancelled + + // then + XCTAssertTrue(isCancelled) + } + + // MARK: Private + + private func test_transactionState(stubbedState: SKPaymentTransactionState, expectedState: PaymentTransaction.State) { + // given + let skPaymentTransaction = PaymentTransactionMock() + skPaymentTransaction.stubbedTransactionState = stubbedState + + let paymentTransaction = PaymentTransaction(skPaymentTransaction) + + // when + let state = paymentTransaction.state + + // then + XCTAssertEqual(state, expectedState) + } +} diff --git a/Tests/FlareTests/UnitTests/Models/SKProductTests.swift b/Tests/FlareTests/UnitTests/Models/SKProductTests.swift new file mode 100644 index 000000000..b901e091e --- /dev/null +++ b/Tests/FlareTests/UnitTests/Models/SKProductTests.swift @@ -0,0 +1,36 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import Foundation +import class StoreKit.SKProduct +import XCTest + +// MARK: - SKProductTests + +final class SKProductTests: XCTestCase { + func test_thatSKProductFormatsPriceValueAccoringToLocale() { + // given + let product = ProductMock() + product.stubbedPrice = NSDecimalNumber(value: UInt.price) + product.stubbedPriceLocale = Locale(identifier: .localeID) + + // when + let localizedPrice = product.localizedPrice + + // then + XCTAssertEqual(localizedPrice, "$100.00") + } +} + +// MARK: - Constants + +private extension UInt { + static let price = 100 +} + +private extension String { + static let localeID = "en_US" +} diff --git a/Tests/FlareTests/UnitTests/Providers/IAPProviderTests.swift b/Tests/FlareTests/UnitTests/Providers/IAPProviderTests.swift new file mode 100644 index 000000000..b97b668fb --- /dev/null +++ b/Tests/FlareTests/UnitTests/Providers/IAPProviderTests.swift @@ -0,0 +1,357 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import StoreKit +import XCTest + +// MARK: - IAPProviderTests + +class IAPProviderTests: XCTestCase { + // MARK: - Properties + + private var paymentQueueMock: PaymentQueueMock! + private var productProviderMock: ProductProviderMock! + private var paymentProviderMock: PaymentProviderMock! + private var receiptRefreshProviderMock: ReceiptRefreshProviderMock! + private var iapProvider: IIAPProvider! + + // MARK: - XCTestCase + + override func setUp() { + super.setUp() + paymentQueueMock = PaymentQueueMock() + productProviderMock = ProductProviderMock() + paymentProviderMock = PaymentProviderMock() + receiptRefreshProviderMock = ReceiptRefreshProviderMock() + iapProvider = IAPProvider( + paymentQueue: paymentQueueMock, + productProvider: productProviderMock, + paymentProvider: paymentProviderMock, + receiptRefreshProvider: receiptRefreshProviderMock + ) + } + + override func tearDown() { + paymentQueueMock = nil + productProviderMock = nil + paymentProviderMock = nil + receiptRefreshProviderMock = nil + iapProvider = nil + super.tearDown() + } + + // MARK: - Tests + + func test_thatIAPProviderCanMakePayments() { + // given + paymentQueueMock.stubbedCanMakePayments = true + + // then + XCTAssertTrue(iapProvider.canMakePayments) + } + + func test_thatIAPProviderFetchesProducts() throws { + // when + iapProvider.fetch(productIDs: .productIDs, completion: { _ in }) + + // then + let parameters = try XCTUnwrap(productProviderMock.invokedFetchParameters) + XCTAssertEqual(parameters.productIDs, .productIDs) + XCTAssertTrue(!parameters.requestID.isEmpty) + } + + func test_thatIAPProviderPurchasesProduct() throws { + // when + iapProvider.purchase(productID: .productID, completion: { _ in }) + + // then + XCTAssertTrue(productProviderMock.invokedFetch) + } + + func test_thatIAPProviderRefreshesReceipt() { + // when + iapProvider.refreshReceipt(completion: { _ in }) + + // then + XCTAssertTrue(receiptRefreshProviderMock.invokedRefresh) + } + + func test_thatIAPProviderFinishesTransaction() { + // given + let transaction = PurchaseManagerTestHelper.makePaymentTransaction(state: .purchased) + + // when + iapProvider.finish(transaction: PaymentTransaction(transaction)) + + // then + XCTAssertTrue(paymentProviderMock.invokedFinishTransaction) + } + + func test_thatIAPProviderAddsTransactionObserver() { + // when + iapProvider.addTransactionObserver(fallbackHandler: { _ in }) + + // then + XCTAssertTrue(paymentProviderMock.invokedFallbackHandler) + XCTAssertTrue(paymentProviderMock.invokedAddTransactionObserver) + } + + func test_thatIAPProviderRemovesTransactionObserver() { + // when + iapProvider.removeTransactionObserver() + + // then + XCTAssertTrue(paymentProviderMock.invokedRemoveTransactionObserver) + } + + func test_thatIAPProviderFetchesProducts_whenProducts() async throws { + // given + let productsMock = [SKProduct(), SKProduct(), SKProduct()] + productProviderMock.stubbedFetchResult = .success(productsMock) + + // when + let products = try await iapProvider.fetch(productIDs: .productIDs) + + // then + XCTAssertEqual(productsMock, products) + } + + func test_thatIAPProviderThrowsNoProductsError_whenProductsProductProviderReturnsError() async { + // given + productProviderMock.stubbedFetchResult = .failure(IAPError.unknown) + + // when + var errorResult: Error? + do { + _ = try await iapProvider.fetch(productIDs: .productIDs) + } catch { + errorResult = error + } + + // then + XCTAssertEqual(errorResult as? NSError, IAPError.unknown as NSError) + } + + func test_thatIAPProviderThrowsStoreProductNotAvailableError_whenProductProviderDoesNotHaveProducts() { + // given + productProviderMock.stubbedFetchResult = .success([]) + + // when + var error: Error? + iapProvider.purchase(productID: .productID) { result in + if case let .failure(result) = result { + error = result + } + } + + // then + XCTAssertEqual(error as? NSError, IAPError.storeProductNotAvailable as NSError) + } + + func test_thatIAPProviderReturnsPaymentTransaction_whenProductsExist() { + // given + let paymentTransactionMock = PaymentTransactionMock() + productProviderMock.stubbedFetchResult = .success([ProductMock()]) + paymentProviderMock.stubbedAddResult = (paymentQueueMock, .success(paymentTransactionMock)) + + // when + var transactionResult: PaymentTransaction? + iapProvider.purchase(productID: .productID) { result in + if case let .success(transaction) = result { + transactionResult = transaction + } + } + + // then + XCTAssertEqual(transactionResult?.skTransaction, paymentTransactionMock) + } + + func test_thatIAPProviderReturnsError_whenAddingPaymentFailed() { + // given + productProviderMock.stubbedFetchResult = .success([ProductMock()]) + paymentProviderMock.stubbedAddResult = (paymentQueueMock, .failure(.unknown)) + + // when + var errorResult: Error? + iapProvider.purchase(productID: .productID) { result in + if case let .failure(error) = result { + errorResult = error + } + } + + // then + XCTAssertEqual(errorResult as? NSError, IAPError.unknown as NSError) + } + + func test_thatIAPProviderReturnsError_whenFetchRequestFailed() { + // given + productProviderMock.stubbedFetchResult = .failure(.storeProductNotAvailable) + + // when + var errorResult: Error? + iapProvider.purchase(productID: .productID) { result in + if case let .failure(error) = result { + errorResult = error + } + } + + // then + XCTAssertEqual(errorResult as? NSError, IAPError.storeProductNotAvailable as NSError) + } + + func test_thatIAPProviderThrowsStoreProductNotAvailableError_whenProductsDoNotExist() async throws { + // given + productProviderMock.stubbedFetchResult = .success([]) + + // when + var errorResult: Error? + do { + _ = try await iapProvider.purchase(productID: .productID) + } catch { + errorResult = error + } + + // then + XCTAssertEqual(errorResult as? NSError, IAPError.storeProductNotAvailable as NSError) + } + + func test_thatIAPProviderPurchasesForAProduct_whenProductsExist() async throws { + // given + let transactionMock = SKPaymentTransaction() + productProviderMock.stubbedFetchResult = .success([ProductMock()]) + paymentProviderMock.stubbedAddResult = (paymentQueueMock, .success(transactionMock)) + + // when + let transactionResult = try await iapProvider.purchase(productID: .productID) + + // then + XCTAssertEqual(transactionMock, transactionResult.skTransaction) + } + + func test_thatIAPProviderRefreshesReceipt_when() { + // given + receiptRefreshProviderMock.stubbedReceipt = .receipt + receiptRefreshProviderMock.stubbedRefreshResult = .success(()) + + // when + var receiptResult: String? + iapProvider.refreshReceipt { result in + if case let .success(receipt) = result { + receiptResult = receipt + } + } + + // then + XCTAssertEqual(receiptResult, .receipt) + } + + func test_thatIAPProviderDoesNotRefreshReceipt_whenRequestFailed() { + // given + receiptRefreshProviderMock.stubbedReceipt = nil + receiptRefreshProviderMock.stubbedRefreshResult = .failure(.receiptNotFound) + + // when + var errorResult: Error? + iapProvider.refreshReceipt { result in + if case let .failure(error) = result { + errorResult = error + } + } + + // then + XCTAssertEqual(errorResult as? NSError, IAPError.receiptNotFound as NSError) + } + + func test_thatIAPProviderReturnsReceiptNotFoundError_whenReceiptIsNil() { + // given + receiptRefreshProviderMock.stubbedReceipt = nil + receiptRefreshProviderMock.stubbedRefreshResult = .success(()) + + // when + var errorResult: Error? + iapProvider.refreshReceipt { result in + if case let .failure(error) = result { + errorResult = error + } + } + + // then + XCTAssertEqual(errorResult as? NSError, IAPError.receiptNotFound as NSError) + } + + func test_thatIAPProviderRefreshesReceipt_whenReceiptIsNotNil() async throws { + // given + receiptRefreshProviderMock.stubbedReceipt = .receipt + receiptRefreshProviderMock.stubbedRefreshResult = .success(()) + + // when + let receipt = try await iapProvider.refreshReceipt() + + // then + XCTAssertEqual(receipt, .receipt) + } + + func test_thatIAPProviderDoesNotRefreshReceipt_whenReceiptIsNil() async throws { + // given + receiptRefreshProviderMock.stubbedReceipt = nil + receiptRefreshProviderMock.stubbedRefreshResult = .success(()) + + // when + var errorResult: Error? + do { + _ = try await iapProvider.refreshReceipt() + } catch { + errorResult = error + } + + // then + XCTAssertEqual(errorResult as? NSError, IAPError.receiptNotFound as NSError) + } + + func test_thatIAPProviderReturnsTransaction() { + // given + let transactionMock = SKPaymentTransaction() + paymentProviderMock.stubbedFallbackHandlerResult = (paymentQueueMock, .success(transactionMock)) + + // when + var transactionResult: PaymentTransaction? + iapProvider.addTransactionObserver { result in + if case let .success(transaction) = result { + transactionResult = transaction + } + } + + // then + XCTAssertEqual(transactionResult?.skTransaction, transactionMock) + } + + func test_thatIAPProviderReturnsError() { + // given + paymentProviderMock.stubbedFallbackHandlerResult = (paymentQueueMock, .failure(.unknown)) + + // when + var errorResult: Error? + iapProvider.addTransactionObserver { result in + if case let .failure(error) = result { + errorResult = error + } + } + + // then + XCTAssertEqual(errorResult as? NSError, IAPError.unknown as NSError) + } +} + +// MARK: - Constants + +private extension String { + static let receipt = "receipt" + static let productID = "product_identifier" +} + +private extension Set where Element == String { + static let productIDs: Set = .init(arrayLiteral: "1", "2", "3") +} diff --git a/Tests/FlareTests/Classes/Providers/PaymentProviderTests.swift b/Tests/FlareTests/UnitTests/Providers/PaymentProviderTests.swift similarity index 60% rename from Tests/FlareTests/Classes/Providers/PaymentProviderTests.swift rename to Tests/FlareTests/UnitTests/Providers/PaymentProviderTests.swift index 0b3337632..31b765823 100644 --- a/Tests/FlareTests/Classes/Providers/PaymentProviderTests.swift +++ b/Tests/FlareTests/UnitTests/Providers/PaymentProviderTests.swift @@ -49,7 +49,7 @@ class PaymentProviderTests: XCTestCase { // MARK: - Tests - func testThatPaymentProviderCanMakePayments() { + func test_thatPaymentProviderCanMakePayments() { // given paymentQueueMock.stubbedCanMakePayments = true @@ -57,7 +57,7 @@ class PaymentProviderTests: XCTestCase { XCTAssertTrue(paymentProvider.canMakePayments) } - func testThatPaymentProviderAddTransactionObserver() throws { + func test_thatPaymentProviderAddsTransactionObserver() throws { // when paymentProvider.addTransactionObserver() @@ -66,7 +66,7 @@ class PaymentProviderTests: XCTestCase { XCTAssertTrue(observer.0 === paymentProvider) } - func testThatPaymentProviderRemoveTransactionObserver() throws { + func test_thatPaymentProviderRemovesTransactionObserver() throws { // given paymentProvider.addTransactionObserver() @@ -80,7 +80,7 @@ class PaymentProviderTests: XCTestCase { XCTAssertTrue(observer.0 === paymentProvider) } - func testThatPaymentProviderRestoreCompletedTransactions() { + func test_thatPaymentProviderRestoresCompletedTransactions() { // given let restoreHandler: RestoreHandler = { _, _ in } @@ -92,7 +92,7 @@ class PaymentProviderTests: XCTestCase { XCTAssertEqual(paymentQueueMock.invokedRestoreCompletedTransactionsCount, 1) } - func testThatPaymentProviderAddPaymentToQueueWithTransactions() { + func test_thatPaymentProviderAddsPaymentToQueueWithTransactions() { // given var handledPaymentQueue: PaymentQueue? let product = SKProduct() @@ -111,7 +111,7 @@ class PaymentProviderTests: XCTestCase { XCTAssertTrue(handledPaymentQueue === paymentQueue) } - func testThatPaymentProviderAddPaymentToQueueWithoutTransactions() { + func test_thatPaymentProviderAddsPaymentToQueueWithoutTransactions() { // given var handledPaymentQueue: PaymentQueue? let product = SKProduct() @@ -129,7 +129,7 @@ class PaymentProviderTests: XCTestCase { XCTAssertNil(handledPaymentQueue) } - func testThatPaymentProviderAddPaymentHandler() { + func test_thatPaymentProviderAddsPaymentHandler() { // given var handledPaymentQueue: PaymentQueue? let paymentQueue = SKPaymentQueue() @@ -138,14 +138,14 @@ class PaymentProviderTests: XCTestCase { .map { PurchaseManagerTestHelper.makePaymentTransaction(identifier: .productId, state: $0) } // when - paymentProvider.addPaymentHandler(withProductIdentifier: .productId, handler: paymentHandler) + paymentProvider.addPaymentHandler(productID: .productId, handler: paymentHandler) paymentProvider.paymentQueue(paymentQueue, updatedTransactions: paymentTransactions) // then XCTAssertTrue(handledPaymentQueue === paymentQueue) } - func testThatPaymentProviderCallFinishTransaction() { + func test_thatPaymentProviderCallsFinishTransaction() { // given let transactions = transactionsStates.map { PurchaseManagerTestHelper.makePaymentTransaction(state: $0) } @@ -157,7 +157,7 @@ class PaymentProviderTests: XCTestCase { XCTAssertEqual(paymentQueueMock.invokedFinishTransactionCount, 2) } - func testThatPaymentProviderCallFallbackHandlerWhenPaymentHandlersDontExist() { + func test_thatPaymentProviderCallsFallbackHandler_whenPaymentHandlersDoNotExist() { // given var handledPaymentQueue: PaymentQueue? let transaction = PurchaseManagerTestHelper.makePaymentTransaction(state: .purchased) @@ -172,42 +172,99 @@ class PaymentProviderTests: XCTestCase { } #if os(iOS) || os(tvOS) || os(macOS) - func testThatPaymentProviderAddAppStoreHandler() { + func test_thatPaymentProviderAddsAppStoreHandler() { + // given + let payment = SKPayment() + let product = SKProduct() + + var invokedQueue: PaymentQueue? + var invokedPayment: SKPayment? + var invokedProduct: SKProduct? + + let shouldAddStorePaymentHandler: ShouldAddStorePaymentHandler = { queue, payment, product in + invokedQueue = queue + invokedPayment = payment + invokedProduct = product + return true + } + + // when + paymentProvider.set(shouldAddStorePaymentHandler: shouldAddStorePaymentHandler) + let result = paymentProvider.paymentQueue(paymentQueueMock, shouldAddStorePayment: payment, for: product) + + // then + XCTAssertTrue(paymentQueueMock === invokedQueue) + XCTAssertEqual(product, invokedProduct) + XCTAssertEqual(payment, invokedPayment) + XCTAssertTrue(result) + } + #endif + + func test_thatPaymentQueueFinishesTransaction() { // given - let payment = SKPayment() - let product = SKProduct() + let transaction = PurchaseManagerTestHelper.makePaymentTransaction(state: .purchased) + + // when + paymentProvider.finish(transaction: PaymentTransaction(transaction)) - var invokedQueue: PaymentQueue? - var invokedPayment: SKPayment? - var invokedProduct: SKProduct? + // then + XCTAssertEqual(paymentQueueMock.invokedFinishTransactionParametersList.first?.0, transaction) + } + + func test_thatPaymentQueueRestoresCompletedTransactions() { + // when + paymentProvider.restoreCompletedTransactions(handler: { _, _ in }) + + // then + XCTAssertTrue(paymentQueueMock.invokedRestoreCompletedTransactions) + } - let shouldAddStorePaymentHandler: ShouldAddStorePaymentHandler = { queue, payment, product in - invokedQueue = queue - invokedPayment = payment - invokedProduct = product - return true + func test_thatPaymentQueueRestoresCompletedTransactions_whenTransactionFinished() { + // when + var queueResult: SKPaymentQueue? + var errorResult: Error? + let restoreHandler: RestoreHandler = { queue, error in + queueResult = queue + errorResult = error } + paymentProvider.restoreCompletedTransactions(handler: restoreHandler) + paymentProvider.paymentQueueRestoreCompletedTransactionsFinished(paymentQueueMock) + + // then + XCTAssertEqual(queueResult, paymentQueueMock) + XCTAssertNil(errorResult) + } + + func test_thatPaymentQueueDoesNotRestoreCompletedTransactions_whenRequestFailDueToTransactionError() { + // given + let errorMock = IAPError.paymentNotAllowed + // when - paymentProvider.set(shouldAddStorePaymentHandler: shouldAddStorePaymentHandler) - let result = paymentProvider.paymentQueue(paymentQueueMock, shouldAddStorePayment: payment, for: product) + var queueResult: SKPaymentQueue? + var errorResult: Error? + let restoreHandler: RestoreHandler = { queue, error in + queueResult = queue + errorResult = error + } + + paymentProvider.restoreCompletedTransactions(handler: restoreHandler) + paymentProvider.paymentQueue(paymentQueueMock, restoreCompletedTransactionsFailedWithError: errorMock) // then - XCTAssertTrue(paymentQueueMock === invokedQueue) - XCTAssertEqual(product, invokedProduct) - XCTAssertEqual(payment, invokedPayment) - XCTAssertTrue(result) + XCTAssertEqual(queueResult, paymentQueueMock) + XCTAssertEqual(errorResult as? NSError, IAPError(error: errorMock) as NSError) } - #endif - func testThatPaymentQueueFinishTransaction() { + func test_thatPaymentQueueHandlesTransactions_whenPendingTransactionsExist() { // given - let transaction = PurchaseManagerTestHelper.makePaymentTransaction(state: .purchased) + let transactionMocks = [SKPaymentTransaction(), SKPaymentTransaction(), SKPaymentTransaction()] + paymentQueueMock.stubbedTransactions = transactionMocks // when - paymentProvider.finish(transaction: PaymentTransaction(transaction)) + let transactions = paymentProvider.transactions // then - XCTAssertEqual(paymentQueueMock.invokedFinishTransactionParametersList.first?.0, transaction) + XCTAssertEqual(transactions, transactionMocks.map(PaymentTransaction.init)) } } diff --git a/Tests/FlareTests/Classes/Providers/ProductProviderTests.swift b/Tests/FlareTests/UnitTests/Providers/ProductProviderTests.swift similarity index 75% rename from Tests/FlareTests/Classes/Providers/ProductProviderTests.swift rename to Tests/FlareTests/UnitTests/Providers/ProductProviderTests.swift index d595da40d..c2f1ada71 100644 --- a/Tests/FlareTests/Classes/Providers/ProductProviderTests.swift +++ b/Tests/FlareTests/UnitTests/Providers/ProductProviderTests.swift @@ -9,14 +9,6 @@ import StoreKit import TestConcurrency import XCTest -private extension String { - static let requestId = "request_identifier" -} - -private extension Set where Element == String { - static let productIds: Set = .init(arrayLiteral: "1", "2", "3") -} - // MARK: - ProductProviderTests class ProductProviderTests: XCTestCase { @@ -44,17 +36,17 @@ class ProductProviderTests: XCTestCase { // MARK: - Tests - func testThatProductProviderFetchProductsWithInvalidProductsIdentfiers() { + func test_thatProductProviderReturnsInvalidProductIDs_whenRequestProductsWithInvalidIDs() { // given var fetchResult: Result<[SKProduct], IAPError>? let completionHandler: IProductProvider.ProductsHandler = { result in fetchResult = result } - let request = PurchaseManagerTestHelper.makeRequest(with: .requestId) + let request = PurchaseManagerTestHelper.makeRequest(with: .requestID) let response = ProductResponseMock() - response.stubbedInvokedInvalidProductsIdentifiers = ["111"] + response.stubbedInvokedInvalidProductsIdentifiers = [.productID] // when - productProvider.fetch(productIds: .productIds, requestId: .requestId, completion: completionHandler) + productProvider.fetch(productIDs: .productIDs, requestID: .requestID, completion: completionHandler) productProvider.productsRequest(request, didReceive: response) // then @@ -65,15 +57,15 @@ class ProductProviderTests: XCTestCase { } } - func testThatProductProviderFetchProductsWithValidProductsIdentfiers() { + func test_thatProductProviderReturnsProducts_whenRequestProductsWithValidProductIDs() { // given var fetchResult: Result<[SKProduct], IAPError>? let completionHandler: IProductProvider.ProductsHandler = { result in fetchResult = result } - let request = PurchaseManagerTestHelper.makeRequest(with: .requestId) + let request = PurchaseManagerTestHelper.makeRequest(with: .requestID) let response = ProductResponseMock() // when - productProvider.fetch(productIds: .productIds, requestId: .requestId, completion: completionHandler) + productProvider.fetch(productIDs: .productIDs, requestID: .requestID, completion: completionHandler) productProvider.productsRequest(request, didReceive: response) // then @@ -84,15 +76,15 @@ class ProductProviderTests: XCTestCase { } } - func testThatProductProviderHandleRequestError() { + func test_thatProductProviderHandlesError_whenRequestDidFailWithError() { // given var fetchResult: Result<[SKProduct], IAPError>? let completionHandler: IProductProvider.ProductsHandler = { result in fetchResult = result } - let request = PurchaseManagerTestHelper.makeRequest(with: .requestId) + let request = PurchaseManagerTestHelper.makeRequest(with: .requestID) let error = IAPError.emptyProducts // when - productProvider.fetch(productIds: .productIds, requestId: .requestId, completion: completionHandler) + productProvider.fetch(productIDs: .productIDs, requestID: .requestID, completion: completionHandler) productProvider.request(request, didFailWithError: error) // then @@ -103,3 +95,14 @@ class ProductProviderTests: XCTestCase { } } } + +// MARK: - Constants + +private extension String { + static let productID = "product_ID" + static let requestID = "request_identifier" +} + +private extension Set where Element == String { + static let productIDs: Set = .init(arrayLiteral: "1", "2", "3") +} diff --git a/Tests/FlareTests/UnitTests/Providers/ReceiptRefreshProviderTests.swift b/Tests/FlareTests/UnitTests/Providers/ReceiptRefreshProviderTests.swift new file mode 100644 index 000000000..cd3b4c67e --- /dev/null +++ b/Tests/FlareTests/UnitTests/Providers/ReceiptRefreshProviderTests.swift @@ -0,0 +1,179 @@ +// +// Flare +// Copyright © 2023 Space Code. All rights reserved. +// + +@testable import Flare +import StoreKit +import TestConcurrency +import XCTest + +// MARK: - ReceiptRefreshProviderTests + +class ReceiptRefreshProviderTests: XCTestCase { + // MARK: - Properties + + private var testDispatchQueue: TestDispatchQueue! + private var dispatchQueueFactory: TestDispatchQueueFactory! + private var receiptRefreshProvider: ReceiptRefreshProvider! + private var appStoreReceiptProviderMock: AppStoreReceiptProviderMock! + private var fileManagerMock: FileManagerMock! + private var receiptRefreshRequestFactoryMock: ReceiptRefreshRequestFactoryMock! + + // MARK: - XCTestCase + + override func setUp() { + super.setUp() + testDispatchQueue = TestDispatchQueue() + appStoreReceiptProviderMock = AppStoreReceiptProviderMock() + dispatchQueueFactory = TestDispatchQueueFactory(testQueue: testDispatchQueue) + fileManagerMock = FileManagerMock() + receiptRefreshRequestFactoryMock = ReceiptRefreshRequestFactoryMock() + receiptRefreshProvider = ReceiptRefreshProvider( + dispatchQueueFactory: dispatchQueueFactory, + fileManager: fileManagerMock, + appStoreReceiptProvider: appStoreReceiptProviderMock, + receiptRefreshRequestFactory: receiptRefreshRequestFactoryMock + ) + } + + override func tearDown() { + testDispatchQueue = nil + dispatchQueueFactory = nil + receiptRefreshProvider = nil + appStoreReceiptProviderMock = nil + fileManagerMock = nil + receiptRefreshRequestFactoryMock = nil + super.tearDown() + } + + // MARK: - Tests + + func test_thatReceiptRefreshProviderHandlesRequestError_whenErrorOccurred() { + // given + receiptRefreshRequestFactoryMock.stubbedMakeResult = ReceiptRefreshRequestMock() + + var result: Result? + let request = PurchaseManagerTestHelper.makeRequest(with: .requestID) + let handler: ReceiptRefreshHandler = { result = $0 } + let error = IAPError.paymentCancelled + + // when + receiptRefreshProvider.refresh(requestID: .requestID, handler: handler) + receiptRefreshProvider.request(request, didFailWithError: error) + + // then + if case let .failure(resultError) = result { + XCTAssertEqual(resultError.plainError as NSError, error.plainError as NSError) + } + } + + func test_thatReceiptRefreshProviderFinishesRequest_whenRequestCompletedSuccessfully() { + // given + receiptRefreshRequestFactoryMock.stubbedMakeResult = ReceiptRefreshRequestMock() + + var result: Result? + let request = PurchaseManagerTestHelper.makeRequest(with: .requestID) + let handler: ReceiptRefreshHandler = { result = $0 } + + // when + receiptRefreshProvider.refresh(requestID: .requestID, handler: handler) + receiptRefreshProvider.requestDidFinish(request) + + // then + if case .failure = result { + XCTFail() + } + } + + func test_thatReceiptRefreshProviderLoadsAppStoreReceipt_whenReceiptExists() { + // given + appStoreReceiptProviderMock.stubbedAppStoreReceiptURL = .mockURL + fileManagerMock.stubbedFileExistsResult = true + + // when + let receipt = receiptRefreshProvider.receipt + + // then + XCTAssertNotNil(receipt) + } + + func test_thatReceiptRefreshProviderDoesNotLoadAppStoreReceipt_whenReceiptDoesNotExist() { + // given + appStoreReceiptProviderMock.stubbedAppStoreReceiptURL = nil + fileManagerMock.stubbedFileExistsResult = false + + // when + let receipt = receiptRefreshProvider.receipt + + // then + XCTAssertNil(receipt) + } + + func test_thatReceiptRefreshProviderRefreshesReceipt_whenRequestDidFailWithError() async { + // given + let request = ReceiptRefreshRequestMock() + receiptRefreshRequestFactoryMock.stubbedMakeResult = request + + request.stubbedStartAction = { + self.receiptRefreshProvider.request( + self.makeSKRequest(id: request.id), + didFailWithError: IAPError.paymentNotAllowed + ) + } + + // when + var iapError: IAPError? + + do { + try await receiptRefreshProvider.refresh(requestID: .requestID) + } catch { + iapError = error as? IAPError + } + + // then + XCTAssertEqual(iapError, IAPError(error: IAPError.paymentNotAllowed)) + } + + func test_thatReceiptRefreshProviderRefreshesReceipt_whenRequestCompletedSuccessfully() async { + // given + let request = ReceiptRefreshRequestMock() + request.stubbedId = .requestID + + receiptRefreshRequestFactoryMock.stubbedMakeResult = request + + request.stubbedStartAction = { + self.receiptRefreshProvider.requestDidFinish(self.makeSKRequest(id: .requestID)) + } + + // when + var iapError: IAPError? + + do { + try await receiptRefreshProvider.refresh(requestID: .requestID) + } catch { + iapError = error as? IAPError + } + + // then + XCTAssertNil(iapError) + } + + // MARK: Private + + private func makeSKRequest(id: String) -> SKRequest { + let skRequest = SKRequest() + skRequest.id = id + return skRequest + } +} + +// MARK: - Constants + +private extension URL { + static let mockURL = URL(string: "https://google.com") +} + +private extension String { + static let requestID = "request_id" +} diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 000000000..b41560430 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,48 @@ +codecov: + # Require CI to pass to show coverage, default yes + require_ci_to_pass: yes + notify: + # Codecov should wait for all CI statuses to complete, default yes + wait_for_ci: yes + +coverage: + # Coverage precision range 0-5, default 2 + precision: 2 + + # Direction to round the coverage value - up, down, nearest, default down + round: nearest + + # Value range for red...green, default 70...100 + range: "70...90" + + status: + # Overall project coverage, compare against pull request base + project: + default: + # The required coverage value + target: 50% + + # The leniency in hitting the target. Allow coverage to drop by X% + threshold: 5% + + # Only measure lines adjusted in the pull request or single commit, if the commit in not in the pr + patch: + default: + # The required coverage value + target: 85% + + # Allow coverage to drop by X% + threshold: 5% + changes: no + +comment: + # Pull request Codecov comment format. + # diff: coverage diff of the pull request + # files: a list of files impacted by the pull request (coverage changes, file is new or removed) + layout: "diff, files" + + # Update Codecov comment, if exists. Otherwise post new + behavior: default + + # If true, only post the Codecov comment if coverage changes + require_changes: false \ No newline at end of file diff --git a/hooks/pre-commit b/hooks/pre-commit old mode 100644 new mode 100755 index 89b3319d8..956fdcb6a --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -8,4 +8,31 @@ git diff --diff-filter=d --staged --name-only | grep -e '\.swift$' | while read fi done -swiftlint \ No newline at end of file +LINT=$(which mint) +if [[ -e "${LINT}" ]]; then + # Export files in SCRIPT_INPUT_FILE_$count to lint against later + count=0 + while IFS= read -r file_path; do + export SCRIPT_INPUT_FILE_$count="$file_path" + count=$((count + 1)) + done < <(git diff --name-only --cached --diff-filter=d | grep ".swift$") + export SCRIPT_INPUT_FILE_COUNT=$count + + if [ "$count" -eq 0 ]; then + echo "No files to lint!" + exit 0 + fi + + echo "Found $count lintable files! Linting now.." + mint run swiftlint --use-script-input-files --strict --config .swiftlint.yml + RESULT=$? # swiftline exit value is number of errors + + if [ $RESULT -eq 0 ]; then + echo "🎉 Well done. No violation." + fi + exit $RESULT +else + echo "⚠️ WARNING: SwiftLint not found" + echo "⚠️ You might want to edit .git/hooks/pre-commit to locate your swiftlint" + exit 0 +fi \ No newline at end of file