Files
steipete--codexbar/Tests/CodexBarTests/ProviderTokenResolverTests.swift
2026-07-13 12:22:33 +08:00

155 lines
6.2 KiB
Swift

import CodexBarCore
import Foundation
import Testing
struct ProviderTokenResolverTests {
@Test
func `zai resolution uses environment token`() {
let env = [ZaiSettingsReader.apiTokenKey: "token"]
let resolution = ProviderTokenResolver.zaiResolution(environment: env)
#expect(resolution?.token == "token")
#expect(resolution?.source == .environment)
}
@Test
func `copilot resolution trims token`() {
let env = ["COPILOT_API_TOKEN": " token "]
let resolution = ProviderTokenResolver.copilotResolution(environment: env)
#expect(resolution?.token == "token")
}
@Test
func `warp resolution uses environment token`() {
let env = ["WARP_API_KEY": "wk-test-token"]
let resolution = ProviderTokenResolver.warpResolution(environment: env)
#expect(resolution?.token == "wk-test-token")
#expect(resolution?.source == .environment)
}
@Test
func `warp resolution trims token`() {
let env = ["WARP_API_KEY": " wk-token "]
let resolution = ProviderTokenResolver.warpResolution(environment: env)
#expect(resolution?.token == "wk-token")
}
@Test
func `warp resolution returns nil when missing`() {
let env: [String: String] = [:]
let resolution = ProviderTokenResolver.warpResolution(environment: env)
#expect(resolution == nil)
}
@Test
func `doubao resolution uses first supported environment token`() {
let env = ["ARK_API_KEY": "ark-token"]
let resolution = ProviderTokenResolver.doubaoResolution(environment: env)
#expect(resolution?.token == "ark-token")
#expect(resolution?.source == .environment)
}
@Test
func `doubao settings reader trims quoted token`() {
let env = ["DOUBAO_API_KEY": " 'doubao-token' "]
#expect(DoubaoSettingsReader.apiKey(environment: env) == "doubao-token")
}
@Test
func `kilo resolution prefers environment over auth file`() throws {
let fileURL = try self.makeKiloAuthFile(contents: #"{"kilo":{"access":"file-token"}}"#)
defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) }
let env = [KiloSettingsReader.apiTokenKey: "env-token"]
let resolution = ProviderTokenResolver.kiloResolution(environment: env, authFileURL: fileURL)
#expect(resolution?.token == "env-token")
#expect(resolution?.source == .environment)
}
@Test
func `kilo resolution falls back to auth file`() throws {
let fileURL = try self.makeKiloAuthFile(contents: #"{"kilo":{"access":"file-token"}}"#)
defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) }
let resolution = ProviderTokenResolver.kiloResolution(environment: [:], authFileURL: fileURL)
#expect(resolution?.token == "file-token")
#expect(resolution?.source == .authFile)
}
@Test
func `kilo resolution returns nil for malformed auth file`() throws {
let fileURL = try self.makeKiloAuthFile(contents: #"{not-json}"#)
defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) }
let resolution = ProviderTokenResolver.kiloResolution(environment: [:], authFileURL: fileURL)
#expect(resolution == nil)
}
private func makeKiloAuthFile(contents: String) throws -> URL {
let directory = FileManager.default.temporaryDirectory
.appendingPathComponent(UUID().uuidString, isDirectory: true)
try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)
let fileURL = directory.appendingPathComponent("auth.json", isDirectory: false)
try contents.write(to: fileURL, atomically: true, encoding: .utf8)
return fileURL
}
@Test
func `codebuff resolution prefers environment over credentials file`() throws {
let fileURL = try self.makeCodebuffCredentialsFile(
contents: #"{"authToken":"file-token"}"#)
defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) }
let env = [CodebuffSettingsReader.apiTokenKey: "env-token"]
let resolution = ProviderTokenResolver.codebuffResolution(
environment: env,
authFileURL: fileURL)
#expect(resolution?.token == "env-token")
#expect(resolution?.source == .environment)
}
@Test
func `codebuff resolution falls back to credentials file`() throws {
let fileURL = try self.makeCodebuffCredentialsFile(
contents: #"{"authToken":"file-token","fingerprintId":"fp"}"#)
defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) }
let resolution = ProviderTokenResolver.codebuffResolution(
environment: [:],
authFileURL: fileURL)
#expect(resolution?.token == "file-token")
#expect(resolution?.source == .authFile)
}
@Test
func `codebuff resolution returns nil for malformed credentials file`() throws {
let fileURL = try self.makeCodebuffCredentialsFile(contents: #"{not-json}"#)
defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) }
let resolution = ProviderTokenResolver.codebuffResolution(
environment: [:],
authFileURL: fileURL)
#expect(resolution == nil)
}
@Test
func `poe resolution uses manual api key`() {
let env = [PoeSettingsReader.apiKeyEnvironmentKey: "manual-key"]
let resolution = ProviderTokenResolver.poeResolution(environment: env)
#expect(resolution?.token == "manual-key")
#expect(resolution?.source == .environment)
}
private func makeCodebuffCredentialsFile(contents: String) throws -> URL {
let directory = FileManager.default.temporaryDirectory
.appendingPathComponent(UUID().uuidString, isDirectory: true)
try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)
let fileURL = directory.appendingPathComponent("credentials.json", isDirectory: false)
try contents.write(to: fileURL, atomically: true, encoding: .utf8)
return fileURL
}
}