TeraScopedMediaTests.swift (3614B)
1 @testable import TeraApp 2 import XCTest 3 4 @MainActor 5 final class TeraScopedMediaTests: XCTestCase { 6 func testCancelledMediaOwnerCannotClearAReplacementTaskOrAdmitDuplicateWork() async throws { 7 let backend = try TeraScopeBackend() 8 let client = try await TeraScopeFixtures.client(backend) 9 let store = TeraMediaStore(runtimeClient: client) 10 let reference = TeraScopeFixtures.reference() 11 let context = TeraLocalNetwork.defaultContext(snapshot: TeraScopeFixtures.snapshot()) 12 let first = await backend.pause(.media) 13 store.load(media: reference, context: context) 14 await first.entered.wait() 15 let second = await backend.pause(.media) 16 let expected = try TeraScopeFixtures.artifact("b") 17 await backend.setMedia(expected) 18 store.retry(media: reference, context: context) 19 await second.entered.wait() 20 await first.resume.open() 21 // A completed actor hop gives the cancelled owner a chance to finish while 22 // the replacement is held at its explicit backend gate. 23 await TeraScopeFixtures.eventually { store.state(for: reference, context: context) == .loading } 24 store.load(media: reference, context: context) 25 await second.resume.open() 26 await TeraScopeFixtures.eventually { store.state(for: reference, context: context) == .ready(expected) } 27 let calls = await backend.counts[.media] 28 XCTAssertEqual(calls, 2) 29 store.reset() 30 _ = try await client.stop() 31 } 32 33 func testAccountResetCannotBeRepopulatedByLateMediaAndSameContextCanReload() async throws { 34 let backend = try TeraScopeBackend() 35 let client = try await TeraScopeFixtures.client(backend) 36 let store = TeraMediaStore(runtimeClient: client) 37 let reference = TeraScopeFixtures.reference() 38 let first = TeraScopeFixtures.snapshot() 39 let context = TeraLocalNetwork.defaultContext(snapshot: first) 40 store.configure(snapshot: first) 41 let pause = await backend.pause(.media) 42 store.load(media: reference, context: context) 43 await pause.entered.wait() 44 store.configure(snapshot: TeraScopeFixtures.snapshot(account: "b")) 45 await pause.resume.open() 46 let current = try TeraScopeFixtures.artifact("b") 47 await backend.setMedia(current) 48 store.load(media: reference, context: context) 49 await TeraScopeFixtures.eventually { store.state(for: reference, context: context) == .ready(current) } 50 let calls = await backend.counts[.media] 51 XCTAssertEqual(calls, 2) 52 store.reset() 53 _ = try await client.stop() 54 } 55 56 func testLateCorruptInvalidationCannotReplaceNewVerifiedMedia() async throws { 57 let backend = try TeraScopeBackend() 58 let client = try await TeraScopeFixtures.client(backend) 59 let store = TeraMediaStore(runtimeClient: client) 60 let reference = TeraScopeFixtures.reference() 61 let context = TeraLocalNetwork.defaultContext(snapshot: TeraScopeFixtures.snapshot()) 62 try await backend.setMedia(TeraScopeFixtures.artifact("a", corrupt: true)) 63 let pause = await backend.pause(.invalidate) 64 store.load(media: reference, context: context) 65 await pause.entered.wait() 66 let current = try TeraScopeFixtures.artifact("b") 67 await backend.setMedia(current) 68 store.retry(media: reference, context: context) 69 await TeraScopeFixtures.eventually { store.state(for: reference, context: context) == .ready(current) } 70 await pause.resume.open() 71 store.load(media: reference, context: context) 72 let calls = await backend.counts[.media] 73 XCTAssertEqual(calls, 2) 74 XCTAssertEqual(store.state(for: reference, context: context), .ready(current)) 75 store.reset() 76 _ = try await client.stop() 77 } 78 }