168 lines
6.2 KiB
Swift
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"))
|
|
}
|
|
}
|