krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
v3.8.1: HutchTests/HutchIntentsTests.swift · raw
1import Foundation
2import Testing
3@testable import Hutch
4
5@MainActor
6struct HutchIntentsTests {
7
8 @Test
9 func navigationIntentsMapToCentralRoutes() {
10 #expect(OpenWorkQueueIntent().route == .workQueue(scope: .all))
11 #expect(OpenRecentActivityIntent().route == .recentActivity)
12 #expect(OpenSystemStatusIntent().route == .systemStatus)
13 #expect(OpenFailedBuildsIntent().route == .failedBuilds)
14 #expect(OpenAssignedTicketsIntent().route == .workQueue(scope: .assigned))
15 }
16
17 @Test
18 func checkSystemStatusReturnsOperationalWhenNoDisruption() async throws {
19 let defaultsName = "HutchIntentsTests-status-\(UUID().uuidString)"
20 let defaults = UserDefaults(suiteName: defaultsName)!
21 defer { defaults.removePersistentDomain(forName: defaultsName) }
22
23 let snapshot = SystemStatusWidgetSnapshot(
24 services: [
25 .init(id: "git", name: "git.sr.ht", status: "Operational", requiresAttention: false),
26 ],
27 hasDisruption: false,
28 overallStatusText: "All monitored services operational",
29 bannerSummary: "",
30 updatedAt: .now
31 )
32 SystemStatusWidgetSnapshotStore.save(snapshot, defaults: defaults)
33
34 let loaded = SystemStatusWidgetSnapshotStore.load(defaults: defaults)
35 #expect(loaded != nil)
36 #expect(loaded?.hasDisruption == false)
37 }
38
39 @Test
40 func checkSystemStatusReturnsDisruptionDetails() async throws {
41 let defaultsName = "HutchIntentsTests-disruption-\(UUID().uuidString)"
42 let defaults = UserDefaults(suiteName: defaultsName)!
43 defer { defaults.removePersistentDomain(forName: defaultsName) }
44
45 let snapshot = SystemStatusWidgetSnapshot(
46 services: [
47 .init(id: "git", name: "git.sr.ht", status: "Degraded", requiresAttention: true),
48 .init(id: "meta", name: "meta.sr.ht", status: "Operational", requiresAttention: false),
49 ],
50 hasDisruption: true,
51 overallStatusText: "Experiencing disruptions",
52 bannerSummary: "git.sr.ht disrupted",
53 updatedAt: .now
54 )
55 SystemStatusWidgetSnapshotStore.save(snapshot, defaults: defaults)
56
57 let loaded = SystemStatusWidgetSnapshotStore.load(defaults: defaults)
58 #expect(loaded?.hasDisruption == true)
59
60 let disrupted = loaded!.services.filter(\.requiresAttention)
61 #expect(disrupted.count == 1)
62 #expect(disrupted.first?.name == "git.sr.ht")
63 }
64
65 @Test
66 func needsAttentionSnapshotSupportsBuildsCheck() {
67 let defaultsName = "HutchIntentsTests-builds-\(UUID().uuidString)"
68 let defaults = UserDefaults(suiteName: defaultsName)!
69 defer { defaults.removePersistentDomain(forName: defaultsName) }
70
71 let snapshot = NeedsAttentionSnapshot(
72 unreadInboxThreads: 5,
73 assignedOpenTickets: 3,
74 failedBuilds: 2,
75 updatedAt: .now
76 )
77 NeedsAttentionSnapshotStore.save(snapshot, defaults: defaults)
78
79 let loaded = NeedsAttentionSnapshotStore.load(defaults: defaults)
80 #expect(loaded?.failedBuilds == 2)
81 #expect(loaded?.unreadInboxThreads == 5)
82 #expect(loaded?.assignedOpenTickets == 3)
83 }
84
85 @Test
86 func needsAttentionSnapshotsAreIsolatedPerAccount() {
87 let defaultsName = "HutchIntentsTests-builds-isolation-\(UUID().uuidString)"
88 let defaults = UserDefaults(suiteName: defaultsName)!
89 defer { defaults.removePersistentDomain(forName: defaultsName) }
90
91 let firstSnapshot = NeedsAttentionSnapshot(
92 unreadInboxThreads: 1,
93 assignedOpenTickets: 2,
94 failedBuilds: 3,
95 updatedAt: Date(timeIntervalSince1970: 100)
96 )
97 let secondSnapshot = NeedsAttentionSnapshot(
98 unreadInboxThreads: 8,
99 assignedOpenTickets: 5,
100 failedBuilds: 1,
101 updatedAt: Date(timeIntervalSince1970: 200)
102 )
103
104 NeedsAttentionSnapshotStore.save(firstSnapshot, accountID: "account-a", defaults: defaults)
105 NeedsAttentionSnapshotStore.save(secondSnapshot, accountID: "account-b", defaults: defaults)
106
107 #expect(NeedsAttentionSnapshotStore.load(accountID: "account-a", defaults: defaults)?.unreadInboxThreads == 1)
108 #expect(NeedsAttentionSnapshotStore.load(accountID: "account-b", defaults: defaults)?.unreadInboxThreads == 8)
109
110 ActiveAccountContextStore.save("account-a", defaults: defaults)
111 #expect(NeedsAttentionSnapshotStore.load(defaults: defaults)?.failedBuilds == 3)
112 }
113}