TeraEditingReplacementFFITests.swift (3231B)
1 import Foundation 2 @testable import TeraApp 3 import XCTest 4 5 @MainActor 6 final class TeraEditingReplacementFFITests: XCTestCase { 7 func testNewAndTypeReplacementPreserveAcknowledgedIncompleteEditingAcrossProductionRelaunch() async throws { 8 let fixture = try MediaOwnershipFixture() 9 defer { fixture.remove() } 10 let signer = ComposerForbiddenSigner() 11 let configuration = configuration(fixture, signer: signer) 12 let client = TeraRuntimeClient.production() 13 let snapshot = try await client.start(configuration: configuration) 14 let store = TeraAddStore(runtimeClient: client) 15 store.configure(snapshot: snapshot) 16 await store.start() 17 store.selectType(.createEvent) 18 store.updateForm(\.eventStartDate, "2026-09-") 19 store.updateForm(\.content, " unfinished event ") 20 await store.save() 21 let original = try XCTUnwrap(store.savedComposer) 22 store.updateForm(\.content, " final incomplete event ") 23 let exact = TeraComposerForm(editing: store.form) 24 store.selectType(.createFoodAvailability) 25 await TeraScopeFixtures.eventually { !store.protection.isWorking } 26 XCTAssertFalse(store.protection.failed) 27 XCTAssertEqual(store.form.commandType, .createFoodAvailability) 28 let saved = try await client.loadComposer(scope: original.scope, id: original.id) 29 XCTAssertEqual(saved.form, exact) 30 XCTAssertGreaterThan(saved.revision, original.revision) 31 store.updateForm(\.priceAmount, "1.") 32 store.updateForm(\.quantity, "unfinished") 33 await store.save() 34 let second = try XCTUnwrap(store.savedComposer) 35 XCTAssertNotEqual(second.id, original.id) 36 store.updateForm(\.content, "incomplete availability") 37 let availability = TeraComposerForm(editing: store.form) 38 store.newDraft() 39 await TeraScopeFixtures.eventually { !store.protection.isWorking } 40 XCTAssertEqual(store.form.content, "") 41 store.stop() 42 _ = try await client.stop() 43 _ = try await client.start(configuration: configuration) 44 let firstRecovered = try await client.loadComposer(scope: saved.scope, id: saved.id) 45 let secondRecovered = try await client.loadComposer(scope: second.scope, id: second.id) 46 XCTAssertEqual(firstRecovered, saved) 47 XCTAssertEqual(secondRecovered.form, availability) 48 let operations = try await client.legacyDraftPage() 49 XCTAssertTrue(operations.entries.isEmpty) 50 let signingRequests = await signer.requests 51 XCTAssertEqual(signingRequests, 0) 52 _ = try await client.stop() 53 } 54 55 private func configuration(_ fixture: MediaOwnershipFixture, signer: ComposerForbiddenSigner) -> TeraRuntimeLaunchConfiguration { 56 TeraRuntimeLaunchConfiguration( 57 applicationSupportDirectory: fixture.root.path, 58 publicKeyHex: "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", 59 sourceGenerationHex: String(repeating: "04", count: 32), sourceGenerationCreatedAtUnixMilliseconds: 1_800_000_000_000, 60 protectedData: .available, networkProfile: .publicNetwork, writableRelays: [], blossom: nil, 61 app: TeraRuntimeAppMetadata(bundleIdentifier: "test.editing", version: "1", buildNumber: "1", buildSHA: nil), 62 signerGeneration: "editing-test", signer: signer, adoptBootstrapSettings: false 63 ) 64 } 65 }