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

993 lines
45 KiB
Swift

import CodexBarCore
import Foundation
import Testing
@testable import CodexBar
@MainActor
struct UsageStoreHighestUsageTests {
@Test
func `selects highest usage among enabled providers`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-selects"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let claudeMeta = registry.metadata[.claude] {
settings.setProviderEnabled(provider: .claude, metadata: claudeMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 25, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let claudeSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 60, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(claudeSnapshot, provider: .claude)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .claude)
#expect(highest?.usedPercent == 60)
let overviewHighest = store.providerWithHighestUsage(candidateProviders: [.codex])
#expect(overviewHighest?.provider == .codex)
#expect(overviewHighest?.usedPercent == 25)
#expect(store.providerWithHighestUsage(candidateProviders: []) == nil)
}
@Test
func `skips fully used providers`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-skips"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let claudeMeta = registry.metadata[.claude] {
settings.setProviderEnabled(provider: .claude, metadata: claudeMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let claudeSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 80, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(claudeSnapshot, provider: .claude)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .claude)
#expect(highest?.usedPercent == 80)
}
@Test
func `automatic metric uses rate limit for kimi when ranking highest usage`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-kimi-automatic"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .kimi)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let kimiMeta = registry.metadata[.kimi] {
settings.setProviderEnabled(provider: .kimi, metadata: kimiMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 70, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let kimiSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 90, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 20, windowMinutes: 300, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(kimiSnapshot, provider: .kimi)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
#expect(highest?.usedPercent == 70)
}
@Test
func `automatic metric ignores antigravity tertiary when compact icon has no quota summary`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-antigravity-tertiary"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .antigravity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let antigravityMeta = registry.metadata[.antigravity] {
settings.setProviderEnabled(provider: .antigravity, metadata: antigravityMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 70, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let antigravitySnapshot = UsageSnapshot(
primary: nil,
secondary: nil,
tertiary: RateWindow(usedPercent: 85, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(antigravitySnapshot, provider: .antigravity)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
#expect(highest?.usedPercent == 70)
}
@Test
func `automatic metric ignores unclassified antigravity compact fallback`() throws {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-antigravity-unclassified"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .antigravity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let antigravityMeta = registry.metadata[.antigravity] {
settings.setProviderEnabled(provider: .antigravity, metadata: antigravityMeta, enabled: true)
}
let store = UsageStore(
fetcher: UsageFetcher(),
browserDetection: BrowserDetection(cacheTTL: 0),
settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 50, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let antigravitySnapshot = try AntigravityStatusSnapshot(
modelQuotas: [
AntigravityModelQuota(
label: "Experimental Model",
modelId: "MODEL_PLACEHOLDER_NEW",
remainingFraction: 0.36,
resetTime: nil,
resetDescription: nil),
],
accountEmail: nil,
accountPlan: nil,
source: .local)
.toUsageSnapshot()
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(antigravitySnapshot, provider: .antigravity)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
#expect(highest?.usedPercent == 50)
}
@Test
func `automatic metric ignores legacy antigravity family lanes without quota summary`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-antigravity-constrained-gemini"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .antigravity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let antigravityMeta = registry.metadata[.antigravity] {
settings.setProviderEnabled(provider: .antigravity, metadata: antigravityMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 70, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let antigravitySnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 0, windowMinutes: nil, resetsAt: nil, resetDescription: "Claude"),
secondary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: "Gemini Pro"),
tertiary: RateWindow(usedPercent: 40, windowMinutes: nil, resetsAt: nil, resetDescription: "Gemini Flash"),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(antigravitySnapshot, provider: .antigravity)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
#expect(highest?.usedPercent == 70)
}
}
extension UsageStoreHighestUsageTests {
@Test
func `automatic metric ranks antigravity by rendered quota summary lanes across groups`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-antigravity-all-summary"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .antigravity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let antigravityMeta = registry.metadata[.antigravity] {
settings.setProviderEnabled(provider: .antigravity, metadata: antigravityMeta, enabled: true)
}
let store = UsageStore(
fetcher: UsageFetcher(),
browserDetection: BrowserDetection(cacheTTL: 0),
settings: settings)
store._setSnapshotForTesting(
UsageSnapshot(
primary: RateWindow(usedPercent: 80, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date()),
provider: .codex)
let antigravity = self.antigravityQuotaSummarySnapshot(
geminiSessionUsed: 10,
geminiWeeklyUsed: 20,
otherSessionUsed: 95,
otherWeeklyUsed: 90)
let unknownCadence = NamedRateWindow(
id: "antigravity-quota-summary-future-daily",
title: "Future daily lane",
window: RateWindow(
usedPercent: 99,
windowMinutes: 24 * 60,
resetsAt: nil,
resetDescription: nil))
store._setSnapshotForTesting(
antigravity.with(extraRateWindows: (antigravity.extraRateWindows ?? []) + [unknownCadence]),
provider: .antigravity)
var highest = store.providerWithHighestUsage()
#expect(highest?.provider == .antigravity)
#expect(highest?.usedPercent == 95)
store._setSnapshotForTesting(
self.antigravityQuotaSummarySnapshot(
geminiSessionUsed: 95,
geminiWeeklyUsed: 20,
otherSessionUsed: 10,
otherWeeklyUsed: 10),
provider: .antigravity)
highest = store.providerWithHighestUsage()
#expect(highest?.provider == .antigravity)
#expect(highest?.usedPercent == 95)
store._setSnapshotForTesting(
self.antigravityQuotaSummarySnapshot(
geminiSessionUsed: 100,
geminiWeeklyUsed: 100,
otherSessionUsed: 50,
otherWeeklyUsed: 50),
provider: .antigravity)
highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
}
@Test
func `automatic metric skips exhausted antigravity quota summary lanes when another remains usable`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-antigravity-summary-usable"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .antigravity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let antigravityMeta = registry.metadata[.antigravity] {
settings.setProviderEnabled(provider: .antigravity, metadata: antigravityMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 80, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let antigravitySnapshot = self.antigravityQuotaSummarySnapshot(
geminiSessionUsed: 100,
geminiWeeklyUsed: 40,
otherSessionUsed: 100,
otherWeeklyUsed: 100)
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(antigravitySnapshot, provider: .antigravity)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
#expect(highest?.usedPercent == 80)
}
@Test
func `automatic metric ignores antigravity legacy detail rows`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-antigravity-fallback-detail"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .antigravity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let antigravityMeta = registry.metadata[.antigravity] {
settings.setProviderEnabled(provider: .antigravity, metadata: antigravityMeta, enabled: true)
}
let store = UsageStore(
fetcher: UsageFetcher(),
browserDetection: BrowserDetection(cacheTTL: 0),
settings: settings)
store._setSnapshotForTesting(
UsageSnapshot(
primary: RateWindow(usedPercent: 80, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date()),
provider: .codex)
store._setSnapshotForTesting(
UsageSnapshot(
primary: nil,
secondary: nil,
tertiary: nil,
extraRateWindows: [
NamedRateWindow(
id: "antigravity-compact-fallback-model-a",
title: "Model A",
window: RateWindow(
usedPercent: 100,
windowMinutes: nil,
resetsAt: nil,
resetDescription: nil)),
NamedRateWindow(
id: "model-b",
title: "Model B",
window: RateWindow(
usedPercent: 50,
windowMinutes: nil,
resetsAt: nil,
resetDescription: nil)),
],
updatedAt: Date()),
provider: .antigravity)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
#expect(highest?.usedPercent == 80)
}
@Test
func `automatic metric skips antigravity with no quota lanes`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-antigravity-empty"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .antigravity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let antigravityMeta = registry.metadata[.antigravity] {
settings.setProviderEnabled(provider: .antigravity, metadata: antigravityMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 80, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let antigravitySnapshot = UsageSnapshot(
primary: nil,
secondary: nil,
tertiary: nil,
updatedAt: Date(),
identity: ProviderIdentitySnapshot(
providerID: .antigravity,
accountEmail: "user@example.com",
accountOrganization: nil,
loginMethod: "Pro"))
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(antigravitySnapshot, provider: .antigravity)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
#expect(highest?.usedPercent == 80)
}
@Test
func `automatic metric uses zai 5-hour token lane when ranking highest usage`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-zai-automatic-tertiary"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .zai)
settings.addTokenAccount(provider: .zai, label: "Primary", token: "zai-token")
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let zaiMeta = registry.metadata[.zai] {
settings.setProviderEnabled(provider: .zai, metadata: zaiMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 70, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let zaiSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 15, windowMinutes: 10080, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 10, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
tertiary: RateWindow(usedPercent: 90, windowMinutes: 300, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(zaiSnapshot, provider: .zai)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .zai)
#expect(highest?.usedPercent == 90)
}
@Test
func `automatic metric keeps copilot most constrained ranking`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-copilot-automatic"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .copilot)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let copilotMeta = registry.metadata[.copilot] {
settings.setProviderEnabled(provider: .copilot, metadata: copilotMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 70, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let copilotSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 20, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 80, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(copilotSnapshot, provider: .copilot)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .copilot)
#expect(highest?.usedPercent == 80)
}
@Test
func `automatic metric does not exclude partially available copilot at hundred percent`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-copilot-partial-100"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .copilot)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let copilotMeta = registry.metadata[.copilot] {
settings.setProviderEnabled(provider: .copilot, metadata: copilotMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 90, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let copilotSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 20, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(copilotSnapshot, provider: .copilot)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .copilot)
#expect(highest?.usedPercent == 100)
}
@Test
func `automatic metric excludes copilot when both lanes are exhausted`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-copilot-both-100"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .copilot)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let copilotMeta = registry.metadata[.copilot] {
settings.setProviderEnabled(provider: .copilot, metadata: copilotMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 80, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let copilotSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(copilotSnapshot, provider: .copilot)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
#expect(highest?.usedPercent == 80)
}
@Test
func `automatic metric uses tertiary when it is most constrained for cursor`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-cursor-tertiary"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .cursor)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let cursorMeta = registry.metadata[.cursor] {
settings.setProviderEnabled(provider: .cursor, metadata: cursorMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 50, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let cursorSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 10, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 20, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
tertiary: RateWindow(usedPercent: 95, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(cursorSnapshot, provider: .cursor)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .cursor)
#expect(highest?.usedPercent == 95)
}
@Test
func `automatic metric keeps perplexity in highest usage when purchased credits remain`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-perplexity-purchased"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .perplexity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let perplexityMeta = registry.metadata[.perplexity] {
settings.setProviderEnabled(provider: .perplexity, metadata: perplexityMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 15, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let perplexitySnapshot = UsageSnapshot(
primary: nil,
secondary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
tertiary: RateWindow(usedPercent: 45, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(perplexitySnapshot, provider: .perplexity)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .perplexity)
#expect(highest?.usedPercent == 45)
}
@Test
func `automatic metric ignores exhausted recurring perplexity lane when fallback remains`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-perplexity-recurring-exhausted"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .perplexity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let perplexityMeta = registry.metadata[.perplexity] {
settings.setProviderEnabled(provider: .perplexity, metadata: perplexityMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 25, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let perplexitySnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
tertiary: RateWindow(usedPercent: 40, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(perplexitySnapshot, provider: .perplexity)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .perplexity)
#expect(highest?.usedPercent == 40)
}
@Test
func `automatic metric prefers purchased perplexity credits before bonus in highest usage`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-perplexity-purchased-before-bonus"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .perplexity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let perplexityMeta = registry.metadata[.perplexity] {
settings.setProviderEnabled(provider: .perplexity, metadata: perplexityMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 30, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let perplexitySnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 20, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
tertiary: RateWindow(usedPercent: 45, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(perplexitySnapshot, provider: .perplexity)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .perplexity)
#expect(highest?.usedPercent == 45)
}
@Test
func `primary metric keeps exhausted recurring perplexity lane in highest usage selection`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-perplexity-primary-exhausted"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.primary, for: .perplexity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let perplexityMeta = registry.metadata[.perplexity] {
settings.setProviderEnabled(provider: .perplexity, metadata: perplexityMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 25, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let perplexitySnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
tertiary: RateWindow(usedPercent: 40, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(perplexitySnapshot, provider: .perplexity)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
#expect(highest?.usedPercent == 25)
}
@Test
func `automatic metric excludes cursor when all opus lanes are exhausted`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-cursor-all-100"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.automatic, for: .cursor)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let cursorMeta = registry.metadata[.cursor] {
settings.setProviderEnabled(provider: .cursor, metadata: cursorMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 80, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let cursorSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
tertiary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(cursorSnapshot, provider: .cursor)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
#expect(highest?.usedPercent == 80)
}
@Test
func `cursor highest usage keeps provider when saved tertiary falls back to automatic`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-cursor-missing-tertiary"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.tertiary, for: .cursor)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let cursorMeta = registry.metadata[.cursor] {
settings.setProviderEnabled(provider: .cursor, metadata: cursorMeta, enabled: true)
}
let fetcher = UsageFetcher()
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
let codexSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 40, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date())
let cursorSnapshot = UsageSnapshot(
primary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 60, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
tertiary: nil,
updatedAt: Date())
store._setSnapshotForTesting(codexSnapshot, provider: .codex)
store._setSnapshotForTesting(cursorSnapshot, provider: .cursor)
let highest = store.providerWithHighestUsage()
#expect(highest?.provider == .cursor)
#expect(highest?.usedPercent == 100)
}
private func antigravityQuotaSummarySnapshot(
geminiSessionUsed: Double,
geminiWeeklyUsed: Double,
otherSessionUsed: Double,
otherWeeklyUsed: Double) -> UsageSnapshot
{
UsageSnapshot(
primary: nil,
secondary: nil,
tertiary: nil,
extraRateWindows: [
NamedRateWindow(
id: "antigravity-quota-summary-gemini-5h",
title: "Gemini Session",
window: RateWindow(
usedPercent: geminiSessionUsed,
windowMinutes: 5 * 60,
resetsAt: nil,
resetDescription: nil)),
NamedRateWindow(
id: "antigravity-quota-summary-gemini-weekly",
title: "Gemini Weekly",
window: RateWindow(
usedPercent: geminiWeeklyUsed,
windowMinutes: 7 * 24 * 60,
resetsAt: nil,
resetDescription: nil)),
NamedRateWindow(
id: "antigravity-quota-summary-3p-5h",
title: "Claude + GPT Session",
window: RateWindow(
usedPercent: otherSessionUsed,
windowMinutes: 5 * 60,
resetsAt: nil,
resetDescription: nil)),
NamedRateWindow(
id: "antigravity-quota-summary-3p-weekly",
title: "Claude + GPT Weekly",
window: RateWindow(
usedPercent: otherWeeklyUsed,
windowMinutes: 7 * 24 * 60,
resetsAt: nil,
resetDescription: nil)),
],
updatedAt: Date())
}
}
extension UsageStoreHighestUsageTests {
@Test
func `explicit antigravity metric remains authoritative for highest usage`() {
let settings = SettingsStore(
configStore: testConfigStore(suiteName: "UsageStoreHighestUsageTests-antigravity-explicit"),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.refreshFrequency = .manual
settings.statusChecksEnabled = false
settings.setMenuBarMetricPreference(.secondary, for: .antigravity)
let registry = ProviderRegistry.shared
if let codexMeta = registry.metadata[.codex] {
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
}
if let antigravityMeta = registry.metadata[.antigravity] {
settings.setProviderEnabled(provider: .antigravity, metadata: antigravityMeta, enabled: true)
}
let store = UsageStore(
fetcher: UsageFetcher(),
browserDetection: BrowserDetection(cacheTTL: 0),
settings: settings)
store._setSnapshotForTesting(
UsageSnapshot(
primary: RateWindow(usedPercent: 80, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: nil,
updatedAt: Date()),
provider: .codex)
let antigravity = self.antigravityQuotaSummarySnapshot(
geminiSessionUsed: 10,
geminiWeeklyUsed: 20,
otherSessionUsed: 95,
otherWeeklyUsed: 90)
.with(
primary: RateWindow(usedPercent: 10, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
secondary: RateWindow(usedPercent: 95, windowMinutes: nil, resetsAt: nil, resetDescription: nil))
store._setSnapshotForTesting(antigravity, provider: .antigravity)
var highest = store.providerWithHighestUsage()
#expect(highest?.provider == .antigravity)
#expect(highest?.usedPercent == 95)
store._setSnapshotForTesting(
antigravity.with(
primary: antigravity.primary,
secondary: RateWindow(usedPercent: 100, windowMinutes: nil, resetsAt: nil, resetDescription: nil)),
provider: .antigravity)
highest = store.providerWithHighestUsage()
#expect(highest?.provider == .codex)
}
}