krz/hutch

an ios client for sourcehut

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

v3.8.2: 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}