Files
purchases-ios/Sources/Networking/InternalAPI.swift
T
NachoSoto dc628a2aaa Paywalls: events unit and integration tests (#3169)
### Changes:
- Added `PurchasesOrchestrator` tests for paywall data sent through post
receipt
- Fixed and tested state issue with cached paywall data and failed
purchases
- Added `Integration Tests` for tracking and flushing events
- Configured `Integration Tests` with a custom documents directory to
ensure it's empty on every test invocation
- Changed deployment target on `Integration Tests` to iOS 16 to simplify
code
- Setting `Purchases.logLevel` before configuring purchases on
`Integration Tests`
- Added assertion to ensure `FileHandler` never runs on the main thread
2023-09-14 18:28:11 -07:00

70 lines
2.4 KiB
Swift

//
// Copyright RevenueCat Inc. All Rights Reserved.
//
// Licensed under the MIT License (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://opensource.org/licenses/MIT
//
// InternalAPI.swift
//
// Created by Nacho Soto on 10/5/22.
import Foundation
class InternalAPI {
typealias ResponseHandler = (BackendError?) -> Void
private let backendConfig: BackendConfiguration
private let healthCallbackCache: CallbackCache<HealthOperation.Callback>
init(backendConfig: BackendConfiguration) {
self.backendConfig = backendConfig
self.healthCallbackCache = .init()
}
func healthRequest(signatureVerification: Bool, completion: @escaping ResponseHandler) {
let factory = HealthOperation.createFactory(httpClient: self.backendConfig.httpClient,
callbackCache: self.healthCallbackCache,
signatureVerification: signatureVerification)
let callback = HealthOperation.Callback(cacheKey: factory.cacheKey, completion: completion)
let cacheStatus = self.healthCallbackCache.add(callback)
self.backendConfig.addCacheableOperation(with: factory,
delay: .none,
cacheStatus: cacheStatus)
}
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
func postPaywallEvents(events: [PaywallStoredEvent], completion: @escaping ResponseHandler) {
guard !events.isEmpty else {
completion(nil)
return
}
let operation = PostPaywallEventsOperation(configuration: .init(httpClient: self.backendConfig.httpClient),
request: .init(events: events),
responseHandler: completion)
self.backendConfig.operationQueue.addOperation(operation)
}
}
extension InternalAPI {
/// - Throws: `BackendError`
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
func postPaywallEvents(events: [PaywallStoredEvent]) async throws {
let error = await Async.call { completion in
self.postPaywallEvents(events: events, completion: completion)
}
if let error { throw error }
}
}