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 }