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

174 lines
6.8 KiB
Swift

import CodexBarCore
import Foundation
import Testing
@testable import CodexBar
struct OpenAIAPIMenuCardModelTests {
@Test
func `admin usage model shows summaries and spend without fake quota bars`() throws {
let now = try Self.localNoon(year: 2023, month: 11, day: 17)
let bucketDay = try Self.localNoon(year: 2023, month: 11, day: 14)
let metadata = try #require(ProviderDefaults.metadata[.openai])
let apiUsage = OpenAIAPIUsageSnapshot(
daily: [
OpenAIAPIUsageSnapshot.DailyBucket(
day: "2023-11-14",
startTime: bucketDay,
endTime: bucketDay.addingTimeInterval(86400),
costUSD: 12.5,
requests: 40,
inputTokens: 1000,
cachedInputTokens: 250,
outputTokens: 500,
totalTokens: 1500,
lineItems: [
OpenAIAPIUsageSnapshot.LineItemBreakdown(name: "Text tokens", costUSD: 12.5),
],
models: [
OpenAIAPIUsageSnapshot.ModelBreakdown(
name: "gpt-5.2",
requests: 40,
inputTokens: 1000,
cachedInputTokens: 250,
outputTokens: 500,
totalTokens: 1500),
]),
],
updatedAt: now)
let model = UsageMenuCardView.Model.make(.init(
provider: .openai,
metadata: metadata,
snapshot: apiUsage.toUsageSnapshot(),
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,
tokenCostInlineDashboardEnabled: true,
showOptionalCreditsAndExtraUsage: true,
hidePersonalInfo: false,
now: now))
#expect(model.metrics.isEmpty)
#expect(model.openAIAPIUsage != nil)
#expect(model.inlineUsageDashboard?.kpis.first?.value == "$0.00")
#expect(model.inlineUsageDashboard?.kpis.last?.title == "Requests")
#expect(model.inlineUsageDashboard?.kpis.last?.value == "40")
#expect(model.inlineUsageDashboard?.points.count == 1)
#expect(model.inlineUsageDashboard?.detailLines.contains("30d requests: 40 requests") == true)
#expect(model.providerCost == nil)
#expect(model.usageNotes.contains { $0.contains("Today: $0.00") })
#expect(model.usageNotes.contains("Top model: gpt-5.2"))
#expect(model.creditsText == nil)
#expect(model.planText == "Admin API")
}
@Test
func `admin usage dashboard ignores stale token snapshot after fallback refresh`() throws {
let now = Date(timeIntervalSince1970: 1_700_179_200)
let metadata = try #require(ProviderDefaults.metadata[.openai])
let staleTokenSnapshot = CostUsageTokenSnapshot(
sessionTokens: 1500,
sessionCostUSD: 12.5,
last30DaysTokens: 1500,
last30DaysCostUSD: 12.5,
daily: [
CostUsageDailyReport.Entry(
date: "2023-11-14",
inputTokens: 1000,
outputTokens: 500,
totalTokens: 1500,
costUSD: 12.5,
modelsUsed: nil,
modelBreakdowns: nil),
],
updatedAt: now)
let model = UsageMenuCardView.Model.make(.init(
provider: .openai,
metadata: metadata,
snapshot: UsageSnapshot(
primary: nil,
secondary: nil,
updatedAt: now),
credits: nil,
creditsError: nil,
dashboard: nil,
dashboardError: nil,
tokenSnapshot: staleTokenSnapshot,
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 == nil)
#expect(model.tokenUsage == nil)
}
@Test
func `admin usage model can show cost card summary`() throws {
let now = try Self.localNoon(year: 2023, month: 11, day: 17)
let bucketDay = try Self.localNoon(year: 2023, month: 11, day: 14)
let metadata = try #require(ProviderDefaults.metadata[.openai])
let apiUsage = OpenAIAPIUsageSnapshot(
daily: [
OpenAIAPIUsageSnapshot.DailyBucket(
day: "2023-11-14",
startTime: bucketDay,
endTime: bucketDay.addingTimeInterval(86400),
costUSD: 12.5,
requests: 40,
inputTokens: 1000,
cachedInputTokens: 250,
outputTokens: 500,
totalTokens: 1500,
lineItems: [],
models: []),
],
updatedAt: now)
let model = UsageMenuCardView.Model.make(.init(
provider: .openai,
metadata: metadata,
snapshot: apiUsage.toUsageSnapshot(),
credits: nil,
creditsError: nil,
dashboard: nil,
dashboardError: nil,
tokenSnapshot: apiUsage.toCostUsageTokenSnapshot(),
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(ProviderDescriptorRegistry.descriptor(for: .openai).tokenCost.supportsTokenCost)
#expect(model.tokenUsage?.sessionLine == "Today: $0.00 · 0 tokens")
#expect(model.tokenUsage?.monthLine == "Last 30 days: $12.50 · 1.5K tokens")
#expect(model.tokenUsage?.hintLine == "Reported by OpenAI Admin API organization usage.")
}
private static func localNoon(year: Int, month: Int, day: Int) throws -> Date {
try #require(Calendar.current.date(from: DateComponents(year: year, month: month, day: day, hour: 12)))
}
}