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 }