56 lines
2.1 KiB
Swift
56 lines
2.1 KiB
Swift
import Foundation
|
|
import Testing
|
|
@testable import CodexBarCore
|
|
|
|
struct ClaudeResetJSONParserTests {
|
|
@Test
|
|
func `usage JSON parser applies quota horizons from one clock`() throws {
|
|
let reset = "Jul 9 at 6am (UTC)"
|
|
let json = """
|
|
{
|
|
"ok": true,
|
|
"session_5h": { "pct_used": 1, "resets": "\(reset)" },
|
|
"week_all_models": { "pct_used": 2, "resets": "\(reset)" },
|
|
"week_sonnet": { "pct_used": 3, "resets": "\(reset)" }
|
|
}
|
|
"""
|
|
let now = try Self.isoDate("2026-07-09T12:00:00Z")
|
|
let snapshot = try #require(ClaudeUsageFetcher.parse(json: Data(json.utf8), now: now))
|
|
let futureReset = try Self.isoDate("2027-07-09T06:00:00Z")
|
|
let recentReset = try Self.isoDate("2026-07-09T06:00:00Z")
|
|
|
|
#expect(snapshot.primary.resetsAt == futureReset)
|
|
#expect(snapshot.secondary?.resetsAt == recentReset)
|
|
#expect(snapshot.opus?.resetsAt == recentReset)
|
|
#expect(snapshot.updatedAt == now)
|
|
}
|
|
|
|
@Test
|
|
func `usage JSON parser supports explicit years and preserves malformed reset text`() throws {
|
|
let explicitReset = "Jan 2, 2026, 10:59pm (Europe/Helsinki)"
|
|
let malformedReset = "after the next billing sync"
|
|
let json = """
|
|
{
|
|
"ok": true,
|
|
"session_5h": { "pct_used": 1, "resets": "\(explicitReset)" },
|
|
"week_all_models": { "pct_used": 2, "resets": "\(malformedReset)" }
|
|
}
|
|
"""
|
|
let now = try Self.isoDate("2025-01-01T00:00:00Z")
|
|
let snapshot = try #require(ClaudeUsageFetcher.parse(
|
|
json: Data(json.utf8),
|
|
now: now))
|
|
let expectedReset = try Self.isoDate("2026-01-02T20:59:00Z")
|
|
|
|
#expect(snapshot.primary.resetsAt == expectedReset)
|
|
#expect(snapshot.primary.resetDescription == explicitReset)
|
|
#expect(snapshot.secondary?.resetsAt == nil)
|
|
#expect(snapshot.secondary?.resetDescription == malformedReset)
|
|
}
|
|
|
|
private static func isoDate(_ text: String) throws -> Date {
|
|
let formatter = ISO8601DateFormatter()
|
|
return try #require(formatter.date(from: text))
|
|
}
|
|
}
|