Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add full Swift concurrency support with Sendable requirements #92

Merged
merged 12 commits into from
Dec 27, 2024
Prev Previous commit
Next Next commit
Update integration tests
ns-vasilev committed Dec 26, 2024
commit d841af82a5ed079d3c56e38b66c43477d101181a
6 changes: 3 additions & 3 deletions Tests/IntegrationTests/Tests/StoreProductTests.swift
Original file line number Diff line number Diff line change
@@ -34,14 +34,14 @@
let expectation = XCTestExpectation(description: "Purchase a product")

// when
let products: [StoreProduct] = try await withCheckedThrowingContinuation { _ in
let products: [StoreProduct] = try await withCheckedThrowingContinuation { continuation in
provider.fetch(productIDs: [String.productID], requestID: UUID().uuidString) { result in
switch result {
case let .success(skProducts):
let products = skProducts.map { StoreProduct($0) }
completion.resume(returning: products)
continuation.resume(returning: products)
case .failure:
completion.resume(returning: [])
continuation.resume(returning: [])

Check warning on line 44 in Tests/IntegrationTests/Tests/StoreProductTests.swift

Codecov / codecov/patch

Tests/IntegrationTests/Tests/StoreProductTests.swift#L44

Added line #L44 was not covered by tests
}
expectation.fulfill()
}

Unchanged files with check annotations Beta

try await iapProvider.restore()
}
public func restore(_ completion: @escaping @Sendable (Result<Void, any Error>) -> Void) {

Check warning on line 164 in Sources/Flare/Classes/Flare.swift

Codecov / codecov/patch

Sources/Flare/Classes/Flare.swift#L164

Added line #L164 was not covered by tests
iapProvider.restore(completion)
}
try await iapProvider.refreshReceipt(updateTransactions: updateTransactions)
}
public func receipt(updateTransactions: Bool, completion: @escaping @Sendable (Result<String, IAPError>) -> Void) {

Check warning on line 172 in Sources/Flare/Classes/Flare.swift

Codecov / codecov/patch

Sources/Flare/Classes/Flare.swift#L172

Added line #L172 was not covered by tests
iapProvider.refreshReceipt(updateTransactions: updateTransactions, completion: completion)
}
if let payment = payment as? SK1StorePayment {
self.add(payment.underlyingProduct)
} else {
fatalError("Incompatible type: PaymentQueue works only with SK1StorePayment.")

Check warning on line 53 in Sources/Flare/Classes/Helpers/PaymentQueue/PaymentQueue.swift

Codecov / codecov/patch

Sources/Flare/Classes/Helpers/PaymentQueue/PaymentQueue.swift#L53

Added line #L53 was not covered by tests
}
}
}
/// 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 SendableClosure<Result<String, IAPError>>) {

Check warning on line 301 in Sources/Flare/Classes/IFlare.swift

Codecov / codecov/patch

Sources/Flare/Classes/IFlare.swift#L301

