krz/hutch

an ios client for sourcehut

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

main: HutchTests/TicketSavedFilterStoreTests.swift · raw

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