field_ios

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

TeraForegroundSubmissionTests.swift (2995B)


      1 import Foundation
      2 @testable import TeraApp
      3 import XCTest
      4 
      5 @MainActor
      6 final class TeraForegroundSubmissionTests: XCTestCase {
      7   func testViewCancellationRetainsForegroundResultAndFrozenCaptureWithoutNativeEnqueue() async throws {
      8     try await exerciseForeground(useDefaultPolicy: false)
      9   }
     10 
     11   func testAdapterWithoutQualifiedNativePolicyUsesSharedForegroundAndFrozenCapture() async throws {
     12     try await exerciseForeground(useDefaultPolicy: true)
     13   }
     14 
     15   private func exerciseForeground(useDefaultPolicy: Bool) async throws {
     16     let backend = AddBackend()
     17     let client = try await TeraAddStoreTests.startedClient(backend)
     18     let harness = AddMediaHarness(foreground: true)
     19     let media: any TeraAddMediaHandling = if useDefaultPolicy {
     20       DefaultPolicyMedia(harness: harness)
     21     } else {
     22       harness
     23     }
     24     let store = TeraAddStore(runtimeClient: client, media: media)
     25     await store.configure(snapshot: backend.snapshot())
     26     await store.start()
     27     store.selectType(.createPhotoUpdate)
     28     store.updateForm(\.content, "original foreground photo")
     29     await store.updateForm(\.media, [harness.captureImage()])
     30     let pause = ResourceTestPause()
     31     await backend.submissionBackend.pauseForeground(pause)
     32     let submit = Task { await store.submit() }
     33     await pause.entered.wait()
     34     let request = try XCTUnwrap(store.submissions.request)
     35     submit.cancel()
     36     store.updateForm(\.content, "newer editing")
     37     await store.submit()
     38     await pause.resume.open()
     39     await submit.value
     40     XCTAssertEqual(store.submissions.status?.request, request)
     41     XCTAssertEqual(store.submissions.status?.state, .complete)
     42     XCTAssertEqual(store.submissions.status?.captured.form.content, "original foreground photo")
     43     XCTAssertEqual(store.form.content, "newer editing")
     44     let foreground = await backend.submissionBackend.foregroundCount
     45     let native = await backend.submissionBackend.uploadCount
     46     let persisted = await backend.submissionBackend.completionPersisted
     47     let settlements = await harness.settlementValues()
     48     XCTAssertEqual(foreground, 1)
     49     XCTAssertEqual(native, 0)
     50     XCTAssertTrue(persisted)
     51     XCTAssertTrue(settlements.isEmpty)
     52     store.stop()
     53     _ = try await client.stop()
     54   }
     55 }
     56 
     57 /// Deliberately omits a native policy override; its media operations are usable.
     58 private struct DefaultPolicyMedia: TeraAddMediaHandling {
     59   let harness: AddMediaHarness
     60 
     61   func confirmDurableComposerMedia(_ media: [TeraComposerMedia]) async throws {
     62     try await (harness as any TeraAddMediaHandling).confirmDurableComposerMedia(media)
     63   }
     64 
     65   func support() async throws -> TeraAddMediaSupport {
     66     await harness.support()
     67   }
     68 
     69   func importImages(limit: Int) async throws -> [TeraPreparedMedia] {
     70     await harness.importImages(limit: limit)
     71   }
     72 
     73   func captureImage() async throws -> TeraPreparedMedia {
     74     await harness.captureImage()
     75   }
     76 
     77   func open(_ media: [TeraPreparedMedia]) async throws -> TeraOpenedMedia {
     78     try await harness.open(media)
     79   }
     80 }