apple_kit

Apple-native services for Radroots iOS and macOS apps
git clone https://radroots.dev/git/apple_kit.git
Log | Files | Refs | README

RadrootsBackgroundTransferTestingTests.swift (3595B)


      1 import Foundation
      2 import Testing
      3 import RadrootsKit
      4 import RadrootsKitTesting
      5 
      6 @Test func inMemoryBackgroundTransferStorePersistsSnapshotsInIdentifierOrder() async throws {
      7     let first = try RadrootsBackgroundTransferSnapshot(
      8         request: testTransferRequest(identifier: "field.transfer.b")
      9     )
     10     let second = try RadrootsBackgroundTransferSnapshot(
     11         request: testTransferRequest(identifier: "field.transfer.a")
     12     )
     13     let store = RadrootsInMemoryBackgroundTransferStore()
     14 
     15     try await store.saveSnapshot(first)
     16     try await store.saveSnapshot(second)
     17 
     18     #expect(try await store.loadSnapshots().map(\.identifier.rawValue) == [
     19         "field.transfer.a",
     20         "field.transfer.b"
     21     ])
     22 
     23     try await store.removeSnapshot(for: second.identifier)
     24     #expect(try await store.loadSnapshots() == [first])
     25 
     26     try await store.removeAllSnapshots()
     27     #expect(try await store.loadSnapshots().isEmpty)
     28 }
     29 
     30 @Test func fakeBackgroundTransferEnqueuesSnapshotsAndHandlesCancellation() async throws {
     31     let transfer = RadrootsFakeBackgroundTransfer(
     32         updatedAt: Date(timeIntervalSince1970: 42)
     33     )
     34     let request = try testTransferRequest(identifier: "field.transfer.enqueue")
     35 
     36     let handle = try await transfer.enqueue(request)
     37 
     38     #expect(handle.identifier == request.identifier)
     39     #expect(await transfer.enqueuedRequests == [request])
     40     #expect(try await transfer.snapshot(for: request.identifier)?.state == .queued)
     41     #expect(try await transfer.snapshot(for: request.identifier)?.updatedAt == Date(timeIntervalSince1970: 42))
     42 
     43     try await transfer.cancel(request.identifier)
     44 
     45     #expect(await transfer.cancelledIdentifiers == [request.identifier])
     46     #expect(try await transfer.snapshot(for: request.identifier)?.state == .cancelled)
     47 }
     48 
     49 @Test func fakeBackgroundTransferCanCompleteAndFailSnapshots() async throws {
     50     let transfer = RadrootsFakeBackgroundTransfer()
     51     let completed = try testTransferRequest(identifier: "field.transfer.completed")
     52     let failed = try testTransferRequest(identifier: "field.transfer.failed")
     53 
     54     _ = try await transfer.enqueue(completed)
     55     _ = try await transfer.enqueue(failed)
     56     try await transfer.complete(completed.identifier)
     57     try await transfer.fail(failed.identifier, message: "network unavailable")
     58 
     59     #expect(try await transfer.snapshot(for: completed.identifier)?.state == .completed)
     60     let failedSnapshot = try await transfer.snapshot(for: failed.identifier)
     61     #expect(failedSnapshot?.state == .failed)
     62     #expect(failedSnapshot?.errorMessage == "network unavailable")
     63 }
     64 
     65 @Test func fakeBackgroundTransferCanReturnEnqueueFailures() async throws {
     66     let transfer = RadrootsFakeBackgroundTransfer(
     67         enqueueOutcome: .failure(.transferFailure("queue unavailable"))
     68     )
     69     let request = try testTransferRequest(identifier: "field.transfer.failure")
     70 
     71     await #expect(throws: RadrootsBackgroundTransferError.transferFailure("queue unavailable")) {
     72         _ = try await transfer.enqueue(request)
     73     }
     74     #expect(await transfer.enqueuedRequests == [request])
     75     #expect(try await transfer.snapshots().isEmpty)
     76 }
     77 
     78 private func testTransferRequest(identifier: String) throws -> RadrootsBackgroundTransferRequest {
     79     try RadrootsBackgroundTransferRequest(
     80         identifier: RadrootsBackgroundTransferIdentifier(identifier),
     81         remoteURL: URL(string: "https://radroots.org/\(identifier).json")!,
     82         method: .get,
     83         operation: .download(
     84             destination: .file(RadrootsFileReference(scope: .cache, relativePath: "\(identifier).json"))
     85         )
     86     )
     87 }