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 }