field_ios

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

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 }