Added line #L301 was not covered by tests
receipt(updateTransactions: false, completion: completion)
}
var price: Decimal? {
#if swift(>=6.0)
transaction.price
#else

Check warning on line 73 in Sources/Flare/Classes/Models/Internal/SK2StoreTransaction.swift

Codecov / codecov/patch

Sources/Flare/Classes/Models/Internal/SK2StoreTransaction.swift#L72-L73

Added lines #L72 - L73 were not covered by tests
nil
#endif
}
try await purchaseProvider.restore()
}
func restore(_ completion: @escaping @Sendable (Result<Void, any Error>) -> Void) {

Check warning on line 228 in Sources/Flare/Classes/Providers/IAPProvider/IAPProvider.swift

Codecov / codecov/patch

Sources/Flare/Classes/Providers/IAPProvider/IAPProvider.swift#L228

Added line #L228 was not covered by tests
purchaseProvider.restore(completion)
}
}
}
func restore(_ completion: @escaping @Sendable (Result<Void, Error>) -> Void) {

Check warning on line 245 in Sources/Flare/Classes/Providers/PurchaseProvider/PurchaseProvider.swift

Codecov / codecov/patch

Sources/Flare/Classes/Providers/PurchaseProvider/PurchaseProvider.swift#L245

Added line #L245 was not covered by tests
paymentProvider.restoreCompletedTransactions { _, error in
if let error = error {
completion(.failure(error))
@available(tvOS, unavailable)
@MainActor
func presentOfferCodeRedeemSheet() async throws {
let windowScene = try await systemInfoProvider.currentScene

Check warning on line 39 in Sources/Flare/Classes/Providers/RedeemCodeProvider/RedeemCodeProvider.swift

Codecov / codecov/patch

Sources/Flare/Classes/Providers/RedeemCodeProvider/RedeemCodeProvider.swift#L39

Added line #L39 was not covered by tests
do {
Logger.debug(message: L10n.Redeem.presentingOfferCodeRedeemSheet)
try await AppStore.presentOfferCodeRedeemSheet(in: windowScene)
init(scenesHolder: IScenesHolder? = nil) {
if let scenesHolder {
self.scenesHolder = { await scenesHolder.connectedScenes }

Check warning on line 22 in Sources/Flare/Classes/Providers/SystemInfoProvider/SystemInfoProvider.swift

Codecov / codecov/patch

Sources/Flare/Classes/Providers/SystemInfoProvider/SystemInfoProvider.swift#L22

Added line #L22 was not covered by tests
} else {
self.scenesHolder = {
await UIApplication.shared.connectedScenes

Check warning on line 25 in Sources/Flare/Classes/Providers/SystemInfoProvider/SystemInfoProvider.swift

Codecov / codecov/patch

Sources/Flare/Classes/Providers/SystemInfoProvider/SystemInfoProvider.swift#L25

Added line #L25 was not covered by tests
}
}
}
@available(tvOS, unavailable)
@MainActor
var currentScene: UIWindowScene {
get async throws {
var scenes = await scenesHolder()

Check warning on line 44 in Sources/Flare/Classes/Providers/SystemInfoProvider/SystemInfoProvider.swift

Codecov / codecov/patch

Sources/Flare/Classes/Providers/SystemInfoProvider/SystemInfoProvider.swift#L43-L44

Added lines #L43 - L44 were not covered by tests
.filter { $0.activationState == .foregroundActive }
#if DEBUG && targetEnvironment(simulator)
if scenes.isEmpty, ProcessInfo.isRunningUnitTests {
scenes = await scenesHolder()

Check warning on line 49 in Sources/Flare/Classes/Providers/SystemInfoProvider/SystemInfoProvider.swift

Codecov / codecov/patch

Sources/Flare/Classes/Providers/SystemInfoProvider/SystemInfoProvider.swift#L49

Added line #L49 was not covered by tests
}
#endif
let result: Result<SKPaymentQueue, Error>? = try await withCheckedThrowingContinuation { continuation in
paymentProvider.restoreCompletedTransactions { queue, error in
if let error = error {
continuation.resume(returning: .failure(error))

Check warning on line 218 in Tests/FlareTests/UnitTests/Providers/PaymentProviderTests.swift

Codecov / codecov/patch

Tests/FlareTests/UnitTests/Providers/PaymentProviderTests.swift#L218

Added line #L218 was not covered by tests
} else {
continuation.resume(returning: .success(queue))
}
XCTAssertEqual(arrayIDs.count, products.count)
XCTAssertEqual(arrayIDs, products.map(\.productIdentifier))
} else {
XCTFail("Fetch resulted in an unknown state.")

Check warning on line 60 in Tests/FlareTests/UnitTests/Providers/SortingProductsProviderDecoratorTests.swift

Codecov / codecov/patch

Tests/FlareTests/UnitTests/Providers/SortingProductsProviderDecoratorTests.swift#L60

Added line #L60 was not covered by tests
}
}
}
// MARK: Initialization
@MainActor override func setUp() {

Check warning on line 19 in Tests/FlareTests/UnitTests/Providers/SystemInfoProviderTests.swift

Codecov / codecov/patch

Tests/FlareTests/UnitTests/Providers/SystemInfoProviderTests.swift#L19

Added line #L19 was not covered by tests
super.setUp()
scenesHolderMock = ScenesHolderMock()
sut = SystemInfoProvider(scenesHolder: scenesHolderMock)