TeraEditingOperationProtectionTests.swift (3308B)
1 import Foundation 2 @testable import TeraApp 3 import XCTest 4 5 @MainActor 6 final class TeraEditingOperationProtectionTests: XCTestCase { 7 func testNewSavesExistingStrictRevisionBeforeReplacingItsEditing() async throws { 8 let backend = AddBackend(advanceOffline: true) 9 let client = try await TeraAddStoreTests.startedClient(backend) 10 let store = TeraAddStore(runtimeClient: client) 11 await store.configure(snapshot: backend.snapshot()) 12 await store.start() 13 store.updateForm(\.content, "original") 14 let legacy = try await backend.saveAddIntent(input: TeraAddRuntimeInput(form: store.form, media: []), 15 existingDraftID: nil, expectedRevision: nil) 16 store.reopen(legacy) 17 await TeraScopeFixtures.eventually { !store.protection.isWorking } 18 await store.submit() 19 let source = try XCTUnwrap(store.activeDraft) 20 await store.retractAndRevise(TeraAddStoreTests.card(localOperationID: source.id)) 21 store.updateForm(\.content, "corrected revision") 22 store.newDraft(type: .createAsk) 23 await TeraScopeFixtures.eventually { !store.protection.isWorking } 24 XCTAssertFalse(store.protection.failed) 25 XCTAssertEqual(store.form.commandType, .createAsk) 26 XCTAssertEqual(store.form.content, "") 27 let saved = try XCTUnwrap(store.drafts.first(where: \.isRevision)) 28 XCTAssertEqual(saved.form?.content, "corrected revision") 29 XCTAssertEqual(saved.state, .draft) 30 let count = await backend.revisionPlanCount() 31 XCTAssertEqual(count, 1) 32 store.stop() 33 _ = try await client.stop() 34 } 35 36 func testFailedPreservationPreventsTodayRevisionAndRetractionEffects() async throws { 37 let backend = AddBackend(saveFailure: TeraScopeFixtures.failure()) 38 let client = try await TeraAddStoreTests.startedClient(backend) 39 let store = TeraAddStore(runtimeClient: client) 40 await store.configure(snapshot: backend.snapshot()) 41 await store.start() 42 store.updateForm(\.content, "keep exact editing") 43 let editing = store.form 44 await store.retract(TeraAddStoreTests.card()) 45 XCTAssertTrue(store.protection.failed) 46 XCTAssertEqual(store.form, editing) 47 XCTAssertNil(store.activeDraft) 48 let retraction = await backend.lastRetraction() 49 XCTAssertNil(retraction) 50 store.protection.cancel() 51 await store.retractAndRevise(TeraAddStoreTests.card(localOperationID: "missing")) 52 XCTAssertTrue(store.protection.failed) 53 XCTAssertEqual(store.form, editing) 54 XCTAssertNil(store.activeDraft) 55 let count = await backend.revisionPlanCount() 56 XCTAssertEqual(count, 0) 57 store.stop() 58 _ = try await client.stop() 59 } 60 61 func testAbandonedFailedChoiceDoesNotRetainStoppedStore() async throws { 62 let backend = AddBackend(saveFailure: TeraScopeFixtures.failure()) 63 let client = try await TeraAddStoreTests.startedClient(backend) 64 var store: TeraAddStore? = TeraAddStore(runtimeClient: client) 65 weak var weakStore = store 66 await store?.configure(snapshot: backend.snapshot()) 67 await store?.start() 68 store?.updateForm(\.content, "unsaved") 69 store?.newDraft() 70 await TeraScopeFixtures.eventually { store?.protection.failed == true } 71 store?.suspend() 72 store = nil 73 await TeraScopeFixtures.eventually { weakStore == nil } 74 _ = try await client.stop() 75 } 76 }