Skip to content

Commit d57954e

Browse files
committed
test: use scoped refresh tasks
1 parent f562916 commit d57954e

6 files changed

Lines changed: 27 additions & 59 deletions

Sources/CodexBar/StatusItemController+Actions.swift

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,6 @@ extension StatusItemController {
88
case global
99
case provider(UsageProvider)
1010
}
11-
12-
/// The in-flight manual refresh task when it is unambiguous: the all-providers one, or the single
13-
/// task when exactly one is running. Nil once several run concurrently, so tests await a specific
14-
/// scope rather than an arbitrary task. Test-only; the setter writes `.global`, and production code
15-
/// keys into `manualRefreshTasks` by scope.
16-
var manualRefreshTask: Task<Void, Never>? {
17-
get {
18-
if let global = self.manualRefreshTasks[.global] { return global }
19-
return self.manualRefreshTasks.count == 1 ? self.manualRefreshTasks.values.first : nil
20-
}
21-
set { self.manualRefreshTasks[.global] = newValue }
22-
}
23-
24-
/// The single per-provider manual refresh in flight, or nil when there is none, a global refresh,
25-
/// or several providers refreshing at once. Read only by tests; production code keys into
26-
/// `manualRefreshTasks` directly.
27-
var manualRefreshProvider: UsageProvider? {
28-
guard self.manualRefreshTasks[.global] == nil, self.manualRefreshTasks.count == 1 else {
29-
return nil
30-
}
31-
for case let .provider(provider) in self.manualRefreshTasks.keys {
32-
return provider
33-
}
34-
return nil
35-
}
3611
}
3712

