krz/hutch

an ios client for sourcehut

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

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