TeraCalendarComposerFFITests.swift (4424B)
1 import Foundation 2 @testable import TeraApp 3 import TeraKitBindings 4 import XCTest 5 6 final class TeraCalendarComposerFFITests: XCTestCase { 7 func testNativeComposerInputsUseTheActualGeneratedSharedPlanAndReopenExactly() async throws { 8 let fixture = try MediaOwnershipFixture() 9 defer { fixture.remove() } 10 let first = try await fixture.runtime() 11 var saved = [FfiDraftStatusRecord]() 12 for (index, mode) in [TeraEventTiming.allDay, .timed].enumerated() { 13 let form = try form(mode) 14 let input = TeraAddRuntimeInput(form: form, media: []).generatedValue 15 let draft = try await first.phase1SaveDraft(draftId: String(repeating: index == 0 ? "51" : "52", count: 16), 16 input: input, authoredAtUnixS: 1_700_000_000, expectedRevision: nil, 17 persistedAtUnixMs: 1_700_000_000_000) 18 XCTAssertEqual(draft.form?.eventStartDate, input.eventStartDate) 19 XCTAssertEqual(draft.form?.eventEndDate, input.eventEndDate) 20 XCTAssertEqual(input.eventStartDate, "2026-09-05") 21 XCTAssertEqual(draft.form?.eventStartUnixS, form.eventStartUnixSeconds) 22 XCTAssertEqual(draft.form?.eventEndUnixS, form.eventEndUnixSeconds) 23 XCTAssertEqual(draft.form?.eventTimezone, form.eventTimezone) 24 let queued = try await first.phase1QueueDraft(draftId: draft.draftId, expectedRevision: draft.revision, 25 policy: FfiQueuePolicyRecord(schemaVersion: 1, relayUrls: ["wss://relay.example"], 26 satisfaction: .allAccepted, deliveryDeadlineUnixMs: 2_000_000_000_000, 27 cancellation: .localCooperative), queuedAtUnixMs: 1_700_000_000_001) 28 XCTAssertEqual(queued.state, .queued) 29 XCTAssertEqual(queued.form, draft.form) 30 XCTAssertNotNil(queued.operationId) 31 saved.append(queued) 32 } 33 _ = try await first.shutdown() 34 let reopened = try await fixture.runtime() 35 for expected in saved { 36 let actual = try await reopened.phase1DraftStatus(draftId: expected.draftId) 37 XCTAssertEqual(actual, expected) 38 } 39 _ = try await reopened.shutdown() 40 } 41 42 func testActualSharedBoundaryRejectsPartialDatesExclusiveRangesAndInvalidZones() async throws { 43 let fixture = try MediaOwnershipFixture() 44 defer { fixture.remove() } 45 let runtime = try await fixture.runtime() 46 var partial = try form(.allDay) 47 partial.eventStartDate = "2026-09-" 48 var reversed = try form(.allDay) 49 reversed.eventEndDate = reversed.eventStartDate 50 var timed = try form(.timed) 51 timed.eventEndUnixSeconds = timed.eventStartUnixSeconds 52 var zone = try form(.timed) 53 zone.eventTimezone = "Mars/Olympus" 54 let codes = ["invalid_event_start_date", "invalid_event_range", "invalid_event_range", "invalid_event_timezone"] 55 for (index, form) in [partial, reversed, timed, zone].enumerated() { 56 do { 57 _ = try await runtime.phase1SaveDraft(draftId: String(repeating: String(index + 3), count: 32), 58 input: TeraAddRuntimeInput(form: form, media: []).generatedValue, 59 authoredAtUnixS: 1_900_000_000, expectedRevision: nil, 60 persistedAtUnixMs: 1_900_000_000_000) 61 XCTFail("Invalid calendar input must fail strict shared planning before saving a draft.") 62 } catch let TeraAppError.Failure(report) { 63 XCTAssertEqual(report.code, codes[index]) 64 } 65 } 66 let drafts = try await runtime.phase1DraftHeads(limit: 10) 67 XCTAssertTrue(drafts.isEmpty) 68 _ = try await runtime.shutdown() 69 } 70 71 private func form(_ mode: TeraEventTiming) throws -> TeraAddForm { 72 let zone = try XCTUnwrap(TimeZone(identifier: "America/Vancouver")) 73 var form = TeraAddPresentation.newForm(type: .createEvent, identifier: { String(repeating: "a", count: 32) }, 74 clock: .fixed(unixSeconds: 1_788_568_200), timeZone: zone) 75 form.eventTiming = mode 76 form.title = "Synthetic harvest" 77 form.content = "Synthetic calendar composer" 78 form.eventStartDate = TeraCivilDateInput(raw: "2026-09-").replacing(2, with: "5") 79 form.eventEndDate = "2026-09-07" 80 return form 81 } 82 }