69 lines
2.7 KiB
Swift
69 lines
2.7 KiB
Swift
import CodexBarCore
|
|
import Testing
|
|
@testable import CodexBar
|
|
|
|
struct KeychainPromptCoordinatorTests {
|
|
@Test
|
|
func `detects raw SwiftPM debug executable`() {
|
|
#expect(KeychainPromptCoordinator.isUnbundledCodexBarExecutable(
|
|
"/Users/me/CodexBar/.build/arm64-apple-macosx/debug/CodexBar"))
|
|
#expect(KeychainPromptCoordinator.isUnbundledCodexBarExecutable(
|
|
"/Users/me/CodexBar/.build/debug/CodexBar"))
|
|
}
|
|
|
|
@Test
|
|
func `detects raw SwiftPM release executable`() {
|
|
#expect(KeychainPromptCoordinator.isUnbundledCodexBarExecutable(
|
|
"/Users/me/CodexBar/.build/arm64-apple-macosx/release/CodexBar"))
|
|
}
|
|
|
|
@Test
|
|
func `detects custom SwiftPM scratch path`() {
|
|
#expect(KeychainPromptCoordinator.isUnbundledCodexBarExecutable(
|
|
"/tmp/codexbar-build/arm64-apple-macosx/debug/CodexBar"))
|
|
}
|
|
|
|
@Test
|
|
func `keeps packaged app keychain behavior`() {
|
|
#expect(!KeychainPromptCoordinator.isUnbundledCodexBarExecutable(
|
|
"/Applications/CodexBar.app/Contents/MacOS/CodexBar"))
|
|
#expect(!KeychainPromptCoordinator.isUnbundledCodexBarExecutable(
|
|
"/Users/me/CodexBar/.build/package/CodexBar.app/Contents/MacOS/CodexBar"))
|
|
}
|
|
|
|
@Test
|
|
func `ignores unrelated executable paths`() {
|
|
#expect(!KeychainPromptCoordinator.isUnbundledCodexBarExecutable(
|
|
"/Users/me/CodexBar/.build/debug/CodexBarCLI"))
|
|
#expect(!KeychainPromptCoordinator.isUnbundledCodexBarExecutable(""))
|
|
#expect(!KeychainPromptCoordinator.isUnbundledCodexBarExecutable("CodexBar"))
|
|
}
|
|
|
|
@Test
|
|
func `browser cookie alert explains password handling and opt out`() {
|
|
let model = KeychainPromptCoordinator.browserCookieAlertModel(label: "Chrome Safe Storage")
|
|
|
|
#expect(model.title == "Keychain Access Required")
|
|
#expect(model.message.contains("Chrome Safe Storage"))
|
|
#expect(model.message.contains("macOS—not CodexBar—handles any Mac login password entry"))
|
|
#expect(model.message.contains("Settings → Advanced"))
|
|
#expect(model.primaryButtonTitle == "OK")
|
|
#expect(model.learnMoreButtonTitle == "Learn More…")
|
|
#expect(model.documentationURL.hasSuffix("/docs/keychain-prompts.md"))
|
|
}
|
|
|
|
@Test
|
|
func `provider alert preserves the requested keychain purpose`() {
|
|
let context = KeychainPromptContext(
|
|
kind: .claudeOAuth,
|
|
service: "Claude Code-credentials",
|
|
account: nil)
|
|
|
|
let model = KeychainPromptCoordinator.alertModel(for: context)
|
|
|
|
#expect(model.message.contains("Claude Code OAuth token"))
|
|
#expect(model.message.contains("fetch your Claude usage"))
|
|
#expect(model.learnMoreButtonTitle == "Learn More…")
|
|
}
|
|
}
|