import Foundation import Testing @testable import LocalData @Suite(.serialized) struct SyncIntegrationTests { private let router: StorageRouter init() { let testBaseURL = FileManager.default.temporaryDirectory.appending(path: "SyncIntegrationTests-\(UUID().uuidString)") router = StorageRouter( keychain: MockKeychainHelper(), encryption: EncryptionHelper(keychain: MockKeychainHelper()), file: FileStorageHelper(configuration: FileStorageConfiguration(baseURL: testBaseURL)), defaults: UserDefaultsHelper(defaults: UserDefaults(suiteName: "SyncIntegrationTests-\(UUID().uuidString)")!) ) } private static func makeSyncKey(name: String) -> StorageKey { StorageKey( name: name, domain: .userDefaults(suite: nil), security: .none, owner: "SyncTests", description: "Sync key", syncPolicy: .automaticSmall ) } private struct SyncCatalog: StorageKeyCatalog { var allKeys: [AnyStorageKey] { [.key(SyncIntegrationTests.makeSyncKey(name: "sync.test.key"))] } } @Test func updateFromSyncStoresDataLocally() async throws { // 1. Register catalog so router knows about the key try await router.registerCatalog(SyncCatalog()) let keyName = "sync.test.key" let expectedValue = "Updated from Watch" let data = try JSONEncoder().encode(expectedValue) // 2. Simulate incoming sync try await router.updateFromSync(keyName: keyName, data: data) // 3. Verify it was stored in the local domain let retrieved: String? = try await router.get(Self.makeSyncKey(name: keyName)) #expect(retrieved == expectedValue) } @Test func updateFromSyncIgnoresUnregisteredKeys() async throws { let keyName = "unregistered.sync.key" let data = Data("some data".utf8) // This should not throw, just log/ignore try await router.updateFromSync(keyName: keyName, data: data) } }