import Foundation import Testing @testable import CodexBarCore struct OllamaUsageParserTests { @Test func `parses cloud usage from settings HTML`() throws { let now = Date(timeIntervalSince1970: 1_700_000_000) let html = """

Cloud Usage free

user@example.com

Session usage 0.1% used
Resets in 3 hours
Weekly usage 0.7% used
Resets in 2 days
""" let snapshot = try OllamaUsageParser.parse(html: html, now: now) #expect(snapshot.planName == "free") #expect(snapshot.accountEmail == "user@example.com") #expect(snapshot.sessionUsedPercent == 0.1) #expect(snapshot.weeklyUsedPercent == 0.7) let formatter = ISO8601DateFormatter() formatter.formatOptions = [.withInternetDateTime] let expectedSession = formatter.date(from: "2026-01-30T18:00:00Z") let expectedWeekly = formatter.date(from: "2026-02-02T00:00:00Z") #expect(snapshot.sessionResetsAt == expectedSession) #expect(snapshot.weeklyResetsAt == expectedWeekly) let usage = snapshot.toUsageSnapshot() #expect(usage.identity?.loginMethod == "free") #expect(usage.identity?.accountEmail == "user@example.com") #expect(usage.primary?.windowMinutes == 5 * 60) #expect(usage.secondary?.windowMinutes == 7 * 24 * 60) } @Test func `missing usage throws parse failed`() { let html = "No usage here. login status unknown." #expect { try OllamaUsageParser.parse(html: html) } throws: { error in guard case let OllamaUsageError.parseFailed(message) = error else { return false } return message.contains("Missing Ollama usage data") } } @Test func `classified parse missing usage returns typed failure`() { let html = "No usage here. login status unknown." let result = OllamaUsageParser.parseClassified(html: html) switch result { case .success: Issue.record("Expected classified parse failure for missing usage data") case let .failure(failure): #expect(failure == .missingUsageData) } } @Test func `signed out throws not logged in`() { let html = """

Sign in to Ollama

""" #expect { try OllamaUsageParser.parse(html: html) } throws: { error in guard case OllamaUsageError.notLoggedIn = error else { return false } return true } } @Test func `classified parse signed out returns typed failure`() { let html = """

Sign in to Ollama

""" let result = OllamaUsageParser.parseClassified(html: html) switch result { case .success: Issue.record("Expected classified parse failure for signed-out HTML") case let .failure(failure): #expect(failure == .notLoggedIn) } } @Test func `generic sign in text without auth markers throws parse failed`() { let html = """

Usage Dashboard

If you have an account, you can sign in from the homepage.

No usage rows rendered.
""" #expect { try OllamaUsageParser.parse(html: html) } throws: { error in guard case let OllamaUsageError.parseFailed(message) = error else { return false } return message.contains("Missing Ollama usage data") } } @Test func `parses hourly usage as primary window`() throws { let now = Date(timeIntervalSince1970: 1_700_000_000) let html = """
Hourly usage 2.5% used
Resets in 3 hours
Weekly usage 4.2% used
Resets in 2 days
""" let snapshot = try OllamaUsageParser.parse(html: html, now: now) #expect(snapshot.sessionUsedPercent == 2.5) #expect(snapshot.weeklyUsedPercent == 4.2) let usage = snapshot.toUsageSnapshot() #expect(usage.primary?.windowMinutes == nil) #expect(usage.secondary?.windowMinutes == 7 * 24 * 60) } @Test func `weekly usage parser finds reset timestamp in long usage block`() throws { let now = Date(timeIntervalSince1970: 1_700_000_000) let filler = String(repeating: "", count: 40) let html = """
Session usage 0.1% used Weekly usage 0.7% used \(filler)
Resets in 2 days
""" let snapshot = try OllamaUsageParser.parse(html: html, now: now) let formatter = ISO8601DateFormatter() formatter.formatOptions = [.withInternetDateTime] let expectedWeekly = formatter.date(from: "2026-02-02T00:00:00Z") let usage = snapshot.toUsageSnapshot() #expect(usage.primary?.resetsAt == nil) #expect(usage.secondary?.resetsAt == expectedWeekly) } @Test func `parses usage when used is capitalized`() throws { let now = Date(timeIntervalSince1970: 1_700_000_000) let html = """
Session usage 1.2% Used
Resets in 3 hours
Weekly usage 3.4% USED
Resets in 2 days
""" let snapshot = try OllamaUsageParser.parse(html: html, now: now) #expect(snapshot.sessionUsedPercent == 1.2) #expect(snapshot.weeklyUsedPercent == 3.4) } }