TeraCapacityRecoveryTests.swift (3452B)
1 import RadrootsKit 2 @testable import TeraApp 3 import XCTest 4 5 final class TeraCapacityRecoveryTests: XCTestCase { 6 func testTypedNativeCapacityAndReceiptQuotaRemainDistinctAndNeverPromiseSavedEditing() { 7 let capacity: [Error] = [RadrootsAppleFileError.spaceInsufficient, RadrootsCaptureIntakeError.spaceInsufficient, RadrootsBackgroundTransferError.spaceInsufficient] 8 for error in capacity { 9 XCTAssertEqual(TeraUserMessages.key(for: error, fallback: .fileOperationFailed), .storageFull) 10 XCTAssertEqual(TeraNativeRecoveryClassification.pause(error), .quota) 11 } 12 let quota = RadrootsBackgroundTransferError.receiptCapacityExceeded 13 XCTAssertEqual(TeraUserMessages.key(for: quota, fallback: .fileOperationFailed), .receiptCapacityExceeded) 14 XCTAssertEqual(TeraNativeRecoveryClassification.pause(quota), .receiptQuota) 15 XCTAssertTrue(TeraUserMessages.text(.receiptCapacityExceeded).contains("does not resolve")) 16 XCTAssertTrue(TeraUserMessages.text(.storageFull).contains("check the original work before retrying")) 17 XCTAssertTrue(TeraUserMessages.text(.storageFull).contains("Saving may be unavailable")) 18 for pause in [TeraNativeRecoveryPause.quota, .receiptQuota, .storageUnavailable] { 19 XCTAssertFalse(pause.message.contains("Saved editing is still available")) 20 XCTAssertTrue(pause.message.contains("new saves may be unavailable")) 21 } 22 } 23 24 @MainActor 25 func testCacheCleanupAdmissionSurvivesStopAndLateResultsCannotOverwritePresentation() async throws { 26 let backend = try TeraScopeBackend() 27 let client = try await TeraScopeFixtures.client(backend) 28 let store = TeraSettingsStore(runtimeClient: client) 29 let context = TeraLocalNetwork.defaultContext(snapshot: TeraScopeFixtures.snapshot()) 30 let pause = await backend.pause(.cacheCleanup) 31 let owner = Task { await store.cleanupMediaCache(context: context) } 32 await pause.entered.wait() 33 store.stop() 34 await store.cleanupMediaCache(context: context) 35 let firstCount = await backend.counts[.cacheCleanup] 36 XCTAssertEqual(firstCount, 1) 37 await pause.resume.open() 38 await owner.value 39 XCTAssertNil(store.message) 40 await store.cleanupMediaCache(context: context) 41 let secondCount = await backend.counts[.cacheCleanup] 42 XCTAssertEqual(secondCount, 2) 43 XCTAssertTrue(store.message?.contains("1 shared or unverified") == true) 44 XCTAssertFalse(store.message?.contains("bytes freed") == true) 45 _ = try await client.stop() 46 } 47 48 @MainActor 49 func testFailedCacheCleanupDoesNotReportSuccessOrDiscardEditing() async throws { 50 let backend = try TeraScopeBackend() 51 let client = try await TeraScopeFixtures.client(backend) 52 let store = TeraSettingsStore(runtimeClient: client) 53 store.profileName = "Unsaved profile" 54 let context = TeraLocalNetwork.defaultContext(snapshot: TeraScopeFixtures.snapshot()) 55 let failure = TeraRuntimeFailure.local(operation: "test", code: "storage_space_insufficient", safeMessage: "space") 56 let pause = await backend.pause(.cacheCleanup, failure: failure) 57 let owner = Task { await store.cleanupMediaCache(context: context) } 58 await pause.entered.wait() 59 await pause.resume.open() 60 await owner.value 61 XCTAssertEqual(store.profileName, "Unsaved profile") 62 XCTAssertEqual(store.failureCode, "storage_space_insufficient") 63 XCTAssertEqual(store.message, TeraUserMessages.text(.storageFull)) 64 _ = try await client.stop() 65 } 66 }