field_ios

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

TeraTodayCalendarScopeTests.swift (3301B)


      1 import Foundation
      2 @testable import TeraApp
      3 import XCTest
      4 
      5 @MainActor
      6 final class TeraTodayCalendarScopeTests: XCTestCase {
      7   private var zone = TimeZone.gmt
      8 
      9   func testTravelKeepsLoadedContextUntilExplicitRefresh() async throws {
     10     zone = try XCTUnwrap(TimeZone(identifier: "America/Vancouver"))
     11     let west = TeraScopeFixtures.viewerCalendar(asOf: 1_788_569_400, timeZone: zone)
     12     let backend = try TeraScopeBackend()
     13     await backend.setPage(page("one", calendar: west, next: "next"))
     14     await backend.setPage(page("two", calendar: west), cursor: "next")
     15     let client = try await TeraScopeFixtures.client(backend)
     16     let store = TeraTodayStore(
     17       runtimeClient: client, clock: .fixed(unixSeconds: west.asOfUnixSeconds),
     18       viewerTimeZone: { self.zone }
     19     )
     20     store.configure(snapshot: TeraScopeFixtures.snapshot())
     21     await store.reload(refreshProjection: false)
     22     XCTAssertEqual(store.viewerCalendar, west)
     23     zone = try XCTUnwrap(TimeZone(identifier: "Pacific/Kiritimati"))
     24     await store.loadNextPage()
     25     XCTAssertEqual(store.cards.map(\.id), ["one", "two"])
     26     XCTAssertEqual(store.viewerCalendar, west)
     27     let requests = await backend.pageRequests
     28     XCTAssertEqual(requests.first?.viewerTimeZone, west.timeZoneID)
     29     XCTAssertNil(requests.last?.viewerTimeZone)
     30     XCTAssertNil(requests.last?.asOfUnixSeconds)
     31     let reconciled = try await TeraTodayReconciler.read(
     32       client: client, context: XCTUnwrap(store.selectedContext), calendar: west, cards: store.cards
     33     )
     34     XCTAssertEqual(reconciled.calendar, west)
     35     let east = TeraScopeFixtures.viewerCalendar(asOf: west.asOfUnixSeconds, timeZone: zone)
     36     await backend.setPage(page("fresh", calendar: east))
     37     await store.reload(refreshProjection: false)
     38     XCTAssertEqual(store.viewerCalendar, east)
     39     XCTAssertEqual(store.cards.map(\.id), ["fresh"])
     40     let refreshed = await backend.pageRequests
     41     XCTAssertEqual(refreshed.last?.viewerTimeZone, east.timeZoneID)
     42     _ = try await client.stop()
     43   }
     44 
     45   func testMismatchedCalendarCannotAppendEvenWithSameInstantAndGeneration() async throws {
     46     let west = TeraScopeFixtures.viewerCalendar(asOf: 1)
     47     let east = try TeraScopeFixtures.viewerCalendar(asOf: 1, timeZone: XCTUnwrap(TimeZone(identifier: "Pacific/Kiritimati")))
     48     let backend = try TeraScopeBackend()
     49     await backend.setPage(page("one", calendar: west, next: "next"))
     50     await backend.setPage(page("wrong", calendar: east), cursor: "next")
     51     let client = try await TeraScopeFixtures.client(backend)
     52     let store = TeraTodayStore(runtimeClient: client, clock: .fixed(unixSeconds: 1))
     53     store.configure(snapshot: TeraScopeFixtures.snapshot())
     54     await store.reload(refreshProjection: false)
     55     await store.loadNextPage()
     56     XCTAssertEqual(store.cards.map(\.id), ["one"])
     57     XCTAssertEqual(store.viewerCalendar, west)
     58     XCTAssertFalse(store.canLoadNextPage)
     59     XCTAssertTrue(store.presentation.readFailure?.requiresRefresh == true)
     60     _ = try await client.stop()
     61   }
     62 
     63   private func page(_ id: String, calendar: TeraViewerCalendarContext, next: String? = nil) -> TeraTodayPage {
     64     TeraTodayPage(
     65       asOfUnixSeconds: calendar.asOfUnixSeconds, items: [TeraScopeFixtures.card(id)],
     66       nextCursor: next, projectionGeneration: 1, calendar: calendar
     67     )
     68   }
     69 }