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 }