From 693be03dcc9713e1857a50391851840a9aa8066b Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 1 Jan 2026 20:29:53 +0100 Subject: [PATCH] test: cover remote config routing --- apps/macos/Sources/Clawdis/ConfigStore.swift | 52 +++++++++++++- .../ClawdisIPCTests/ConfigStoreTests.swift | 72 +++++++++++++++++++ 2 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 apps/macos/Tests/ClawdisIPCTests/ConfigStoreTests.swift diff --git a/apps/macos/Sources/Clawdis/ConfigStore.swift b/apps/macos/Sources/Clawdis/ConfigStore.swift index 2354c8c8b..19802f906 100644 --- a/apps/macos/Sources/Clawdis/ConfigStore.swift +++ b/apps/macos/Sources/Clawdis/ConfigStore.swift @@ -1,22 +1,60 @@ import Foundation enum ConfigStore { + struct Overrides: Sendable { + var isRemoteMode: (@Sendable () async -> Bool)? + var loadLocal: (@Sendable () -> [String: Any])? + var saveLocal: (@Sendable ([String: Any]) -> Void)? + var loadRemote: (@Sendable () async -> [String: Any])? + var saveRemote: (@Sendable ([String: Any]) async throws -> Void)? + } + + private actor OverrideStore { + var overrides = Overrides() + + func setOverride(_ overrides: Overrides) { + self.overrides = overrides + } + } + + private static let overrideStore = OverrideStore() + private static func isRemoteMode() async -> Bool { + let overrides = await self.overrideStore.overrides + if let override = overrides.isRemoteMode { + return await override() + } await MainActor.run { AppStateStore.shared.connectionMode == .remote } } static func load() async -> [String: Any] { + let overrides = await self.overrideStore.overrides if await self.isRemoteMode() { + if let override = overrides.loadRemote { + return await override() + } return await self.loadFromGateway() } + if let override = overrides.loadLocal { + return override() + } return ClawdisConfigFile.loadDict() } static func save(_ root: [String: Any]) async throws { + let overrides = await self.overrideStore.overrides if await self.isRemoteMode() { - try await self.saveToGateway(root) + if let override = overrides.saveRemote { + try await override(root) + } else { + try await self.saveToGateway(root) + } } else { - ClawdisConfigFile.saveDict(root) + if let override = overrides.saveLocal { + override(root) + } else { + ClawdisConfigFile.saveDict(root) + } } } @@ -45,4 +83,14 @@ enum ConfigStore { params: params, timeoutMs: 10000) } + +#if DEBUG + static func _testSetOverrides(_ overrides: Overrides) async { + await self.overrideStore.setOverride(overrides) + } + + static func _testClearOverrides() async { + await self.overrideStore.setOverride(.init()) + } +#endif } diff --git a/apps/macos/Tests/ClawdisIPCTests/ConfigStoreTests.swift b/apps/macos/Tests/ClawdisIPCTests/ConfigStoreTests.swift new file mode 100644 index 000000000..6beaeb4b7 --- /dev/null +++ b/apps/macos/Tests/ClawdisIPCTests/ConfigStoreTests.swift @@ -0,0 +1,72 @@ +import Testing +@testable import Clawdis + +@Suite(.serialized) +@MainActor +struct ConfigStoreTests { + @Test func loadUsesRemoteInRemoteMode() async { + var localHit = false + var remoteHit = false + await ConfigStore._testSetOverrides(.init( + isRemoteMode: { true }, + loadLocal: { localHit = true; return ["local": true] }, + loadRemote: { remoteHit = true; return ["remote": true] } + )) + + let result = await ConfigStore.load() + + await ConfigStore._testClearOverrides() + #expect(remoteHit) + #expect(!localHit) + #expect(result["remote"] as? Bool == true) + } + + @Test func loadUsesLocalInLocalMode() async { + var localHit = false + var remoteHit = false + await ConfigStore._testSetOverrides(.init( + isRemoteMode: { false }, + loadLocal: { localHit = true; return ["local": true] }, + loadRemote: { remoteHit = true; return ["remote": true] } + )) + + let result = await ConfigStore.load() + + await ConfigStore._testClearOverrides() + #expect(localHit) + #expect(!remoteHit) + #expect(result["local"] as? Bool == true) + } + + @Test func saveRoutesToRemoteInRemoteMode() async throws { + var localHit = false + var remoteHit = false + await ConfigStore._testSetOverrides(.init( + isRemoteMode: { true }, + saveLocal: { _ in localHit = true }, + saveRemote: { _ in remoteHit = true } + )) + + try await ConfigStore.save(["remote": true]) + + await ConfigStore._testClearOverrides() + #expect(remoteHit) + #expect(!localHit) + } + + @Test func saveRoutesToLocalInLocalMode() async throws { + var localHit = false + var remoteHit = false + await ConfigStore._testSetOverrides(.init( + isRemoteMode: { false }, + saveLocal: { _ in localHit = true }, + saveRemote: { _ in remoteHit = true } + )) + + try await ConfigStore.save(["local": true]) + + await ConfigStore._testClearOverrides() + #expect(localHit) + #expect(!remoteHit) + } +}