Files
Jarvis/packages/Config/Tests/ConfigTests/ConfigLoaderTests.swift
james.maesandClaude Opus 4.7 1b2f067376 feat(01-02): build Config package (AGENT-05, SEC-05, SEC-08, OBS-05)
- 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>
2026-04-22 13:19:41 -05:00

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)")
}
}
}
}