52 lines
1.9 KiB
Swift
52 lines
1.9 KiB
Swift
import AppKit
|
|
import CodexBarCore
|
|
import Testing
|
|
@testable import CodexBar
|
|
|
|
@Suite(.serialized)
|
|
@MainActor
|
|
struct StatusItemAnimationCodexCreditsTests {
|
|
@Test
|
|
func `codex icon keeps credits only rendering when usage is missing`() {
|
|
let settings = testSettingsStore(suiteName: "StatusItemAnimationTests-credits-only-icon")
|
|
settings.statusChecksEnabled = false
|
|
settings.refreshFrequency = .manual
|
|
settings.mergeIcons = false
|
|
settings.menuBarShowsBrandIconWithPercent = false
|
|
|
|
let registry = ProviderRegistry.shared
|
|
if let codexMeta = registry.metadata[.codex] {
|
|
settings.setProviderEnabled(provider: .codex, metadata: codexMeta, enabled: true)
|
|
}
|
|
|
|
let fetcher = UsageFetcher()
|
|
let store = UsageStore(fetcher: fetcher, browserDetection: BrowserDetection(cacheTTL: 0), settings: settings)
|
|
store._setSnapshotForTesting(nil, provider: .codex)
|
|
store.credits = CreditsSnapshot(remaining: 80, events: [], updatedAt: Date())
|
|
|
|
let controller = StatusItemController(
|
|
store: store,
|
|
settings: settings,
|
|
account: fetcher.loadAccountInfo(),
|
|
updater: DisabledUpdaterController(),
|
|
preferencesSelection: PreferencesSelection(),
|
|
statusBar: testStatusBar())
|
|
defer { controller.releaseStatusItemsForTesting() }
|
|
|
|
controller.applyIcon(for: .codex, phase: nil)
|
|
|
|
guard let image = controller.statusItems[.codex]?.button?.image else {
|
|
#expect(Bool(false))
|
|
return
|
|
}
|
|
let rep = image.representations.compactMap { $0 as? NSBitmapImageRep }.first(where: {
|
|
$0.pixelsWide == 36 && $0.pixelsHigh == 36
|
|
})
|
|
#expect(rep != nil)
|
|
guard let rep else { return }
|
|
|
|
let creditsOnlyAlpha = (rep.colorAt(x: 18, y: 17) ?? .clear).alphaComponent
|
|
#expect(creditsOnlyAlpha > 0.05)
|
|
}
|
|
}
|