176 lines
6.7 KiB
Swift
176 lines
6.7 KiB
Swift
import CodexBarCore
|
|
import Foundation
|
|
import XCTest
|
|
|
|
final class ResetTimeBackfillTests: XCTestCase {
|
|
func test_backfillsMissingResetMetadataFromCachedWindow() {
|
|
let now = Date(timeIntervalSince1970: 1_800_000_000)
|
|
let reset = now.addingTimeInterval(3600)
|
|
let cached = RateWindow(
|
|
usedPercent: 50,
|
|
windowMinutes: 300,
|
|
resetsAt: reset,
|
|
resetDescription: "Resets in 1h",
|
|
nextRegenPercent: 9)
|
|
let fresh = RateWindow(
|
|
usedPercent: 62,
|
|
windowMinutes: nil,
|
|
resetsAt: nil,
|
|
resetDescription: nil,
|
|
nextRegenPercent: 4)
|
|
|
|
let result = fresh.backfillingResetTime(from: cached, now: now)
|
|
|
|
XCTAssertEqual(result.usedPercent, 62)
|
|
XCTAssertEqual(result.windowMinutes, 300)
|
|
XCTAssertEqual(result.resetsAt, reset)
|
|
XCTAssertEqual(result.resetDescription, "Resets in 1h")
|
|
XCTAssertEqual(result.nextRegenPercent, 4)
|
|
}
|
|
|
|
func test_backfillsZeroWindowDurationFromCachedWindow() {
|
|
let now = Date(timeIntervalSince1970: 1_800_000_000)
|
|
let reset = now.addingTimeInterval(3600)
|
|
let cached = RateWindow(
|
|
usedPercent: 50,
|
|
windowMinutes: 300,
|
|
resetsAt: reset,
|
|
resetDescription: nil)
|
|
let fresh = RateWindow(usedPercent: 62, windowMinutes: 0, resetsAt: nil, resetDescription: nil)
|
|
|
|
let result = fresh.backfillingResetTime(from: cached, now: now)
|
|
|
|
XCTAssertEqual(result.windowMinutes, 300)
|
|
XCTAssertEqual(result.resetsAt, reset)
|
|
}
|
|
|
|
func test_skipsExpiredCachedReset() {
|
|
let now = Date(timeIntervalSince1970: 1_800_000_000)
|
|
let cached = RateWindow(
|
|
usedPercent: 50,
|
|
windowMinutes: 300,
|
|
resetsAt: now.addingTimeInterval(-60),
|
|
resetDescription: "Expired")
|
|
let fresh = RateWindow(usedPercent: 62, windowMinutes: nil, resetsAt: nil, resetDescription: nil)
|
|
|
|
let result = fresh.backfillingResetTime(from: cached, now: now)
|
|
|
|
XCTAssertNil(result.resetsAt)
|
|
XCTAssertNil(result.windowMinutes)
|
|
XCTAssertNil(result.resetDescription)
|
|
}
|
|
|
|
func test_snapshotBackfillPreservesCurrentSnapshotFields() {
|
|
let now = Date(timeIntervalSince1970: 1_800_000_000)
|
|
let reset = now.addingTimeInterval(3600)
|
|
let identity = ProviderIdentitySnapshot(
|
|
providerID: .claude,
|
|
accountEmail: "peter@example.com",
|
|
accountOrganization: "Org",
|
|
loginMethod: "OAuth")
|
|
let cached = UsageSnapshot(
|
|
primary: RateWindow(usedPercent: 40, windowMinutes: 300, resetsAt: reset, resetDescription: "Soon"),
|
|
secondary: nil,
|
|
updatedAt: now.addingTimeInterval(-300),
|
|
identity: identity)
|
|
let extra = NamedRateWindow(
|
|
id: "overflow",
|
|
title: "Overflow",
|
|
window: RateWindow(
|
|
usedPercent: 12,
|
|
windowMinutes: nil,
|
|
resetsAt: nil,
|
|
resetDescription: nil,
|
|
nextRegenPercent: 2))
|
|
let fresh = UsageSnapshot(
|
|
primary: RateWindow(
|
|
usedPercent: 66,
|
|
windowMinutes: nil,
|
|
resetsAt: nil,
|
|
resetDescription: nil,
|
|
nextRegenPercent: 7),
|
|
secondary: nil,
|
|
extraRateWindows: [extra],
|
|
cursorRequests: CursorRequestUsage(used: 10, limit: 50),
|
|
subscriptionExpiresAt: reset.addingTimeInterval(86400),
|
|
subscriptionRenewsAt: reset.addingTimeInterval(43200),
|
|
updatedAt: now,
|
|
identity: identity)
|
|
|
|
let result = fresh.backfillingResetTimes(from: cached, now: now)
|
|
|
|
XCTAssertEqual(result.primary?.resetsAt, reset)
|
|
XCTAssertEqual(result.primary?.usedPercent, 66)
|
|
XCTAssertEqual(result.primary?.nextRegenPercent, 7)
|
|
XCTAssertEqual(result.extraRateWindows?.first?.id, "overflow")
|
|
XCTAssertEqual(result.extraRateWindows?.first?.window.nextRegenPercent, 2)
|
|
XCTAssertEqual(result.cursorRequests?.used, 10)
|
|
XCTAssertEqual(result.subscriptionExpiresAt, reset.addingTimeInterval(86400))
|
|
XCTAssertEqual(result.subscriptionRenewsAt, reset.addingTimeInterval(43200))
|
|
XCTAssertEqual(result.identity?.accountEmail, "peter@example.com")
|
|
}
|
|
|
|
func test_snapshotBackfillSkipsDifferentAccounts() {
|
|
let now = Date(timeIntervalSince1970: 1_800_000_000)
|
|
let cached = UsageSnapshot(
|
|
primary: RateWindow(
|
|
usedPercent: 40,
|
|
windowMinutes: 300,
|
|
resetsAt: now.addingTimeInterval(3600),
|
|
resetDescription: "Soon"),
|
|
secondary: nil,
|
|
updatedAt: now.addingTimeInterval(-300),
|
|
identity: ProviderIdentitySnapshot(
|
|
providerID: .claude,
|
|
accountEmail: "old@example.com",
|
|
accountOrganization: nil,
|
|
loginMethod: nil))
|
|
let fresh = UsageSnapshot(
|
|
primary: RateWindow(usedPercent: 66, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
|
|
secondary: nil,
|
|
updatedAt: now,
|
|
identity: ProviderIdentitySnapshot(
|
|
providerID: .claude,
|
|
accountEmail: "new@example.com",
|
|
accountOrganization: nil,
|
|
loginMethod: nil))
|
|
|
|
let result = fresh.backfillingResetTimes(from: cached, now: now)
|
|
|
|
XCTAssertNil(result.primary?.resetsAt)
|
|
}
|
|
|
|
func test_snapshotBackfillKeepsOtherProviderResetWhenDescriptionChanges() {
|
|
let now = Date(timeIntervalSince1970: 1_800_000_000)
|
|
let reset = now.addingTimeInterval(3600)
|
|
let identity = ProviderIdentitySnapshot(
|
|
providerID: .claude,
|
|
accountEmail: "user@example.com",
|
|
accountOrganization: nil,
|
|
loginMethod: nil)
|
|
let cached = UsageSnapshot(
|
|
primary: RateWindow(
|
|
usedPercent: 40,
|
|
windowMinutes: 300,
|
|
resetsAt: reset,
|
|
resetDescription: "40 / 100 used"),
|
|
secondary: nil,
|
|
updatedAt: now.addingTimeInterval(-300),
|
|
identity: identity)
|
|
let fresh = UsageSnapshot(
|
|
primary: RateWindow(
|
|
usedPercent: 50,
|
|
windowMinutes: 300,
|
|
resetsAt: nil,
|
|
resetDescription: "50 / 100 used"),
|
|
secondary: nil,
|
|
updatedAt: now,
|
|
identity: identity)
|
|
|
|
let result = fresh.backfillingResetTimes(from: cached, now: now)
|
|
|
|
XCTAssertEqual(result.primary?.resetsAt, reset)
|
|
XCTAssertEqual(result.primary?.resetDescription, "50 / 100 used")
|
|
}
|
|
}
|