189 lines
5.7 KiB
Swift
189 lines
5.7 KiB
Swift
import Foundation
|
|
import Testing
|
|
@testable import CodexBar
|
|
|
|
struct OpenAIWebRefreshGateTests {
|
|
@Test
|
|
func `Battery saver keeps background OpenAI web refreshes off`() {
|
|
let shouldRun = UsageStore.shouldRunOpenAIWebRefresh(.init(
|
|
accessEnabled: true,
|
|
batterySaverEnabled: true,
|
|
force: false,
|
|
refreshPhase: .regular))
|
|
|
|
#expect(shouldRun == false)
|
|
}
|
|
|
|
@Test
|
|
func `Disabling battery saver restores normal OpenAI web refreshes`() {
|
|
let shouldRun = UsageStore.shouldRunOpenAIWebRefresh(.init(
|
|
accessEnabled: true,
|
|
batterySaverEnabled: false,
|
|
force: false,
|
|
refreshPhase: .regular))
|
|
|
|
#expect(shouldRun == true)
|
|
}
|
|
|
|
@Test
|
|
func `Manual refresh still forces OpenAI web refreshes with battery saver enabled`() {
|
|
let shouldRun = UsageStore.shouldRunOpenAIWebRefresh(.init(
|
|
accessEnabled: true,
|
|
batterySaverEnabled: true,
|
|
force: true,
|
|
refreshPhase: .regular))
|
|
|
|
#expect(shouldRun == true)
|
|
}
|
|
|
|
@Test
|
|
func `Startup skips automatic OpenAI web refreshes`() {
|
|
let shouldRun = UsageStore.shouldRunOpenAIWebRefresh(.init(
|
|
accessEnabled: true,
|
|
batterySaverEnabled: false,
|
|
force: false,
|
|
refreshPhase: .startup))
|
|
|
|
#expect(shouldRun == false)
|
|
}
|
|
|
|
@Test
|
|
func `Startup connectivity retry remains startup only for OpenAI web refresh gate`() {
|
|
let providerPhase = UsageStore.refreshPhase(
|
|
hasCompletedInitialRefresh: true)
|
|
let openAIWebPhase = UsageStore.openAIWebRefreshPhase(
|
|
providerRefreshPhase: providerPhase,
|
|
startupConnectivityRetryAttempt: 1)
|
|
let shouldRun = UsageStore.shouldRunOpenAIWebRefresh(.init(
|
|
accessEnabled: true,
|
|
batterySaverEnabled: false,
|
|
force: false,
|
|
refreshPhase: openAIWebPhase))
|
|
|
|
#expect(providerPhase == .regular)
|
|
#expect(openAIWebPhase == .startup)
|
|
#expect(shouldRun == false)
|
|
}
|
|
|
|
@Test
|
|
func `Manual startup refresh still forces OpenAI web refreshes`() {
|
|
let shouldRun = UsageStore.shouldRunOpenAIWebRefresh(.init(
|
|
accessEnabled: true,
|
|
batterySaverEnabled: true,
|
|
force: true,
|
|
refreshPhase: .startup))
|
|
|
|
#expect(shouldRun == true)
|
|
}
|
|
|
|
@Test
|
|
func `Battery saver stale-submenu refresh respects the cooldown`() {
|
|
let shouldForce = UsageStore.forceOpenAIWebRefreshForStaleRequest(batterySaverEnabled: true)
|
|
|
|
#expect(shouldForce == false)
|
|
}
|
|
|
|
@Test
|
|
func `Normal stale-submenu refresh still forces when battery saver is off`() {
|
|
let shouldForce = UsageStore.forceOpenAIWebRefreshForStaleRequest(batterySaverEnabled: false)
|
|
|
|
#expect(shouldForce == true)
|
|
}
|
|
|
|
@Test
|
|
func `Recent successful dashboard refresh stays throttled`() {
|
|
let now = Date()
|
|
|
|
let shouldSkip = UsageStore.shouldSkipOpenAIWebRefresh(.init(
|
|
force: false,
|
|
accountDidChange: false,
|
|
lastError: nil,
|
|
lastSnapshotAt: now.addingTimeInterval(-60),
|
|
lastAttemptAt: now.addingTimeInterval(-60),
|
|
now: now,
|
|
refreshInterval: 300))
|
|
|
|
#expect(shouldSkip == true)
|
|
}
|
|
|
|
@Test
|
|
func `Recent failed dashboard refresh also stays throttled`() {
|
|
let now = Date()
|
|
|
|
let shouldSkip = UsageStore.shouldSkipOpenAIWebRefresh(.init(
|
|
force: false,
|
|
accountDidChange: false,
|
|
lastError: "login required",
|
|
lastSnapshotAt: nil,
|
|
lastAttemptAt: now.addingTimeInterval(-60),
|
|
now: now,
|
|
refreshInterval: 300))
|
|
|
|
#expect(shouldSkip == true)
|
|
}
|
|
|
|
@Test
|
|
func `Force refresh bypasses throttle after failures`() {
|
|
let now = Date()
|
|
|
|
let shouldSkip = UsageStore.shouldSkipOpenAIWebRefresh(.init(
|
|
force: true,
|
|
accountDidChange: false,
|
|
lastError: "login required",
|
|
lastSnapshotAt: nil,
|
|
lastAttemptAt: now.addingTimeInterval(-60),
|
|
now: now,
|
|
refreshInterval: 300))
|
|
|
|
#expect(shouldSkip == false)
|
|
}
|
|
|
|
@Test
|
|
func `Account switches bypass the prior-attempt cooldown`() {
|
|
let now = Date()
|
|
|
|
let shouldSkip = UsageStore.shouldSkipOpenAIWebRefresh(.init(
|
|
force: false,
|
|
accountDidChange: true,
|
|
lastError: "mismatch",
|
|
lastSnapshotAt: nil,
|
|
lastAttemptAt: now.addingTimeInterval(-60),
|
|
now: now,
|
|
refreshInterval: 300))
|
|
|
|
#expect(shouldSkip == false)
|
|
}
|
|
|
|
@Test
|
|
func `Empty dashboard history retry is throttled after a recent attempt`() {
|
|
let now = Date()
|
|
|
|
let shouldSkip = UsageStore.shouldSkipOpenAIWebEmptyHistoryRetry(.init(
|
|
force: false,
|
|
accountDidChange: false,
|
|
lastError: nil,
|
|
lastSnapshotAt: now.addingTimeInterval(-120),
|
|
lastAttemptAt: now.addingTimeInterval(-60),
|
|
now: now,
|
|
refreshInterval: 300))
|
|
|
|
#expect(shouldSkip == true)
|
|
}
|
|
|
|
@Test
|
|
func `Empty dashboard history retry runs once for a newer empty snapshot`() {
|
|
let now = Date()
|
|
|
|
let shouldSkip = UsageStore.shouldSkipOpenAIWebEmptyHistoryRetry(.init(
|
|
force: false,
|
|
accountDidChange: false,
|
|
lastError: nil,
|
|
lastSnapshotAt: now.addingTimeInterval(-60),
|
|
lastAttemptAt: now.addingTimeInterval(-120),
|
|
now: now,
|
|
refreshInterval: 300))
|
|
|
|
#expect(shouldSkip == false)
|
|
}
|
|
}
|