- Split config into LaunchSnapshot (frozen security keys: ollama, applescript, toolBlocklist, confirmationPolicy, logging) and PerTurnSnapshot (mutable: provider, tts, stt, featureFlags) per SEC-05 - OllamaConfig.init(from:) rejects non-localhost hosts at decode time with ConfigError.invalidOllamaHost (AGENT-05) - AppleScriptPolicy has no skipAllowlist/bypass/regex field (SEC-08); reflection test ConfigSplitTests.test_noSkipAllowlistKey enforces - FeatureFlags lives in PerTurnSnapshot only (OBS-05); reflection test LaunchSnapshotTests.test_featureFlagsNotInLaunchSnapshot enforces - SchemaMigrator: currentVersion=1, v1->v1 pass-through, future versions throw ConfigError.futureSchema - ConfigLoader.loadSnapshots: peek schemaVersion, migrate, decode both snapshots; wraps DecodingError into ConfigError.malformed - ConfigStore actor holds launch + streams perTurn updates (file- watcher wiring is Plan 03 scope) - Bundled default-config.json resource - Tests: 15/15 pass covering all behaviors listed in the plan - Deletes Plan 01 placeholders Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
30 lines
1.1 KiB
Swift
30 lines
1.1 KiB
Swift
import XCTest
|
|
@testable import Config
|
|
|
|
final class ConfigLoaderTests: XCTestCase {
|
|
func test_loadDefaultConfigFromBundle() throws {
|
|
guard let url = ConfigLoader.bundledDefaultConfigURL() else {
|
|
XCTFail("Bundled default-config.json missing"); return
|
|
}
|
|
let (launch, perTurn) = try ConfigLoader.loadSnapshots(from: url)
|
|
XCTAssertEqual(launch.schemaVersion, 1)
|
|
XCTAssertEqual(perTurn.schemaVersion, 1)
|
|
XCTAssertEqual(launch.ollama.baseURL.host, "127.0.0.1")
|
|
XCTAssertEqual(perTurn.provider, .anthropic)
|
|
}
|
|
|
|
func test_malformedConfigThrowsMalformed() throws {
|
|
let tmp = FileManager.default.temporaryDirectory.appendingPathComponent("bad-\(UUID()).json")
|
|
try Data("{not-valid-json".utf8).write(to: tmp)
|
|
defer { try? FileManager.default.removeItem(at: tmp) }
|
|
|
|
XCTAssertThrowsError(try ConfigLoader.loadSnapshots(from: tmp)) { error in
|
|
if case .malformed = error as? ConfigError {
|
|
// OK
|
|
} else {
|
|
XCTFail("Expected ConfigError.malformed, got: \(error)")
|
|
}
|
|
}
|
|
}
|
|
}
|