import CodexBarCore import Foundation import Testing @testable import CodexBar @MainActor struct OpenAIWebAccountSwitchTests { @Test func `clears dashboard when codex email changes`() { let settings = SettingsStore( configStore: testConfigStore(suiteName: "OpenAIWebAccountSwitchTests-clears"), zaiTokenStore: NoopZaiTokenStore(), syntheticTokenStore: NoopSyntheticTokenStore()) settings.refreshFrequency = .manual let store = UsageStore( fetcher: UsageFetcher(), browserDetection: BrowserDetection(cacheTTL: 0), settings: settings) store.handleOpenAIWebTargetEmailChangeIfNeeded(targetEmail: "a@example.com") store.openAIDashboard = OpenAIDashboardSnapshot( signedInEmail: "a@example.com", codeReviewRemainingPercent: 100, creditEvents: [], dailyBreakdown: [], usageBreakdown: [], creditsPurchaseURL: nil, updatedAt: Date()) store.handleOpenAIWebTargetEmailChangeIfNeeded(targetEmail: "b@example.com") #expect(store.openAIDashboard == nil) #expect(store.openAIDashboardRequiresLogin == true) #expect(store.openAIDashboardCookieImportStatus?.contains("Codex account changed") == true) } @Test func `keeps dashboard when codex email stays same`() { let settings = SettingsStore( configStore: testConfigStore(suiteName: "OpenAIWebAccountSwitchTests-keeps"), zaiTokenStore: NoopZaiTokenStore(), syntheticTokenStore: NoopSyntheticTokenStore()) settings.refreshFrequency = .manual let store = UsageStore( fetcher: UsageFetcher(), browserDetection: BrowserDetection(cacheTTL: 0), settings: settings) store.handleOpenAIWebTargetEmailChangeIfNeeded(targetEmail: "a@example.com") let dash = OpenAIDashboardSnapshot( signedInEmail: "a@example.com", codeReviewRemainingPercent: 100, creditEvents: [], dailyBreakdown: [], usageBreakdown: [], creditsPurchaseURL: nil, updatedAt: Date()) store.openAIDashboard = dash store.handleOpenAIWebTargetEmailChangeIfNeeded(targetEmail: "a@example.com") #expect(store.openAIDashboard == dash) } @Test func `clears dashboard when profile source changes with the same email`() { let settings = SettingsStore( configStore: testConfigStore(suiteName: "OpenAIWebAccountSwitchTests-profile-source"), zaiTokenStore: NoopZaiTokenStore(), syntheticTokenStore: NoopSyntheticTokenStore()) let store = UsageStore( fetcher: UsageFetcher(), browserDetection: BrowserDetection(cacheTTL: 0), settings: settings) store.handleOpenAIWebTargetEmailChangeIfNeeded( targetEmail: "shared@example.com", targetScope: .profileHome("/tmp/codex-profile-a")) store.openAIDashboard = OpenAIDashboardSnapshot( signedInEmail: "shared@example.com", codeReviewRemainingPercent: 100, creditEvents: [], dailyBreakdown: [], usageBreakdown: [], creditsPurchaseURL: nil, updatedAt: Date()) store.handleOpenAIWebTargetEmailChangeIfNeeded( targetEmail: "shared@example.com", targetScope: .profileHome("/tmp/codex-profile-b")) #expect(store.openAIDashboard == nil) #expect(store.openAIWebAccountDidChange) #expect(store.openAIDashboardRequiresLogin) } }