krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

remove-splash-highlighter: HutchTests/TicketSavedFilterStoreTests.swift · raw

 1import Foundation
 2import Testing
 3@testable import Hutch
 4
 5struct TicketSavedFilterStoreTests {
 6
 7    @Test
 8    func storesCurrentFilterStatePerTracker() {
 9        let suiteName = "TicketSavedFilterStoreTests-\(#function)-\(UUID().uuidString)"
10        let defaults = UserDefaults(suiteName: suiteName)!
11        defer { defaults.removePersistentDomain(forName: suiteName) }
12
13        TicketSavedFilterStore.saveCurrentState(
14            TicketListFilterState(status: .all, labelIDs: [4, 1]),
15            for: "tracker-a",
16            defaults: defaults
17        )
18        TicketSavedFilterStore.saveCurrentState(
19            TicketListFilterState(status: .resolved, labelIDs: [9]),
20            for: "tracker-b",
21            defaults: defaults
22        )
23
24        #expect(
25            TicketSavedFilterStore.loadCurrentState(for: "tracker-a", defaults: defaults) ==
26            TicketListFilterState(status: .all, labelIDs: [1, 4])
27        )
28        #expect(
29            TicketSavedFilterStore.loadCurrentState(for: "tracker-b", defaults: defaults) ==
30            TicketListFilterState(status: .resolved, labelIDs: [9])
31        )
32    }
33
34    @Test
35    func savesNamedFiltersPerTrackerAndReplacesDuplicateNames() {
36        let suiteName = "TicketSavedFilterStoreTests-\(#function)-\(UUID().uuidString)"
37        let defaults = UserDefaults(suiteName: suiteName)!
38        defer { defaults.removePersistentDomain(forName: suiteName) }
39
40        _ = TicketSavedFilterStore.saveFilter(
41            named: "Bugs",
42            state: TicketListFilterState(status: .open, labelIDs: [1]),
43            for: "tracker-a",
44            defaults: defaults,
45            now: Date(timeIntervalSince1970: 100)
46        )
47        _ = TicketSavedFilterStore.saveFilter(
48            named: "bugs",
49            state: TicketListFilterState(status: .resolved, labelIDs: [2]),
50            for: "tracker-a",
51            defaults: defaults,
52            now: Date(timeIntervalSince1970: 200)
53        )
54        _ = TicketSavedFilterStore.saveFilter(
55            named: "Needs Info",
56            state: TicketListFilterState(status: .all, labelIDs: [3]),
57            for: "tracker-b",
58            defaults: defaults,
59            now: Date(timeIntervalSince1970: 300)
60        )
61
62        let trackerAFilters = TicketSavedFilterStore.loadSavedFilters(for: "tracker-a", defaults: defaults)
63        let trackerBFilters = TicketSavedFilterStore.loadSavedFilters(for: "tracker-b", defaults: defaults)
64
65        #expect(trackerAFilters.count == 1)
66        #expect(trackerAFilters.first?.name == "bugs")
67        #expect(trackerAFilters.first?.state == TicketListFilterState(status: .resolved, labelIDs: [2]))
68        #expect(trackerBFilters.map(\.name) == ["Needs Info"])
69    }
70
71    @Test
72    func deletesSavedFilter() {
73        let suiteName = "TicketSavedFilterStoreTests-\(#function)-\(UUID().uuidString)"
74        let defaults = UserDefaults(suiteName: suiteName)!
75        defer { defaults.removePersistentDomain(forName: suiteName) }
76
77        let savedFilter = TicketSavedFilterStore.saveFilter(
78            named: "Bugs",
79            state: TicketListFilterState(status: .open, labelIDs: [1]),
80            for: "tracker-a",
81            defaults: defaults
82        )
83
84        TicketSavedFilterStore.deleteFilter(id: savedFilter!.id, for: "tracker-a", defaults: defaults)
85
86        #expect(TicketSavedFilterStore.loadSavedFilters(for: "tracker-a", defaults: defaults).isEmpty)
87    }
88}