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