From 712c8decde1b150bebff80de4ad1b6ba8df9a812 Mon Sep 17 00:00:00 2001 From: ykisana Date: Tue, 6 Oct 2026 18:50:28 -0600 Subject: [PATCH] fix: daily time reset --- Normal/Models/UsageLimitEditPolicy.swift | 5 ++++- .../Models/UsageLimitEditPolicyTests.swift | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Normal/Models/UsageLimitEditPolicy.swift b/Normal/Models/UsageLimitEditPolicy.swift index 456ad04..34ffb33 100644 --- a/Normal/Models/UsageLimitEditPolicy.swift +++ b/Normal/Models/UsageLimitEditPolicy.swift @@ -68,11 +68,14 @@ nonisolated enum UsageLimitEditPolicy { static func lockState(anchor: Date?, now: Date = .now) -> UsageLimitLockState { guard let anchor else { return .unlocked } + let unlock = anchor + cooldownInterval + if now < anchor { + return .locked(until: unlock) + } let graceEnds = anchor + graceInterval if now < graceEnds { return .grace(until: graceEnds) } - let unlock = anchor + cooldownInterval return now < unlock ? .locked(until: unlock) : .unlocked } diff --git a/NormalTests/Models/UsageLimitEditPolicyTests.swift b/NormalTests/Models/UsageLimitEditPolicyTests.swift index c3daec3..fd7aeff 100644 --- a/NormalTests/Models/UsageLimitEditPolicyTests.swift +++ b/NormalTests/Models/UsageLimitEditPolicyTests.swift @@ -151,6 +151,24 @@ struct UsageLimitEditPolicyTests { #expect(current == anchor) } + @Test(arguments: [ + UsageLimitEdit.adjust(from: 30, to: 60, dropsCoverage: false), + .adjust(from: 60, to: 60, dropsCoverage: true), + .delete(minutes: 30), + .changeReset, + ]) + func windingTheClockBackBeforeTheAnchorDoesNotReopenGrace(edit: UsageLimitEdit) { + let decision = UsageLimitEditPolicy.decide(edit, anchor: anchor, now: anchor - .days(1)) + #expect(decision == .locked(until: anchor + .days(7))) + } + + @Test func restoringTheClockAfterAFutureAnchorStaysLocked() { + #expect( + UsageLimitEditPolicy.lockState(anchor: anchor, now: anchor - 1) + == .locked(until: anchor + .days(7)) + ) + } + // MARK: - Anchor bookkeeping @Test func onlyCooldownElapsedStartsANewWeek() {