summaryrefslogtreecommitdiff
path: root/HutchTests/TicketSavedFilterStoreTests.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-12 21:33:14 -0500
committerChristian Cleberg <[email protected]>2026-04-12 21:33:14 -0500
commit31cbca674957eea7ae2529012e20a9d95158e561 (patch)
treeea57e5b7faf17b3a3a0967e074960f41d3556393 /HutchTests/TicketSavedFilterStoreTests.swift
parent7548bfb595d853c682653c0dc21bb3bf17af80d5 (diff)
downloadhutch-31cbca674957eea7ae2529012e20a9d95158e561.tar.gz
hutch-31cbca674957eea7ae2529012e20a9d95158e561.tar.bz2
hutch-31cbca674957eea7ae2529012e20a9d95158e561.zip
feat: add ticket saved filters and label filtering
Implements: https://todo.sr.ht/~ccleberg/hutch/32 Implements: https://todo.sr.ht/~ccleberg/hutch/33
Diffstat (limited to 'HutchTests/TicketSavedFilterStoreTests.swift')
-rw-r--r--HutchTests/TicketSavedFilterStoreTests.swift88
1 files changed, 88 insertions, 0 deletions
diff --git a/HutchTests/TicketSavedFilterStoreTests.swift b/HutchTests/TicketSavedFilterStoreTests.swift
new file mode 100644
index 0000000..2ff64e6
--- /dev/null
+++ b/HutchTests/TicketSavedFilterStoreTests.swift
@@ -0,0 +1,88 @@
+import Foundation
+import Testing
+@testable import Hutch
+
+struct TicketSavedFilterStoreTests {
+
+ @Test
+ func storesCurrentFilterStatePerTracker() {
+ let suiteName = "TicketSavedFilterStoreTests-\(#function)-\(UUID().uuidString)"
+ let defaults = UserDefaults(suiteName: suiteName)!
+ defer { defaults.removePersistentDomain(forName: suiteName) }
+
+ TicketSavedFilterStore.saveCurrentState(
+ TicketListFilterState(status: .all, labelIDs: [4, 1]),
+ for: "tracker-a",
+ defaults: defaults
+ )
+ TicketSavedFilterStore.saveCurrentState(
+ TicketListFilterState(status: .resolved, labelIDs: [9]),
+ for: "tracker-b",
+ defaults: defaults
+ )
+
+ #expect(
+ TicketSavedFilterStore.loadCurrentState(for: "tracker-a", defaults: defaults) ==
+ TicketListFilterState(status: .all, labelIDs: [1, 4])
+ )
+ #expect(
+ TicketSavedFilterStore.loadCurrentState(for: "tracker-b", defaults: defaults) ==
+ TicketListFilterState(status: .resolved, labelIDs: [9])
+ )
+ }
+
+ @Test
+ func savesNamedFiltersPerTrackerAndReplacesDuplicateNames() {
+ let suiteName = "TicketSavedFilterStoreTests-\(#function)-\(UUID().uuidString)"
+ let defaults = UserDefaults(suiteName: suiteName)!
+ defer { defaults.removePersistentDomain(forName: suiteName) }
+
+ _ = TicketSavedFilterStore.saveFilter(
+ named: "Bugs",
+ state: TicketListFilterState(status: .open, labelIDs: [1]),
+ for: "tracker-a",
+ defaults: defaults,
+ now: Date(timeIntervalSince1970: 100)
+ )
+ _ = TicketSavedFilterStore.saveFilter(
+ named: "bugs",
+ state: TicketListFilterState(status: .resolved, labelIDs: [2]),
+ for: "tracker-a",
+ defaults: defaults,
+ now: Date(timeIntervalSince1970: 200)
+ )
+ _ = TicketSavedFilterStore.saveFilter(
+ named: "Needs Info",
+ state: TicketListFilterState(status: .all, labelIDs: [3]),
+ for: "tracker-b",
+ defaults: defaults,
+ now: Date(timeIntervalSince1970: 300)
+ )
+
+ let trackerAFilters = TicketSavedFilterStore.loadSavedFilters(for: "tracker-a", defaults: defaults)
+ let trackerBFilters = TicketSavedFilterStore.loadSavedFilters(for: "tracker-b", defaults: defaults)
+
+ #expect(trackerAFilters.count == 1)
+ #expect(trackerAFilters.first?.name == "bugs")
+ #expect(trackerAFilters.first?.state == TicketListFilterState(status: .resolved, labelIDs: [2]))
+ #expect(trackerBFilters.map(\.name) == ["Needs Info"])
+ }
+
+ @Test
+ func deletesSavedFilter() {
+ let suiteName = "TicketSavedFilterStoreTests-\(#function)-\(UUID().uuidString)"
+ let defaults = UserDefaults(suiteName: suiteName)!
+ defer { defaults.removePersistentDomain(forName: suiteName) }
+
+ let savedFilter = TicketSavedFilterStore.saveFilter(
+ named: "Bugs",
+ state: TicketListFilterState(status: .open, labelIDs: [1]),
+ for: "tracker-a",
+ defaults: defaults
+ )
+
+ TicketSavedFilterStore.deleteFilter(id: savedFilter!.id, for: "tracker-a", defaults: defaults)
+
+ #expect(TicketSavedFilterStore.loadSavedFilters(for: "tracker-a", defaults: defaults).isEmpty)
+ }
+}