field_ios

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

TeraCalendarFFICompatibilityTests.swift (3638B)


      1 import Foundation
      2 import TeraKitBindings
      3 import XCTest
      4 
      5 final class TeraCalendarFFICompatibilityTests: XCTestCase {
      6   private let publicKey = "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"
      7 
      8   func testBothCalendarVariantsReopenThroughInstalledFFI() async throws {
      9     let root = FileManager.default.temporaryDirectory
     10       .appendingPathComponent("tera-calendar-ffi-\(UUID().uuidString.lowercased())")
     11     try FileManager.default.createDirectory(
     12       at: root.appendingPathComponent("radroots/users/\(publicKey)"),
     13       withIntermediateDirectories: true
     14     )
     15     defer { try? FileManager.default.removeItem(at: root) }
     16     let first = try await runtime(root)
     17     var queued = [FfiDraftStatusRecord]()
     18     for (index, timing) in [FfiEventTimingKind.allDay, .timed].enumerated() {
     19       let input = calendar(timing)
     20       let saved = try await first.phase1SaveDraft(
     21         draftId: String(repeating: index == 0 ? "01" : "02", count: 16),
     22         input: input,
     23         authoredAtUnixS: 1_700_000_000,
     24         expectedRevision: nil,
     25         persistedAtUnixMs: 1_700_000_000_000
     26       )
     27       let form = try XCTUnwrap(saved.form)
     28       XCTAssertEqual(form.commandType, .createEvent)
     29       XCTAssertEqual(form.eventTiming, timing)
     30       XCTAssertEqual(form.eventStartDate, input.eventStartDate)
     31       XCTAssertEqual(form.eventEndDate, input.eventEndDate)
     32       XCTAssertEqual(form.eventStartUnixS, input.eventStartUnixS)
     33       XCTAssertEqual(form.eventEndUnixS, input.eventEndUnixS)
     34       XCTAssertEqual(form.eventTimezone, input.eventTimezone)
     35       let status = try await first.phase1QueueDraft(
     36         draftId: saved.draftId,
     37         expectedRevision: saved.revision,
     38         policy: FfiQueuePolicyRecord(
     39           schemaVersion: 1,
     40           relayUrls: ["wss://relay.example"],
     41           satisfaction: .allAccepted,
     42           deliveryDeadlineUnixMs: 2_000_000_000_000,
     43           cancellation: .localCooperative
     44         ),
     45         queuedAtUnixMs: 1_700_000_000_001
     46       )
     47       XCTAssertEqual(status.state, .queued)
     48       XCTAssertNotNil(status.operationId)
     49       XCTAssertEqual(status.form, saved.form)
     50       queued.append(status)
     51     }
     52     _ = try await first.shutdown()
     53     let reopened = try await runtime(root)
     54     for expected in queued {
     55       let restored = try await reopened.phase1DraftStatus(draftId: expected.draftId)
     56       XCTAssertEqual(restored, expected)
     57     }
     58     _ = try await reopened.shutdown()
     59   }
     60 
     61   private func runtime(_ root: URL) async throws -> TeraRuntime {
     62     try await TeraRuntime(
     63       applicationSupportDirectory: root.path,
     64       publicKeyHex: publicKey,
     65       sourceGenerationHex: String(repeating: "04", count: 32),
     66       sourceGenerationCreatedAtUnixMs: 1_800_000_000_000,
     67       protectedData: .available
     68     )
     69   }
     70 
     71   private func calendar(_ timing: FfiEventTimingKind) -> FfiAddDraftInput {
     72     let allDay = timing == .allDay
     73     return FfiAddDraftInput(
     74       schemaVersion: 1,
     75       commandType: .createEvent,
     76       content: "Synthetic calendar boundary fixture",
     77       identifier: allDay ? "all-day-fixture" : "timed-fixture",
     78       title: "Synthetic calendar event",
     79       summary: nil,
     80       location: "Fixture location",
     81       eventTiming: timing,
     82       eventStartDate: allDay ? "2030-03-18" : nil,
     83       eventEndDate: allDay ? "2030-03-19" : nil,
     84       eventStartUnixS: allDay ? nil : 1_900_003_600,
     85       eventEndUnixS: allDay ? nil : 1_900_007_200,
     86       eventTimezone: allDay ? nil : "Etc/UTC",
     87       priceAmount: nil,
     88       currency: nil,
     89       unit: nil,
     90       quantity: nil,
     91       foodPublishedAtUnixS: nil,
     92       foodStatus: nil,
     93       media: []
     94     )
     95   }
     96 }