710 lines · 25.0 KB · Swift
RawDownload
import CodexBarCoreimport Foundationimport SwiftUIimport Testing@testable import CodexBar struct MenuCardModelTests {    @Test    func `builds metrics using remaining percent`() throws {        let now = Date()        let identity = ProviderIdentitySnapshot(            providerID: .codex,            accountEmail: "codex@example.com",            accountOrganization: nil,            loginMethod: "Plus Plan")        let snapshot = UsageSnapshot(            primary: RateWindow(                usedPercent: 22,                windowMinutes: 300,                resetsAt: now.addingTimeInterval(3000),                resetDescription: nil),            secondary: RateWindow(                usedPercent: 40,                windowMinutes: 10080,                resetsAt: now.addingTimeInterval(6000),                resetDescription: nil),            updatedAt: now,            identity: identity)        let metadata = try #require(ProviderDefaults.metadata[.codex])        let updatedSnap = try UsageSnapshot(            primary: snapshot.primary,            secondary: RateWindow(                usedPercent: #require(snapshot.secondary?.usedPercent),                windowMinutes: #require(snapshot.secondary?.windowMinutes),                resetsAt: now.addingTimeInterval(3600),                resetDescription: nil),            tertiary: snapshot.tertiary,            updatedAt: now,            identity: identity)        let codexProjection = CodexConsumerProjection.make(            surface: .liveCard,            context: CodexConsumerProjection.Context(                snapshot: updatedSnap,                rawUsageError: nil,                liveCredits: nil,                rawCreditsError: nil,                liveDashboard: nil,                rawDashboardError: nil,                dashboardAttachmentAuthorized: false,                dashboardRequiresLogin: false,                now: now))         let model = UsageMenuCardView.Model.make(.init(            provider: .codex,            metadata: metadata,            snapshot: updatedSnap,            codexProjection: codexProjection,            credits: CreditsSnapshot(remaining: 12, events: [], updatedAt: now),            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: nil,            tokenError: nil,            account: AccountInfo(email: "codex@example.com", plan: "Plus Plan"),            isRefreshing: false,            lastError: nil,            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: false,            showOptionalCreditsAndExtraUsage: true,            hidePersonalInfo: false,            now: now))         #expect(model.providerName == "Codex")        #expect(model.metrics.count == 2)        #expect(model.metrics.first?.percent == 78)        #expect(model.planText == "Plus")        #expect(model.subtitleText.hasPrefix("Updated"))        #expect(model.progressColor != Color.clear)        #expect(model.metrics[1].resetText?.isEmpty == false)    }     @Test    func `claude model hides weekly when unavailable`() throws {        let now = Date()        let identity = ProviderIdentitySnapshot(            providerID: .claude,            accountEmail: nil,            accountOrganization: nil,            loginMethod: "Max")        let snapshot = UsageSnapshot(            primary: RateWindow(                usedPercent: 2,                windowMinutes: nil,                resetsAt: now.addingTimeInterval(3600),                resetDescription: nil),            secondary: nil,            tertiary: nil,            updatedAt: now,            identity: identity)        let metadata = try #require(ProviderDefaults.metadata[.claude])        let model = UsageMenuCardView.Model.make(.init(            provider: .claude,            metadata: metadata,            snapshot: snapshot,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: nil,            tokenError: nil,            account: AccountInfo(email: "codex@example.com", plan: "plus"),            isRefreshing: false,            lastError: nil,            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: false,            showOptionalCreditsAndExtraUsage: true,            hidePersonalInfo: false,            now: now))         #expect(model.metrics.count == 1)        #expect(model.metrics.first?.title == "Session")        #expect(model.planText == "Max")    }     @Test    func `shows error subtitle when present`() throws {        let metadata = try #require(ProviderDefaults.metadata[.codex])        let model = UsageMenuCardView.Model.make(.init(            provider: .codex,            metadata: metadata,            snapshot: nil,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: nil,            tokenError: nil,            account: AccountInfo(email: nil, plan: nil),            isRefreshing: false,            lastError: "Probe failed for Codex",            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: false,            showOptionalCreditsAndExtraUsage: true,            hidePersonalInfo: false,            now: Date()))         #expect(model.subtitleStyle == .error)        #expect(model.subtitleText.contains("Probe failed"))        #expect(model.placeholder == nil)    }     @Test    func `cost section includes last30 days tokens`() throws {        let now = Date()        let metadata = try #require(ProviderDefaults.metadata[.codex])        let snapshot = UsageSnapshot(            primary: RateWindow(usedPercent: 0, windowMinutes: 300, resetsAt: nil, resetDescription: nil),            secondary: nil,            tertiary: nil,            updatedAt: now)        let tokenSnapshot = CostUsageTokenSnapshot(            sessionTokens: 123,            sessionCostUSD: 1.23,            last30DaysTokens: 456,            last30DaysCostUSD: 78.9,            daily: [],            updatedAt: now)        let model = UsageMenuCardView.Model.make(.init(            provider: .codex,            metadata: metadata,            snapshot: snapshot,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: tokenSnapshot,            tokenError: nil,            account: AccountInfo(email: nil, plan: nil),            isRefreshing: false,            lastError: nil,            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: true,            showOptionalCreditsAndExtraUsage: true,            hidePersonalInfo: false,            now: now))         #expect(model.tokenUsage?.monthLine.contains("456") == true)        #expect(model.tokenUsage?.monthLine.contains("tokens") == true)    }     @Test    func `claude model does not leak codex plan`() throws {        let metadata = try #require(ProviderDefaults.metadata[.claude])        let model = UsageMenuCardView.Model.make(.init(            provider: .claude,            metadata: metadata,            snapshot: nil,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: nil,            tokenError: nil,            account: AccountInfo(email: "codex@example.com", plan: "plus"),            isRefreshing: false,            lastError: nil,            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: false,            showOptionalCreditsAndExtraUsage: true,            hidePersonalInfo: false,            now: Date()))         #expect(model.planText == nil)        #expect(model.email.isEmpty)    }     @Test    func `hides claude extra usage when disabled`() throws {        let now = Date()        let identity = ProviderIdentitySnapshot(            providerID: .claude,            accountEmail: "claude@example.com",            accountOrganization: nil,            loginMethod: nil)        let snapshot = UsageSnapshot(            primary: RateWindow(usedPercent: 0, windowMinutes: nil, resetsAt: nil, resetDescription: nil),            secondary: nil,            tertiary: nil,            providerCost: ProviderCostSnapshot(used: 12, limit: 200, currencyCode: "USD", updatedAt: now),            updatedAt: now,            identity: identity)        let metadata = try #require(ProviderDefaults.metadata[.claude])         let model = UsageMenuCardView.Model.make(.init(            provider: .claude,            metadata: metadata,            snapshot: snapshot,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: nil,            tokenError: nil,            account: AccountInfo(email: nil, plan: nil),            isRefreshing: false,            lastError: nil,            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: false,            showOptionalCreditsAndExtraUsage: false,            hidePersonalInfo: false,            now: now))         #expect(model.providerCost == nil)    }     @Test    @MainActor    func `open router model uses API key quota bar and quota detail`() throws {        let now = Date()        let metadata = try #require(ProviderDefaults.metadata[.openrouter])        let snapshot = OpenRouterUsageSnapshot(            totalCredits: 50,            totalUsage: 45.3895596325,            balance: 4.6104403675,            usedPercent: 90.779119265,            keyLimit: 20,            keyUsage: 0.5,            rateLimit: nil,            updatedAt: now).toUsageSnapshot()         let model = UsageMenuCardView.Model.make(.init(            provider: .openrouter,            metadata: metadata,            snapshot: snapshot,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: nil,            tokenError: nil,            account: AccountInfo(email: nil, plan: nil),            isRefreshing: false,            lastError: nil,            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: false,            showOptionalCreditsAndExtraUsage: true,            hidePersonalInfo: false,            now: now))         #expect(model.creditsText == nil)        #expect(model.metrics.count == 1)        #expect(model.usageNotes.isEmpty)        let metric = try #require(model.metrics.first)        let popupTitle = UsageMenuCardView.popupMetricTitle(            provider: .openrouter,            metric: metric)        #expect(popupTitle == "API key limit")        #expect(metric.resetText == "$19.50/$20.00 left")        #expect(metric.detailRightText == nil)    }     @Test    func `open router model without key limit shows text only summary`() throws {        let now = Date()        let metadata = try #require(ProviderDefaults.metadata[.openrouter])        let snapshot = OpenRouterUsageSnapshot(            totalCredits: 50,            totalUsage: 45.3895596325,            balance: 4.6104403675,            usedPercent: 90.779119265,            keyDataFetched: true,            keyLimit: nil,            keyUsage: nil,            rateLimit: nil,            updatedAt: now).toUsageSnapshot()         let model = UsageMenuCardView.Model.make(.init(            provider: .openrouter,            metadata: metadata,            snapshot: snapshot,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: nil,            tokenError: nil,            account: AccountInfo(email: nil, plan: nil),            isRefreshing: false,            lastError: nil,            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: false,            showOptionalCreditsAndExtraUsage: true,            hidePersonalInfo: false,            now: now))         #expect(model.metrics.isEmpty)        #expect(model.creditsText == nil)        #expect(model.placeholder == nil)        #expect(model.usageNotes == ["No limit set for the API key"])    }     @Test    func `open router model when key fetch unavailable shows unavailable note`() throws {        let now = Date()        let metadata = try #require(ProviderDefaults.metadata[.openrouter])        let snapshot = OpenRouterUsageSnapshot(            totalCredits: 50,            totalUsage: 45.3895596325,            balance: 4.6104403675,            usedPercent: 90.779119265,            keyDataFetched: false,            keyLimit: nil,            keyUsage: nil,            rateLimit: nil,            updatedAt: now).toUsageSnapshot()         let model = UsageMenuCardView.Model.make(.init(            provider: .openrouter,            metadata: metadata,            snapshot: snapshot,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: nil,            tokenError: nil,            account: AccountInfo(email: nil, plan: nil),            isRefreshing: false,            lastError: nil,            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: false,            showOptionalCreditsAndExtraUsage: true,            hidePersonalInfo: false,            now: now))         #expect(model.metrics.isEmpty)        #expect(model.usageNotes == ["API key limit unavailable right now"])    }     @Test    func `hides email when personal info hidden`() throws {        let now = Date()        let identity = ProviderIdentitySnapshot(            providerID: .codex,            accountEmail: "codex@example.com",            accountOrganization: nil,            loginMethod: nil)        let snapshot = UsageSnapshot(            primary: RateWindow(usedPercent: 0, windowMinutes: 300, resetsAt: nil, resetDescription: nil),            secondary: nil,            tertiary: nil,            updatedAt: now,            identity: identity)        let metadata = try #require(ProviderDefaults.metadata[.codex])         let model = UsageMenuCardView.Model.make(.init(            provider: .codex,            metadata: metadata,            snapshot: snapshot,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: "OpenAI dashboard signed in as codex@example.com.",            tokenSnapshot: nil,            tokenError: nil,            account: AccountInfo(email: "codex@example.com", plan: nil),            isRefreshing: false,            lastError: "OpenAI dashboard signed in as codex@example.com.",            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: false,            showOptionalCreditsAndExtraUsage: true,            hidePersonalInfo: true,            now: now))         #expect(model.email == "Hidden")        #expect(model.subtitleText.contains("codex@example.com") == false)        #expect(model.creditsHintCopyText?.isEmpty == true)        #expect(model.creditsHintText?.contains("codex@example.com") == false)    }     @Test    func `kilo model splits pass and activity and shows fallback note`() throws {        let now = Date()        let metadata = try #require(ProviderDefaults.metadata[.kilo])        let snapshot = UsageSnapshot(            primary: RateWindow(                usedPercent: 40,                windowMinutes: nil,                resetsAt: nil,                resetDescription: "40/100 credits"),            secondary: nil,            tertiary: nil,            updatedAt: now,            identity: ProviderIdentitySnapshot(                providerID: .kilo,                accountEmail: nil,                accountOrganization: nil,                loginMethod: "Kilo Pass Pro · Auto top-up: visa"))         let model = UsageMenuCardView.Model.make(.init(            provider: .kilo,            metadata: metadata,            snapshot: snapshot,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: nil,            tokenError: nil,            account: AccountInfo(email: nil, plan: nil),            isRefreshing: false,            lastError: nil,            usageBarsShowUsed: false,            resetTimeDisplayStyle: .countdown,            tokenCostUsageEnabled: false,            showOptionalCreditsAndExtraUsage: true,            sourceLabel: "cli",            kiloAutoMode: true,            hidePersonalInfo: false,            now: now))         #expect(model.planText == "Kilo Pass Pro")        #expect(model.usageNotes.contains("Auto top-up: visa"))        #expect(model.usageNotes.contains("Using CLI fallback"))    }     @Test    func `kilo model treats auto top up only login as activity`() throws {        let now = Date()        let metadata = try #require(ProviderDefaults.metadata[.kilo])        let snapshot = UsageSnapshot(            primary: nil,            secondary: nil,            tertiary: nil,            updatedAt: now,            identity: ProviderIdentitySnapshot(                providerID: .kilo,                accountEmail: nil,                accountOrganization: nil,                loginMethod: "Auto top-up: off"))         let model = UsageMenuCardView.Model.make(.init(            provider: .kilo,            metadata: metadata,            snapshot: snapshot,            credits: nil,            creditsError: nil,            dashboard: nil,            dashboardError: nil,            tokenSnapshot: nil,

Lines 1–500 of 710.