import Foundation import XCTest @testable import LocalData private struct TestUserDefaultsKey: StorageKey { typealias Value = String let name: String let domain: StorageDomain let security: SecurityPolicy = .none let serializer: Serializer = .json let owner: String = "LocalDataTests" let availability: PlatformAvailability = .all let syncPolicy: SyncPolicy = .never init(name: String, suiteName: String) { self.name = name self.domain = .userDefaults(suite: suiteName) } } private struct TestFileKey: StorageKey { typealias Value = String let name: String let domain: StorageDomain let security: SecurityPolicy = .none let serializer: Serializer = .json let owner: String = "LocalDataTests" let availability: PlatformAvailability = .all let syncPolicy: SyncPolicy = .never init(name: String, directory: URL) { self.name = name self.domain = .fileSystem(directory: .custom(directory)) } } final class LocalDataTests: XCTestCase { private var suiteName: String = "" private var tempDirectory: URL = .temporaryDirectory override func setUp() { super.setUp() suiteName = "LocalDataTests.\(UUID().uuidString)" tempDirectory = FileManager.default.temporaryDirectory .appending(path: "LocalDataTests") .appending(path: UUID().uuidString) } override func tearDown() { if let defaults = UserDefaults(suiteName: suiteName) { defaults.removePersistentDomain(forName: suiteName) } try? FileManager.default.removeItem(at: tempDirectory) super.tearDown() } func testUserDefaultsRoundTrip() async throws { let key = TestUserDefaultsKey(name: "test.string", suiteName: suiteName) let storedValue = "1.0.0" try await StorageRouter.shared.set(storedValue, for: key) let fetched = try await StorageRouter.shared.get(key) XCTAssertEqual(fetched, storedValue) try await StorageRouter.shared.remove(key) do { _ = try await StorageRouter.shared.get(key) XCTFail("Expected notFound error after removal") } catch StorageError.notFound { return } catch { XCTFail("Unexpected error: \(error)") } } func testFileSystemRoundTrip() async throws { let key = TestFileKey(name: "test.json", directory: tempDirectory) let storedValue = "payload" try await StorageRouter.shared.set(storedValue, for: key) let fetched = try await StorageRouter.shared.get(key) XCTAssertEqual(fetched, storedValue) try await StorageRouter.shared.remove(key) do { _ = try await StorageRouter.shared.get(key) XCTFail("Expected notFound error after removal") } catch StorageError.notFound { return } catch { XCTFail("Unexpected error: \(error)") } } }