3813
enum LoginNotificationLogic {

Sources/CodexBar/StatusItemController.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ final class StatusItemController: NSObject, NSMenuDelegate, StatusItemControllin
140140
var menuRefreshTasks: [ObjectIdentifier: Task<Void, Never>] = [:]
141141
/// Manual refreshes tracked per scope so refreshing one provider neither greys out nor blocks
142142
/// a manual refresh of another. `.global` covers the all-providers refresh (⌘R / merged overview).
143-
/// Test-only accessors `manualRefreshTask` / `manualRefreshProvider` live in `+Actions`.
144143
var manualRefreshTasks: [ManualRefreshScope: Task<Void, Never>] = [:]
145144

146145
var closedMenuRebuildTasks: [ObjectIdentifier: Task<Void, Never>] = [:]

Tests/CodexBarTests/StatusMenuClosedPreparationTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ extension StatusMenuTests {
185185
controller._test_manualRefreshOperation = nil
186186
}
187187
controller.refreshNow()
188-
let task = try #require(controller.manualRefreshTask)
188+
let task = try #require(controller.manualRefreshTasks[.global])
189189

190190
controller.invalidateMenus()
191191
for _ in 0..<40 {

Tests/CodexBarTests/StatusMenuMergedOverviewRefreshTests.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ struct StatusMenuMergedOverviewRefreshTests {
4242
}
4343

4444
#expect(requestCount == 0)
45-
#expect(controller.manualRefreshTask == nil)
46-
#expect(controller.manualRefreshProvider == nil)
45+
#expect(controller.manualRefreshTasks.isEmpty)
4746
}
4847

4948
private func makeSettings() -> SettingsStore {

Tests/CodexBarTests/StatusMenuPersistentRefreshTests.swift

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -172,17 +172,17 @@ struct StatusMenuPersistentRefreshTests {
172172
let gate = ManualRefreshGate()
173173
controller._test_manualRefreshOperation = { await gate.wait() }
174174
#expect(try controller.handleMenuTrackingShortcutEvent(self.keyEvent("r", keyCode: 15), menu: menu))
175-
for _ in 0..<20 where controller.manualRefreshTask == nil {
175+
for _ in 0..<20 where controller.manualRefreshTasks[.provider(.codex)] == nil {
176176
await Task.yield()
177177
}
178178

179-
let task = try #require(controller.manualRefreshTask)
179+
let task = try #require(controller.manualRefreshTasks[.provider(.codex)])
180180
#expect(!refreshItem.isEnabled)
181181

182182
gate.resume()
183183
await task.value
184184

185-
#expect(controller.manualRefreshTask == nil)
185+
#expect(controller.manualRefreshTasks[.provider(.codex)] == nil)
186186
#expect(refreshItem.isEnabled)
187187
}
188188

@@ -767,7 +767,7 @@ struct StatusMenuPersistentRefreshTests {
767767
controller.refreshNow()
768768

769769
#expect(requestCount == 0)
770-
#expect(controller.manualRefreshTask == nil)
770+
#expect(controller.manualRefreshTasks.isEmpty)
771771
#expect(!controller.menuCardRefreshMonitor.isManualRefreshInFlight)
772772
}
773773

@@ -787,7 +787,7 @@ struct StatusMenuPersistentRefreshTests {
787787
}
788788

789789
controller.refreshNow()
790-
let task = try #require(controller.manualRefreshTask)
790+
let task = try #require(controller.manualRefreshTasks[.global])
791791
controller.refreshNow()
792792
controller.refreshNow()
793793
await Task.yield()
@@ -798,7 +798,7 @@ struct StatusMenuPersistentRefreshTests {
798798
gate.resume()
799799
await task.value
800800

801-
#expect(controller.manualRefreshTask == nil)
801+
#expect(controller.manualRefreshTasks[.global] == nil)
802802
#expect(!controller.menuCardRefreshMonitor.isManualRefreshInFlight)
803803
}
804804

@@ -824,11 +824,10 @@ struct StatusMenuPersistentRefreshTests {
824824
let refreshItem = try #require(menu.items.first { $0.title == "Refresh" })
825825
#expect(controller.isPersistentRefreshItem(refreshItem))
826826
controller.performPersistentRefreshAction(in: ObjectIdentifier(menu))
827-
for _ in 0..<20 where controller.manualRefreshTask == nil {
827+
for _ in 0..<20 where controller.manualRefreshTasks[.provider(.claude)] == nil {
828828
await Task.yield()
829829
}
830-
let mouseTask = try #require(controller.manualRefreshTask)
831-
#expect(controller.manualRefreshProvider == .claude)
830+
let mouseTask = try #require(controller.manualRefreshTasks[.provider(.claude)])
832831

833832
// Refreshing Claude greys the Claude row but must leave the Codex row available.
834833
#expect(controller.isRefreshActionInFlight(for: menu))
@@ -840,11 +839,10 @@ struct StatusMenuPersistentRefreshTests {
840839
let keyboardGate = ManualRefreshGate()
841840
controller._test_manualRefreshOperation = { await keyboardGate.wait() }
842841
#expect(try menu.performKeyEquivalent(with: self.keyEvent("r", keyCode: 15)))
843-
for _ in 0..<20 where controller.manualRefreshTask == nil {
842+
for _ in 0..<20 where controller.manualRefreshTasks[.provider(.claude)] == nil {
844843
await Task.yield()
845844
}
846-
let keyboardTask = try #require(controller.manualRefreshTask)
847-
#expect(controller.manualRefreshProvider == .claude)
845+
let keyboardTask = try #require(controller.manualRefreshTasks[.provider(.claude)])
848846
keyboardGate.resume()
849847
await keyboardTask.value
850848
}
@@ -874,8 +872,7 @@ struct StatusMenuPersistentRefreshTests {
874872
}
875873

876874
#expect(requestCount == 0)
877-
#expect(controller.manualRefreshTask == nil)
878-
#expect(controller.manualRefreshProvider == nil)
875+
#expect(controller.manualRefreshTasks.isEmpty)
879876
}
880877

881878
@Test
@@ -897,11 +894,10 @@ struct StatusMenuPersistentRefreshTests {
897894
let refreshItem = try #require(menu.items.first { $0.title == "Refresh" })
898895
#expect(controller.isPersistentRefreshItem(refreshItem))
899896
controller.performPersistentRefreshAction(in: ObjectIdentifier(menu))
900-
for _ in 0..<20 where controller.manualRefreshTask == nil {
897+
for _ in 0..<20 where controller.manualRefreshTasks[.global] == nil {
901898
await Task.yield()
902899
}
903-
let overviewTask = try #require(controller.manualRefreshTask)
904-
#expect(controller.manualRefreshProvider == nil)
900+
let overviewTask = try #require(controller.manualRefreshTasks[.global])
905901
overviewGate.resume()
906902
await overviewTask.value
907903

@@ -910,11 +906,10 @@ struct StatusMenuPersistentRefreshTests {
910906
let providerGate = ManualRefreshGate()
911907
controller._test_manualRefreshOperation = { await providerGate.wait() }
912908
#expect(try menu.performKeyEquivalent(with: self.keyEvent("r", keyCode: 15)))
913-
for _ in 0..<20 where controller.manualRefreshTask == nil {
909+
for _ in 0..<20 where controller.manualRefreshTasks[.provider(.claude)] == nil {
914910
await Task.yield()
915911
}
916-
let providerTask = try #require(controller.manualRefreshTask)
917-
#expect(controller.manualRefreshProvider == .claude)
912+
let providerTask = try #require(controller.manualRefreshTasks[.provider(.claude)])
918913
providerGate.resume()
919914
await providerTask.value
920915
}
@@ -965,13 +960,13 @@ struct StatusMenuPersistentRefreshTests {
965960
}
966961

967962
controller.refreshNow()
968-
let task = try #require(controller.manualRefreshTask)
963+
let task = try #require(controller.manualRefreshTasks[.global])
969964
#expect(!refreshItem.isEnabled)
970965

971966
gate.resume()
972967
await task.value
973968

974-
#expect(controller.manualRefreshTask == nil)
969+
#expect(controller.manualRefreshTasks[.global] == nil)
975970
#expect(refreshItem.isEnabled)
976971
let fallback = MenuCardLiveSubtitle(text: "Fallback", style: .info)
977972
#expect(controller.menuCardRefreshMonitor.subtitle(for: .codex, fallback: fallback).style == .error)

Tests/CodexBarTests/StatusMenuSwitcherRefreshTests.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ struct StatusMenuSwitcherRefreshTests {
349349
preferencesSelection: PreferencesSelection(),
350350
statusBar: .system)
351351
defer {
352-
controller.manualRefreshTask?.cancel()
352+
controller.manualRefreshTasks.values.forEach { $0.cancel() }
353353
controller.releaseStatusItemsForTesting()
354354
}
355355

@@ -401,7 +401,7 @@ struct StatusMenuSwitcherRefreshTests {
401401
#expect(inFlight.metrics.first?.percentLabel == "79% left")
402402

403403
gate.resume()
404-
await controller.manualRefreshTask?.value
404+
await controller.manualRefreshTasks[.global]?.value
405405
#expect(!controller.menuCardRefreshMonitor.isManualRefreshInFlight)
406406
let completed = controller.menuCardRefreshMonitor.model(for: .codex, fallback: emptyFallback)
407407
#expect(completed.metrics.isEmpty)
@@ -435,7 +435,7 @@ struct StatusMenuSwitcherRefreshTests {
435435
preferencesSelection: PreferencesSelection(),
436436
statusBar: .system)
437437
defer {
438-
controller.manualRefreshTask?.cancel()
438+
controller.manualRefreshTasks.values.forEach { $0.cancel() }
439439
controller.releaseStatusItemsForTesting()
440440
}
441441

@@ -450,7 +450,7 @@ struct StatusMenuSwitcherRefreshTests {
450450
let initialRefreshItem = try #require(menu.items.first { $0.title == "Refresh" })
451451

452452
controller.refreshNow()
453-
let refreshTask = try #require(controller.manualRefreshTask)
453+
let refreshTask = try #require(controller.manualRefreshTasks[.global])
454454
#expect(!initialRefreshItem.isEnabled)
455455

456456
var rebuildCount = 0
@@ -463,7 +463,7 @@ struct StatusMenuSwitcherRefreshTests {
463463

464464
gate.resume()
465465
await refreshTask.value
466-
#expect(controller.manualRefreshTask == nil)
466+
#expect(controller.manualRefreshTasks[.global] == nil)
467467

468468
let alternateSwitcher = try #require(menu.items.first?.view as? ProviderSwitcherView)
469469
#expect(alternateSwitcher._test_simulateRuntimeClick(buttonTag: selectedButton.tag))
@@ -497,7 +497,7 @@ struct StatusMenuSwitcherRefreshTests {
497497
preferencesSelection: PreferencesSelection(),
498498
statusBar: .system)
499499
defer {
500-
controller.manualRefreshTask?.cancel()
500+
controller.manualRefreshTasks.values.forEach { $0.cancel() }
501501
controller.releaseStatusItemsForTesting()
502502
}
503503

@@ -507,13 +507,13 @@ struct StatusMenuSwitcherRefreshTests {
507507
controller.mergedSwitcherContentCaches[ObjectIdentifier(menu)]?[.provider(.codex)])
508508
let refreshItem = try #require(cache.items.first { $0.title == "Refresh" })
509509

510-
controller.manualRefreshTask = Task {}
510+
controller.manualRefreshTasks[.global] = Task {}
511511
controller.updatePersistentRefreshItemsEnabled()
512512
#expect(!refreshItem.isEnabled)
513513

514514
menu.removeAllItems()
515515
#expect(refreshItem.menu == nil)
516-
controller.manualRefreshTask = nil
516+
controller.manualRefreshTasks[.global] = nil
517517
controller.updatePersistentRefreshItemsEnabled()
518518
#expect(!refreshItem.isEnabled)
519519

0 commit comments

Comments
 (0)