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 }