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
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)
}
}