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

168 lines
6.2 KiB
Swift

import CodexBarCore
import Foundation
import Testing
@testable import CodexBar
@MainActor
struct MenuDescriptorKiloTests {
@Test
func `kilo credits detail does not render as reset line`() throws {
let suite = "MenuDescriptorKiloTests-kilo-detail"
let defaults = try #require(UserDefaults(suiteName: suite))
defaults.removePersistentDomain(forName: suite)
let settings = SettingsStore(
userDefaults: defaults,
configStore: testConfigStore(suiteName: suite),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.statusChecksEnabled = false
settings.usageBarsShowUsed = false
let store = UsageStore(
fetcher: UsageFetcher(environment: [:]),
browserDetection: BrowserDetection(cacheTTL: 0),
settings: settings)
let snapshot = UsageSnapshot(
primary: RateWindow(
usedPercent: 10,
windowMinutes: nil,
resetsAt: nil,
resetDescription: "10/100 credits"),
secondary: nil,
tertiary: nil,
updatedAt: Date(),
identity: ProviderIdentitySnapshot(
providerID: .kilo,
accountEmail: nil,
accountOrganization: nil,
loginMethod: "Kilo Pass Pro"))
store._setSnapshotForTesting(snapshot, provider: .kilo)
let descriptor = MenuDescriptor.build(
provider: .kilo,
store: store,
settings: settings,
account: AccountInfo(email: nil, plan: nil),
updateReady: false,
includeContextualActions: false)
let usageEntries = try #require(descriptor.sections.first?.entries)
let textLines = usageEntries.compactMap { entry -> String? in
guard case let .text(text, _) = entry else { return nil }
return text
}
#expect(textLines.contains("10/100 credits"))
#expect(!textLines.contains(where: { $0.contains("Resets 10/100 credits") }))
}
@Test
func `kilo pass detail keeps reset line when reset date exists`() throws {
let suite = "MenuDescriptorKiloTests-kilo-pass-reset"
let defaults = try #require(UserDefaults(suiteName: suite))
defaults.removePersistentDomain(forName: suite)
let settings = SettingsStore(
userDefaults: defaults,
configStore: testConfigStore(suiteName: suite),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.statusChecksEnabled = false
settings.usageBarsShowUsed = false
let store = UsageStore(
fetcher: UsageFetcher(environment: [:]),
browserDetection: BrowserDetection(cacheTTL: 0),
settings: settings)
let snapshot = UsageSnapshot(
primary: RateWindow(
usedPercent: 0,
windowMinutes: nil,
resetsAt: nil,
resetDescription: "0/19 credits"),
secondary: RateWindow(
usedPercent: 0,
windowMinutes: nil,
resetsAt: Date().addingTimeInterval(2 * 24 * 60 * 60),
resetDescription: "$0.00 / $19.00 (+ $9.50 bonus)"),
tertiary: nil,
updatedAt: Date(),
identity: ProviderIdentitySnapshot(
providerID: .kilo,
accountEmail: nil,
accountOrganization: nil,
loginMethod: "Starter"))
store._setSnapshotForTesting(snapshot, provider: .kilo)
let descriptor = MenuDescriptor.build(
provider: .kilo,
store: store,
settings: settings,
account: AccountInfo(email: nil, plan: nil),
updateReady: false,
includeContextualActions: false)
let usageEntries = try #require(descriptor.sections.first?.entries)
let textLines = usageEntries.compactMap { entry -> String? in
guard case let .text(text, _) = entry else { return nil }
return text
}
#expect(textLines.contains(where: { $0.contains("Resets") }))
#expect(textLines.contains("$0.00 / $19.00 (+ $9.50 bonus)"))
}
@Test
func `kilo auto top up only renders activity without plan label`() throws {
let suite = "MenuDescriptorKiloTests-kilo-activity-only"
let defaults = try #require(UserDefaults(suiteName: suite))
defaults.removePersistentDomain(forName: suite)
let settings = SettingsStore(
userDefaults: defaults,
configStore: testConfigStore(suiteName: suite),
zaiTokenStore: NoopZaiTokenStore(),
syntheticTokenStore: NoopSyntheticTokenStore())
settings.statusChecksEnabled = false
let store = UsageStore(
fetcher: UsageFetcher(environment: [:]),
browserDetection: BrowserDetection(cacheTTL: 0),
settings: settings)
let snapshot = UsageSnapshot(
primary: RateWindow(
usedPercent: 0,
windowMinutes: nil,
resetsAt: nil,
resetDescription: "0/0 credits"),
secondary: nil,
tertiary: nil,
updatedAt: Date(),
identity: ProviderIdentitySnapshot(
providerID: .kilo,
accountEmail: nil,
accountOrganization: nil,
loginMethod: "Auto top-up: off"))
store._setSnapshotForTesting(snapshot, provider: .kilo)
let descriptor = MenuDescriptor.build(
provider: .kilo,
store: store,
settings: settings,
account: AccountInfo(email: nil, plan: nil),
updateReady: false,
includeContextualActions: false)
let textLines = descriptor.sections
.flatMap(\.entries)
.compactMap { entry -> String? in
guard case let .text(text, _) = entry else { return nil }
return text
}
#expect(textLines.contains("Activity: Auto top-up: off"))
#expect(!textLines.contains("Plan: Auto top-up: off"))
}
}