import CodexBarCore import Commander import Testing @testable import CodexBarCLI struct CLIConfigCommandTests { @Test func `config set api key parses provider stdin and no enable flags`() throws { let parser = CommandParser(signature: CodexBarCLI._configSetAPIKeySignatureForTesting()) let parsed = try parser.parse(arguments: [ "--provider", "elevenlabs", "--stdin", "--no-enable", "--json", ]) #expect(parsed.options["provider"] == ["elevenlabs"]) #expect(parsed.flags.contains("stdin")) #expect(parsed.flags.contains("noEnable")) #expect(CodexBarCLI._decodeFormatForTesting(from: parsed) == .json) } @Test func `config set api key stores key and enables provider`() { let config = CodexBarConfig.makeDefault() let updated = CodexBarCLI.configSettingAPIKey( config, provider: .elevenlabs, apiKey: "xi-test-token", enableProvider: true) let provider = updated.providerConfig(for: .elevenlabs) #expect(provider?.sanitizedAPIKey == "xi-test-token") #expect(provider?.enabled == true) } @Test func `config provider toggle parses provider and json flags`() throws { let parser = CommandParser(signature: CodexBarCLI._configProviderToggleSignatureForTesting()) let parsed = try parser.parse(arguments: [ "--provider", "grok", "--json", "--pretty", ]) #expect(parsed.options["provider"] == ["grok"]) #expect(CodexBarCLI._decodeFormatForTesting(from: parsed) == .json) #expect(parsed.flags.contains("pretty")) } @Test func `config provider toggle enables and disables provider`() { let config = CodexBarConfig.makeDefault() let enabled = CodexBarCLI.configSettingProviderEnabled(config, provider: .grok, enabled: true) let disabled = CodexBarCLI.configSettingProviderEnabled(enabled, provider: .grok, enabled: false) #expect(enabled.providerConfig(for: .grok)?.enabled == true) #expect(disabled.providerConfig(for: .grok)?.enabled == false) } @Test func `config provider status includes effective default`() throws { let config = CodexBarConfig(providers: [ ProviderConfig(id: .grok, enabled: true), ProviderConfig(id: .cursor, enabled: false), ]) let statuses = CodexBarCLI.configProviderStatuses(config) let grok = try #require(statuses.first { $0.provider == "grok" }) let cursor = try #require(statuses.first { $0.provider == "cursor" }) #expect(grok.enabled) #expect(!cursor.enabled) #expect(statuses.count == UsageProvider.allCases.count) } @Test func `config set api key only accepts consumed config keys`() { #expect(ProviderConfigEnvironment.supportsAPIKeyOverride(for: .elevenlabs)) #expect(ProviderConfigEnvironment.supportsAPIKeyOverride(for: .groq)) #expect(ProviderConfigEnvironment.supportsAPIKeyOverride(for: .llmproxy)) #expect(ProviderConfigEnvironment.supportsAPIKeyOverride(for: .openai)) #expect(ProviderConfigEnvironment.supportsAPIKeyOverride(for: .amp)) #expect(ProviderConfigEnvironment.supportsAPIKeyOverride(for: .kimi)) #expect(!ProviderConfigEnvironment.supportsAPIKeyOverride(for: .bedrock)) #expect(!ProviderConfigEnvironment.supportsAPIKeyOverride(for: .deepseek)) #expect(!ProviderConfigEnvironment.supportsAPIKeyOverride(for: .cursor)) } @Test func `config set api key preserves disabled provider when requested`() { var config = CodexBarConfig.makeDefault() config.setProviderConfig(ProviderConfig(id: .elevenlabs, enabled: false)) let updated = CodexBarCLI.configSettingAPIKey( config, provider: .elevenlabs, apiKey: "xi-test-token", enableProvider: false) let provider = updated.providerConfig(for: .elevenlabs) #expect(provider?.sanitizedAPIKey == "xi-test-token") #expect(provider?.enabled == false) } @Test func `config set api key rejects ambiguous input`() { #expect(throws: CLIArgumentError.self) { try CodexBarCLI.resolveConfigAPIKeyInput(apiKey: "xi-test-token", readFromStdin: true) } } @Test func `config help documents set api key`() { let help = CodexBarCLI.configHelp(version: "0.0.0") #expect(help.contains("config set-api-key --provider ")) #expect(help.contains("config providers")) #expect(help.contains("config enable --provider ")) #expect(help.contains("config disable --provider ")) #expect(help.contains("--stdin")) #expect(help.contains("enables that provider by default")) } }