field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

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 }