field_ios

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

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 }