import CodexBarCoreimport Foundationimport Testing@testable import CodexBarCLI struct CLISnapshotTests { @Test func `renders Factory token rate billing with time window labels`() { let snap = UsageSnapshot( primary: .init(usedPercent: 12, windowMinutes: 300, resetsAt: nil, resetDescription: nil), secondary: .init(usedPercent: 25, windowMinutes: 10080, resetsAt: nil, resetDescription: nil), tertiary: .init(usedPercent: 50, windowMinutes: 43200, resetsAt: nil, resetDescription: nil), updatedAt: Date(timeIntervalSince1970: 0)) let output = CLIRenderer.renderText( provider: .factory, snapshot: snap, credits: nil, context: RenderContext( header: "Droid (factory)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("5-hour: 88% left")) #expect(output.contains("Weekly: 75% left")) #expect(output.contains("Monthly: 50% left")) #expect(!output.contains("Standard:")) #expect(!output.contains("Premium:")) } @Test func `renders Factory legacy billing with pool labels`() { let snap = UsageSnapshot( primary: .init(usedPercent: 12, windowMinutes: nil, resetsAt: nil, resetDescription: nil), secondary: .init(usedPercent: 25, windowMinutes: nil, resetsAt: nil, resetDescription: nil), tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0)) let output = CLIRenderer.renderText( provider: .factory, snapshot: snap, credits: nil, context: RenderContext( header: "Droid (factory)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Standard: 88% left")) #expect(output.contains("Premium: 75% left")) #expect(!output.contains("5-hour:")) #expect(!output.contains("Monthly:")) } @Test func `renders text snapshot for codex`() { let identity = ProviderIdentitySnapshot( providerID: .codex, accountEmail: "user@example.com", accountOrganization: nil, loginMethod: "pro") let snap = UsageSnapshot( primary: .init(usedPercent: 12, windowMinutes: 300, resetsAt: nil, resetDescription: "today at 3:00 PM"), secondary: .init(usedPercent: 25, windowMinutes: 10080, resetsAt: nil, resetDescription: "Fri at 9:00 AM"), tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0), identity: identity) let output = CLIRenderer.renderText( provider: .codex, snapshot: snap, credits: CreditsSnapshot(remaining: 42, events: [], updatedAt: Date()), context: RenderContext( header: "Codex 1.2.3 (codex-cli)", status: ProviderStatusPayload( indicator: .minor, description: "Degraded performance", updatedAt: Date(timeIntervalSince1970: 0), url: "https://status.example.com"), useColor: false, resetStyle: .absolute)) #expect(output.contains("Codex 1.2.3 (codex-cli)")) #expect(output.contains("Status: Partial outage – Degraded performance")) #expect(output.contains("Codex")) #expect(output.contains("Session: 88% left")) #expect(output.contains("Weekly: 75% left")) #expect(output.contains("Credits: 42")) #expect(output.contains("Account: user@example.com")) #expect(output.contains("Plan: Pro 20x")) } @Test func `renders Codex limit reset credits`() { let expiresAt = Date().addingTimeInterval(7200) let resetCredits = CodexRateLimitResetCreditsSnapshot( credits: [ CodexRateLimitResetCredit( id: "credit-1", resetType: "codex_rate_limits", status: .available, grantedAt: Date(timeIntervalSince1970: 0), expiresAt: expiresAt, redeemStartedAt: nil, redeemedAt: nil, title: nil, description: nil), ], availableCount: 1, updatedAt: Date(timeIntervalSince1970: 0)) let snapshot = UsageSnapshot( primary: .init(usedPercent: 10, windowMinutes: 300, resetsAt: nil, resetDescription: nil), secondary: nil, tertiary: nil, codexResetCredits: resetCredits, updatedAt: Date(timeIntervalSince1970: 0)) let output = CLIRenderer.renderText( provider: .codex, snapshot: snapshot, credits: nil, context: RenderContext( header: "Codex (oauth)", status: nil, useColor: false, resetStyle: .countdown)) #expect(output.contains("Limit Reset Credits: 1 available")) #expect(output.contains("Next reset credit expires")) } @Test func `renders Codex prolite plan with multiplier display name`() { let identity = ProviderIdentitySnapshot( providerID: .codex, accountEmail: "user@example.com", accountOrganization: nil, loginMethod: "prolite") let snap = UsageSnapshot( primary: .init(usedPercent: 12, windowMinutes: 300, resetsAt: nil, resetDescription: "today at 3:00 PM"), secondary: nil, tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0), identity: identity) let output = CLIRenderer.renderText( provider: .codex, snapshot: snap, credits: nil, context: RenderContext( header: "Codex 1.2.3 (codex-cli)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Plan: Pro 5x")) #expect(!output.contains("Plan: Pro Lite")) #expect(!output.contains("Plan: Prolite")) } @Test func `renders Codex plan only limits as unavailable`() { let identity = ProviderIdentitySnapshot( providerID: .codex, accountEmail: "user@example.com", accountOrganization: nil, loginMethod: "pro") let snap = UsageSnapshot( primary: nil, secondary: nil, tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0), identity: identity) let output = CLIRenderer.renderText( provider: .codex, snapshot: snap, credits: nil, context: RenderContext( header: "Codex 1.2.3 (codex-cli)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Limits: not available")) #expect(output.contains("Account: user@example.com")) #expect(output.contains("Plan: Pro 20x")) #expect(!output.contains("Session:")) #expect(!output.contains("Weekly:")) } @Test func `renders text snapshot for claude without weekly`() { let snap = UsageSnapshot( primary: .init(usedPercent: 2, windowMinutes: nil, resetsAt: nil, resetDescription: "3pm (Europe/Vienna)"), secondary: nil, tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0)) let output = CLIRenderer.renderText( provider: .claude, snapshot: snap, credits: nil, context: RenderContext( header: "Claude Code 2.0.69 (claude)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Session: 98% left")) #expect(!output.contains("Weekly:")) } @Test func `renders warp unlimited as detail not reset`() { let meta = ProviderDescriptorRegistry.descriptor(for: .warp).metadata let snap = UsageSnapshot( primary: .init(usedPercent: 0, windowMinutes: nil, resetsAt: nil, resetDescription: "Unlimited"), secondary: nil, tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0), identity: ProviderIdentitySnapshot( providerID: .warp, accountEmail: nil, accountOrganization: nil, loginMethod: nil)) let output = CLIRenderer.renderText( provider: .warp, snapshot: snap, credits: nil, context: RenderContext( header: "Warp 0.0.0 (warp)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("\(meta.sessionLabel): 100% left")) #expect(!output.contains("Resets Unlimited")) #expect(output.contains("Unlimited")) } @Test func `renders warp credits as detail and reset as date`() { let meta = ProviderDescriptorRegistry.descriptor(for: .warp).metadata let now = Date(timeIntervalSince1970: 0) let snap = UsageSnapshot( primary: .init( usedPercent: 10, windowMinutes: nil, resetsAt: now.addingTimeInterval(3600), resetDescription: "10/100 credits"), secondary: nil, tertiary: nil, updatedAt: now, identity: ProviderIdentitySnapshot( providerID: .warp, accountEmail: nil, accountOrganization: nil, loginMethod: nil)) let output = CLIRenderer.renderText( provider: .warp, snapshot: snap, credits: nil, context: RenderContext( header: "Warp 0.0.0 (warp)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("\(meta.sessionLabel): 90% left")) #expect(output.contains("Resets")) #expect(output.contains("10/100 credits")) #expect(!output.contains("Resets 10/100 credits")) } @Test func `renders crof dollar balance as detail not reset`() { let meta = ProviderDescriptorRegistry.descriptor(for: .crof).metadata let snap = CrofUsageSnapshot( credits: 9.9999, requestsPlan: 1000, usableRequests: 998, updatedAt: Date(timeIntervalSince1970: 0)).toUsageSnapshot() let output = CLIRenderer.renderText( provider: .crof, snapshot: snap, credits: nil, context: RenderContext( header: "Crof", status: nil, useColor: false, resetStyle: .countdown)) #expect(output.contains("\(meta.sessionLabel): 99% left")) #expect(output.contains("\(meta.weeklyLabel): 100% left")) #expect(output.contains("$9.99")) #expect(!output.contains("Resets $9.99")) } @Test func `renders kilo plan activity and fallback note`() { let now = Date(timeIntervalSince1970: 0) let identity = ProviderIdentitySnapshot( providerID: .kilo, accountEmail: nil, accountOrganization: nil, loginMethod: "Kilo Pass Pro · Auto top-up: visa") let snap = UsageSnapshot( primary: .init(usedPercent: 40, windowMinutes: nil, resetsAt: nil, resetDescription: "40/100 credits"), secondary: nil, tertiary: nil, updatedAt: now, identity: identity) let output = CLIRenderer.renderText( provider: .kilo, snapshot: snap, credits: nil, context: RenderContext( header: "Kilo (cli)", status: nil, useColor: false, resetStyle: .absolute, notes: ["Using CLI fallback"])) #expect(output.contains("Credits: 60% left")) #expect(output.contains("40/100 credits")) #expect(!output.contains("Resets 40/100 credits")) #expect(output.contains("Plan: Kilo Pass Pro")) #expect(output.contains("Activity: Auto top-up: visa")) #expect(output.contains("Note: Using CLI fallback")) } @Test func `renders kilo zero total edge state as detail`() { let now = Date(timeIntervalSince1970: 0) let snap = KiloUsageSnapshot( creditsUsed: 0, creditsTotal: 0, creditsRemaining: 0, planName: "Kilo Pass Pro", autoTopUpEnabled: true, autoTopUpMethod: "visa", updatedAt: now).toUsageSnapshot() let output = CLIRenderer.renderText( provider: .kilo, snapshot: snap, credits: nil, context: RenderContext( header: "Kilo (api)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Credits: 0% left")) #expect(output.contains("0/0 credits")) #expect(!output.contains("Resets 0/0 credits")) } @Test func `renders kilo auto top up only as activity without plan`() { let now = Date(timeIntervalSince1970: 0) let identity = ProviderIdentitySnapshot( providerID: .kilo, accountEmail: nil, accountOrganization: nil, loginMethod: "Auto top-up: off") let snap = UsageSnapshot( primary: nil, secondary: nil, tertiary: nil, updatedAt: now, identity: identity) let output = CLIRenderer.renderText( provider: .kilo, snapshot: snap, credits: nil, context: RenderContext( header: "Kilo (cli)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Activity: Auto top-up: off")) #expect(!output.contains("Plan: Auto top-up: off")) } @Test func `renders pace line when weekly has reset`() { let now = Date() let snap = UsageSnapshot( primary: nil, secondary: .init( usedPercent: 50, windowMinutes: 10080, resetsAt: now.addingTimeInterval(3 * 24 * 60 * 60), resetDescription: nil), tertiary: nil, updatedAt: now) let output = CLIRenderer.renderText( provider: .codex, snapshot: snap, credits: nil, context: RenderContext( header: "Codex 0.0.0 (codex-cli)", status: nil, useColor: false, resetStyle: .countdown)) #expect(output.contains("Pace:")) } @Test func `renders Ollama weekly pace line when weekly window has reset`() { let now = Date() let snap = UsageSnapshot( primary: .init( usedPercent: 0, windowMinutes: nil, resetsAt: now.addingTimeInterval(4 * 3600), resetDescription: nil), secondary: .init( usedPercent: 23, windowMinutes: 10080, resetsAt: now.addingTimeInterval(5 * 24 * 3600), resetDescription: nil), tertiary: nil, updatedAt: now) let output = CLIRenderer.renderText( provider: .ollama, snapshot: snap, credits: nil, context: RenderContext( header: "Ollama (web)", status: nil, useColor: false, resetStyle: .countdown)) #expect(output.contains("Weekly: 77% left")) #expect(output.contains("Pace: 6% in reserve | Expected 29% used | Lasts until reset")) } @Test func `hides Ollama weekly pace when weekly duration is missing`() { let now = Date() let snap = UsageSnapshot( primary: nil, secondary: .init( usedPercent: 23, windowMinutes: nil, resetsAt: now.addingTimeInterval(5 * 24 * 3600), resetDescription: nil), tertiary: nil, updatedAt: now) let output = CLIRenderer.renderText( provider: .ollama, snapshot: snap, credits: nil, context: RenderContext( header: "Ollama (web)", status: nil, useColor: false, resetStyle: .countdown)) #expect(output.contains("Weekly: 77% left")) #expect(!output.contains("Pace:")) } @Test func `renders JSON payload`() throws { let snap = UsageSnapshot( primary: .init(usedPercent: 50, windowMinutes: 300, resetsAt: nil, resetDescription: nil), secondary: .init(usedPercent: 10, windowMinutes: 10080, resetsAt: nil, resetDescription: nil), tertiary: nil, updatedAt: Date(timeIntervalSince1970: 1_700_000_000)) let payload = ProviderPayload( provider: .codex, account: nil, version: "1.2.3", source: "codex-cli", status: ProviderStatusPayload( indicator: .none, description: nil, updatedAt: Date(timeIntervalSince1970: 1_700_000_010), url: "https://status.example.com"), usage: snap, credits: nil, antigravityPlanInfo: nil, openaiDashboard: nil, error: nil)Lines 1–500 of 682. Load more
import CodexBarCore import Foundation import Testing @testable import CodexBarCLI struct CLISnapshotTests { @Test func `renders Factory token rate billing with time window labels`() { let snap = UsageSnapshot( primary: .init(usedPercent: 12, windowMinutes: 300, resetsAt: nil, resetDescription: nil), secondary: .init(usedPercent: 25, windowMinutes: 10080, resetsAt: nil, resetDescription: nil), tertiary: .init(usedPercent: 50, windowMinutes: 43200, resetsAt: nil, resetDescription: nil), updatedAt: Date(timeIntervalSince1970: 0)) let output = CLIRenderer.renderText( provider: .factory, snapshot: snap, credits: nil, context: RenderContext( header: "Droid (factory)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("5-hour: 88% left")) #expect(output.contains("Weekly: 75% left")) #expect(output.contains("Monthly: 50% left")) #expect(!output.contains("Standard:")) #expect(!output.contains("Premium:")) } @Test func `renders Factory legacy billing with pool labels`() { let snap = UsageSnapshot( primary: .init(usedPercent: 12, windowMinutes: nil, resetsAt: nil, resetDescription: nil), secondary: .init(usedPercent: 25, windowMinutes: nil, resetsAt: nil, resetDescription: nil), tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0)) let output = CLIRenderer.renderText( provider: .factory, snapshot: snap, credits: nil, context: RenderContext( header: "Droid (factory)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Standard: 88% left")) #expect(output.contains("Premium: 75% left")) #expect(!output.contains("5-hour:")) #expect(!output.contains("Monthly:")) } @Test func `renders text snapshot for codex`() { let identity = ProviderIdentitySnapshot( providerID: .codex, accountEmail: "user@example.com", accountOrganization: nil, loginMethod: "pro") let snap = UsageSnapshot( primary: .init(usedPercent: 12, windowMinutes: 300, resetsAt: nil, resetDescription: "today at 3:00 PM"), secondary: .init(usedPercent: 25, windowMinutes: 10080, resetsAt: nil, resetDescription: "Fri at 9:00 AM"), tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0), identity: identity) let output = CLIRenderer.renderText( provider: .codex, snapshot: snap, credits: CreditsSnapshot(remaining: 42, events: [], updatedAt: Date()), context: RenderContext( header: "Codex 1.2.3 (codex-cli)", status: ProviderStatusPayload( indicator: .minor, description: "Degraded performance", updatedAt: Date(timeIntervalSince1970: 0), url: "https://status.example.com"), useColor: false, resetStyle: .absolute)) #expect(output.contains("Codex 1.2.3 (codex-cli)")) #expect(output.contains("Status: Partial outage – Degraded performance")) #expect(output.contains("Codex")) #expect(output.contains("Session: 88% left")) #expect(output.contains("Weekly: 75% left")) #expect(output.contains("Credits: 42")) #expect(output.contains("Account: user@example.com")) #expect(output.contains("Plan: Pro 20x")) } @Test func `renders Codex limit reset credits`() { let expiresAt = Date().addingTimeInterval(7200) let resetCredits = CodexRateLimitResetCreditsSnapshot( credits: [ CodexRateLimitResetCredit( id: "credit-1", resetType: "codex_rate_limits", status: .available, grantedAt: Date(timeIntervalSince1970: 0), expiresAt: expiresAt, redeemStartedAt: nil, redeemedAt: nil, title: nil, description: nil), ], availableCount: 1, updatedAt: Date(timeIntervalSince1970: 0)) let snapshot = UsageSnapshot( primary: .init(usedPercent: 10, windowMinutes: 300, resetsAt: nil, resetDescription: nil), secondary: nil, tertiary: nil, codexResetCredits: resetCredits, updatedAt: Date(timeIntervalSince1970: 0)) let output = CLIRenderer.renderText( provider: .codex, snapshot: snapshot, credits: nil, context: RenderContext( header: "Codex (oauth)", status: nil, useColor: false, resetStyle: .countdown)) #expect(output.contains("Limit Reset Credits: 1 available")) #expect(output.contains("Next reset credit expires")) } @Test func `renders Codex prolite plan with multiplier display name`() { let identity = ProviderIdentitySnapshot( providerID: .codex, accountEmail: "user@example.com", accountOrganization: nil, loginMethod: "prolite") let snap = UsageSnapshot( primary: .init(usedPercent: 12, windowMinutes: 300, resetsAt: nil, resetDescription: "today at 3:00 PM"), secondary: nil, tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0), identity: identity) let output = CLIRenderer.renderText( provider: .codex, snapshot: snap, credits: nil, context: RenderContext( header: "Codex 1.2.3 (codex-cli)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Plan: Pro 5x")) #expect(!output.contains("Plan: Pro Lite")) #expect(!output.contains("Plan: Prolite")) } @Test func `renders Codex plan only limits as unavailable`() { let identity = ProviderIdentitySnapshot( providerID: .codex, accountEmail: "user@example.com", accountOrganization: nil, loginMethod: "pro") let snap = UsageSnapshot( primary: nil, secondary: nil, tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0), identity: identity) let output = CLIRenderer.renderText( provider: .codex, snapshot: snap, credits: nil, context: RenderContext( header: "Codex 1.2.3 (codex-cli)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Limits: not available")) #expect(output.contains("Account: user@example.com")) #expect(output.contains("Plan: Pro 20x")) #expect(!output.contains("Session:")) #expect(!output.contains("Weekly:")) } @Test func `renders text snapshot for claude without weekly`() { let snap = UsageSnapshot( primary: .init(usedPercent: 2, windowMinutes: nil, resetsAt: nil, resetDescription: "3pm (Europe/Vienna)"), secondary: nil, tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0)) let output = CLIRenderer.renderText( provider: .claude, snapshot: snap, credits: nil, context: RenderContext( header: "Claude Code 2.0.69 (claude)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Session: 98% left")) #expect(!output.contains("Weekly:")) } @Test func `renders warp unlimited as detail not reset`() { let meta = ProviderDescriptorRegistry.descriptor(for: .warp).metadata let snap = UsageSnapshot( primary: .init(usedPercent: 0, windowMinutes: nil, resetsAt: nil, resetDescription: "Unlimited"), secondary: nil, tertiary: nil, updatedAt: Date(timeIntervalSince1970: 0), identity: ProviderIdentitySnapshot( providerID: .warp, accountEmail: nil, accountOrganization: nil, loginMethod: nil)) let output = CLIRenderer.renderText( provider: .warp, snapshot: snap, credits: nil, context: RenderContext( header: "Warp 0.0.0 (warp)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("\(meta.sessionLabel): 100% left")) #expect(!output.contains("Resets Unlimited")) #expect(output.contains("Unlimited")) } @Test func `renders warp credits as detail and reset as date`() { let meta = ProviderDescriptorRegistry.descriptor(for: .warp).metadata let now = Date(timeIntervalSince1970: 0) let snap = UsageSnapshot( primary: .init( usedPercent: 10, windowMinutes: nil, resetsAt: now.addingTimeInterval(3600), resetDescription: "10/100 credits"), secondary: nil, tertiary: nil, updatedAt: now, identity: ProviderIdentitySnapshot( providerID: .warp, accountEmail: nil, accountOrganization: nil, loginMethod: nil)) let output = CLIRenderer.renderText( provider: .warp, snapshot: snap, credits: nil, context: RenderContext( header: "Warp 0.0.0 (warp)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("\(meta.sessionLabel): 90% left")) #expect(output.contains("Resets")) #expect(output.contains("10/100 credits")) #expect(!output.contains("Resets 10/100 credits")) } @Test func `renders crof dollar balance as detail not reset`() { let meta = ProviderDescriptorRegistry.descriptor(for: .crof).metadata let snap = CrofUsageSnapshot( credits: 9.9999, requestsPlan: 1000, usableRequests: 998, updatedAt: Date(timeIntervalSince1970: 0)).toUsageSnapshot() let output = CLIRenderer.renderText( provider: .crof, snapshot: snap, credits: nil, context: RenderContext( header: "Crof", status: nil, useColor: false, resetStyle: .countdown)) #expect(output.contains("\(meta.sessionLabel): 99% left")) #expect(output.contains("\(meta.weeklyLabel): 100% left")) #expect(output.contains("$9.99")) #expect(!output.contains("Resets $9.99")) } @Test func `renders kilo plan activity and fallback note`() { let now = Date(timeIntervalSince1970: 0) let identity = ProviderIdentitySnapshot( providerID: .kilo, accountEmail: nil, accountOrganization: nil, loginMethod: "Kilo Pass Pro · Auto top-up: visa") let snap = UsageSnapshot( primary: .init(usedPercent: 40, windowMinutes: nil, resetsAt: nil, resetDescription: "40/100 credits"), secondary: nil, tertiary: nil, updatedAt: now, identity: identity) let output = CLIRenderer.renderText( provider: .kilo, snapshot: snap, credits: nil, context: RenderContext( header: "Kilo (cli)", status: nil, useColor: false, resetStyle: .absolute, notes: ["Using CLI fallback"])) #expect(output.contains("Credits: 60% left")) #expect(output.contains("40/100 credits")) #expect(!output.contains("Resets 40/100 credits")) #expect(output.contains("Plan: Kilo Pass Pro")) #expect(output.contains("Activity: Auto top-up: visa")) #expect(output.contains("Note: Using CLI fallback")) } @Test func `renders kilo zero total edge state as detail`() { let now = Date(timeIntervalSince1970: 0) let snap = KiloUsageSnapshot( creditsUsed: 0, creditsTotal: 0, creditsRemaining: 0, planName: "Kilo Pass Pro", autoTopUpEnabled: true, autoTopUpMethod: "visa", updatedAt: now).toUsageSnapshot() let output = CLIRenderer.renderText( provider: .kilo, snapshot: snap, credits: nil, context: RenderContext( header: "Kilo (api)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Credits: 0% left")) #expect(output.contains("0/0 credits")) #expect(!output.contains("Resets 0/0 credits")) } @Test func `renders kilo auto top up only as activity without plan`() { let now = Date(timeIntervalSince1970: 0) let identity = ProviderIdentitySnapshot( providerID: .kilo, accountEmail: nil, accountOrganization: nil, loginMethod: "Auto top-up: off") let snap = UsageSnapshot( primary: nil, secondary: nil, tertiary: nil, updatedAt: now, identity: identity) let output = CLIRenderer.renderText( provider: .kilo, snapshot: snap, credits: nil, context: RenderContext( header: "Kilo (cli)", status: nil, useColor: false, resetStyle: .absolute)) #expect(output.contains("Activity: Auto top-up: off")) #expect(!output.contains("Plan: Auto top-up: off")) } @Test func `renders pace line when weekly has reset`() { let now = Date() let snap = UsageSnapshot( primary: nil, secondary: .init( usedPercent: 50, windowMinutes: 10080, resetsAt: now.addingTimeInterval(3 * 24 * 60 * 60), resetDescription: nil), tertiary: nil, updatedAt: now) let output = CLIRenderer.renderText( provider: .codex, snapshot: snap, credits: nil, context: RenderContext( header: "Codex 0.0.0 (codex-cli)", status: nil, useColor: false, resetStyle: .countdown)) #expect(output.contains("Pace:")) } @Test func `renders Ollama weekly pace line when weekly window has reset`() { let now = Date() let snap = UsageSnapshot( primary: .init( usedPercent: 0, windowMinutes: nil, resetsAt: now.addingTimeInterval(4 * 3600), resetDescription: nil), secondary: .init( usedPercent: 23, windowMinutes: 10080, resetsAt: now.addingTimeInterval(5 * 24 * 3600), resetDescription: nil), tertiary: nil, updatedAt: now) let output = CLIRenderer.renderText( provider: .ollama, snapshot: snap, credits: nil, context: RenderContext( header: "Ollama (web)", status: nil, useColor: false, resetStyle: .countdown)) #expect(output.contains("Weekly: 77% left")) #expect(output.contains("Pace: 6% in reserve | Expected 29% used | Lasts until reset")) } @Test func `hides Ollama weekly pace when weekly duration is missing`() { let now = Date() let snap = UsageSnapshot( primary: nil, secondary: .init( usedPercent: 23, windowMinutes: nil, resetsAt: now.addingTimeInterval(5 * 24 * 3600), resetDescription: nil), tertiary: nil, updatedAt: now) let output = CLIRenderer.renderText( provider: .ollama, snapshot: snap, credits: nil, context: RenderContext( header: "Ollama (web)", status: nil, useColor: false, resetStyle: .countdown)) #expect(output.contains("Weekly: 77% left")) #expect(!output.contains("Pace:")) } @Test func `renders JSON payload`() throws { let snap = UsageSnapshot( primary: .init(usedPercent: 50, windowMinutes: 300, resetsAt: nil, resetDescription: nil), secondary: .init(usedPercent: 10, windowMinutes: 10080, resetsAt: nil, resetDescription: nil), tertiary: nil, updatedAt: Date(timeIntervalSince1970: 1_700_000_000)) let payload = ProviderPayload( provider: .codex, account: nil, version: "1.2.3", source: "codex-cli", status: ProviderStatusPayload( indicator: .none, description: nil, updatedAt: Date(timeIntervalSince1970: 1_700_000_010), url: "https://status.example.com"), usage: snap, credits: nil, antigravityPlanInfo: nil, openaiDashboard: nil, error: nil)