apple_kit

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

RadrootsBackgroundTransferTestingTests.swift (3569B)


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