test: cover remote config routing
This commit is contained in:
@@ -1,22 +1,60 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
enum ConfigStore {
|
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 {
|
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 }
|
await MainActor.run { AppStateStore.shared.connectionMode == .remote }
|
||||||
}
|
}
|
||||||
|
|
||||||
static func load() async -> [String: Any] {
|
static func load() async -> [String: Any] {
|
||||||
|
let overrides = await self.overrideStore.overrides
|
||||||
if await self.isRemoteMode() {
|
if await self.isRemoteMode() {
|
||||||
|
if let override = overrides.loadRemote {
|
||||||
|
return await override()
|
||||||
|
}
|
||||||
return await self.loadFromGateway()
|
return await self.loadFromGateway()
|
||||||
}
|
}
|
||||||
|
if let override = overrides.loadLocal {
|
||||||
|
return override()
|
||||||
|
}
|
||||||
return ClawdisConfigFile.loadDict()
|
return ClawdisConfigFile.loadDict()
|
||||||
}
|
}
|
||||||
|
|
||||||
static func save(_ root: [String: Any]) async throws {
|
static func save(_ root: [String: Any]) async throws {
|
||||||
|
let overrides = await self.overrideStore.overrides
|
||||||
if await self.isRemoteMode() {
|
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 {
|
} else {
|
||||||
ClawdisConfigFile.saveDict(root)
|
if let override = overrides.saveLocal {
|
||||||
|
override(root)
|
||||||
|
} else {
|
||||||
|
ClawdisConfigFile.saveDict(root)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,4 +83,14 @@ enum ConfigStore {
|
|||||||
params: params,
|
params: params,
|
||||||
timeoutMs: 10000)
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
72
apps/macos/Tests/ClawdisIPCTests/ConfigStoreTests.swift
Normal file
72
apps/macos/Tests/ClawdisIPCTests/ConfigStoreTests.swift
Normal file
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user