272 lines
9.9 KiB
Swift
272 lines
9.9 KiB
Swift
import CodexBarCore
|
|
import Foundation
|
|
import Testing
|
|
@testable import CodexBar
|
|
|
|
struct InlineCostHistoryDashboardLabelTests {
|
|
@Test
|
|
func `local cost history Today KPI uses current day session value`() throws {
|
|
let now = Date(timeIntervalSince1970: 1_700_179_200)
|
|
let metadata = try #require(ProviderDefaults.metadata[.claude])
|
|
let tokenSnapshot = CostUsageTokenSnapshot(
|
|
sessionTokens: 0,
|
|
sessionCostUSD: 0,
|
|
last30DaysTokens: 275,
|
|
last30DaysCostUSD: 0.25,
|
|
daily: [
|
|
CostUsageDailyReport.Entry(
|
|
date: "2023-11-15",
|
|
inputTokens: 200,
|
|
outputTokens: 75,
|
|
totalTokens: 275,
|
|
costUSD: 0.25,
|
|
modelsUsed: nil,
|
|
modelBreakdowns: nil),
|
|
],
|
|
updatedAt: now)
|
|
|
|
let model = UsageMenuCardView.Model.make(.init(
|
|
provider: .claude,
|
|
metadata: metadata,
|
|
snapshot: UsageSnapshot(
|
|
primary: nil,
|
|
secondary: nil,
|
|
updatedAt: now),
|
|
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.inlineUsageDashboard?.kpis.first?.title == "Today")
|
|
#expect(model.inlineUsageDashboard?.kpis.first?.value == "$0.00")
|
|
#expect(model.inlineUsageDashboard?.points.first?.accessibilityValue == "2023-11-15: $0.25")
|
|
}
|
|
|
|
@Test
|
|
func `local cost history KPI titles preserve one day and dynamic windows`() throws {
|
|
let now = Date(timeIntervalSince1970: 1_700_179_200)
|
|
let metadata = try #require(ProviderDefaults.metadata[.claude])
|
|
let daily = [
|
|
CostUsageDailyReport.Entry(
|
|
date: "2023-11-14",
|
|
inputTokens: 100,
|
|
outputTokens: 50,
|
|
totalTokens: 150,
|
|
costUSD: 0.12,
|
|
modelsUsed: ["claude-sonnet-4"],
|
|
modelBreakdowns: nil),
|
|
CostUsageDailyReport.Entry(
|
|
date: "2023-11-15",
|
|
inputTokens: 200,
|
|
outputTokens: 75,
|
|
totalTokens: 275,
|
|
costUSD: 0.25,
|
|
modelsUsed: ["claude-opus-4"],
|
|
modelBreakdowns: nil),
|
|
]
|
|
|
|
func makeModel(historyDays: Int) -> UsageMenuCardView.Model {
|
|
let tokenSnapshot = CostUsageTokenSnapshot(
|
|
sessionTokens: 275,
|
|
sessionCostUSD: 0.25,
|
|
last30DaysTokens: 425,
|
|
last30DaysCostUSD: 0.37,
|
|
historyDays: historyDays,
|
|
daily: daily,
|
|
updatedAt: now)
|
|
return UsageMenuCardView.Model.make(.init(
|
|
provider: .claude,
|
|
metadata: metadata,
|
|
snapshot: UsageSnapshot(
|
|
primary: RateWindow(usedPercent: 10, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
|
|
secondary: nil,
|
|
updatedAt: now),
|
|
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))
|
|
}
|
|
|
|
let oneDay = makeModel(historyDays: 1)
|
|
#expect(oneDay.inlineUsageDashboard?.kpis[1].title == "Today")
|
|
#expect(oneDay.inlineUsageDashboard?.kpis[2].title == "Today tokens")
|
|
|
|
let sevenDays = makeModel(historyDays: 7)
|
|
#expect(sevenDays.inlineUsageDashboard?.kpis[1].title == "Last 7 days Cost")
|
|
#expect(sevenDays.inlineUsageDashboard?.kpis[2].title == "Last 7 days tokens")
|
|
|
|
let thirtyDays = makeModel(historyDays: 30)
|
|
#expect(thirtyDays.inlineUsageDashboard?.kpis[1].title == "30d cost")
|
|
#expect(thirtyDays.inlineUsageDashboard?.kpis[2].title == "30d tokens")
|
|
}
|
|
|
|
@Test
|
|
func `custom cost history KPI title keeps token label distinct`() throws {
|
|
let now = Date(timeIntervalSince1970: 1_700_179_200)
|
|
let metadata = try #require(ProviderDefaults.metadata[.claude])
|
|
let tokenSnapshot = CostUsageTokenSnapshot(
|
|
sessionTokens: 275,
|
|
sessionCostUSD: 0.25,
|
|
last30DaysTokens: 425,
|
|
last30DaysCostUSD: 0.37,
|
|
historyLabel: "This month",
|
|
daily: [
|
|
CostUsageDailyReport.Entry(
|
|
date: "2023-11-15",
|
|
inputTokens: 200,
|
|
outputTokens: 75,
|
|
totalTokens: 275,
|
|
costUSD: 0.25,
|
|
modelsUsed: nil,
|
|
modelBreakdowns: nil),
|
|
],
|
|
updatedAt: now)
|
|
|
|
let model = UsageMenuCardView.Model.make(.init(
|
|
provider: .claude,
|
|
metadata: metadata,
|
|
snapshot: UsageSnapshot(
|
|
primary: nil,
|
|
secondary: nil,
|
|
updatedAt: now),
|
|
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.inlineUsageDashboard?.kpis[1].title == "This month")
|
|
#expect(model.inlineUsageDashboard?.kpis[2].title == "This month tokens")
|
|
}
|
|
|
|
@Test
|
|
func `costHistoryInlineDashboard sets currencyCode from snapshot`() throws {
|
|
let now = Date(timeIntervalSince1970: 1_700_179_200)
|
|
let metadata = try #require(ProviderDefaults.metadata[.claude])
|
|
let tokenSnapshot = CostUsageTokenSnapshot(
|
|
sessionTokens: 275,
|
|
sessionCostUSD: 0.25,
|
|
last30DaysTokens: 425,
|
|
last30DaysCostUSD: 0.37,
|
|
currencyCode: "USD",
|
|
daily: [
|
|
CostUsageDailyReport.Entry(
|
|
date: "2023-11-15",
|
|
inputTokens: 200,
|
|
outputTokens: 75,
|
|
totalTokens: 275,
|
|
costUSD: 0.25,
|
|
modelsUsed: nil,
|
|
modelBreakdowns: nil),
|
|
],
|
|
updatedAt: now)
|
|
|
|
let model = UsageMenuCardView.Model.make(.init(
|
|
provider: .claude,
|
|
metadata: metadata,
|
|
snapshot: UsageSnapshot(
|
|
primary: nil,
|
|
secondary: nil,
|
|
updatedAt: now),
|
|
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))
|
|
|
|
let dashboard = try #require(model.inlineUsageDashboard)
|
|
#expect(dashboard.currencyCode == "USD")
|
|
}
|
|
|
|
@Test
|
|
func `token-only inline dashboard leaves currencyCode nil`() throws {
|
|
let now = Date(timeIntervalSince1970: 1_700_179_200)
|
|
let metadata = try #require(ProviderDefaults.metadata[.zai])
|
|
let modelUsage = ZaiModelUsageData(
|
|
xTime: ["2023-11-17 00:00"],
|
|
modelDataList: [
|
|
ZaiModelDataItem(modelName: "glm-test", tokensUsage: [123]),
|
|
])
|
|
let snapshot = UsageSnapshot(
|
|
primary: nil,
|
|
secondary: nil,
|
|
tertiary: nil,
|
|
zaiUsage: ZaiUsageSnapshot(
|
|
tokenLimit: nil,
|
|
timeLimit: nil,
|
|
planName: nil,
|
|
modelUsage: modelUsage,
|
|
updatedAt: now),
|
|
updatedAt: now,
|
|
identity: ProviderIdentitySnapshot(
|
|
providerID: .zai,
|
|
accountEmail: nil,
|
|
accountOrganization: nil,
|
|
loginMethod: nil))
|
|
|
|
let model = UsageMenuCardView.Model.make(.init(
|
|
provider: .zai,
|
|
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: true,
|
|
showOptionalCreditsAndExtraUsage: true,
|
|
hidePersonalInfo: false,
|
|
now: now))
|
|
let dashboard = try #require(model.inlineUsageDashboard)
|
|
#expect(dashboard.currencyCode == nil)
|
|
}
|
|
}
|