krz/hutch

an ios client for sourcehut

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

v3.1.3: HutchTests/SystemStatusWidgetSnapshotTests.swift · raw

  1import Foundation
  2import Testing
  3@testable import Hutch
  4
  5@MainActor
  6struct SystemStatusWidgetSnapshotTests {
  7
  8    @Test
  9    func saveAndLoadRoundTrips() {
 10        let defaultsName = "SystemStatusWidgetSnapshotTests-\(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                .init(id: "builds", name: "builds.sr.ht", status: "Degraded", requiresAttention: true),
 18            ],
 19            hasDisruption: true,
 20            overallStatusText: "Experiencing disruptions",
 21            bannerSummary: "builds.sr.ht disrupted",
 22            updatedAt: Date(timeIntervalSince1970: 1000)
 23        )
 24
 25        SystemStatusWidgetSnapshotStore.save(snapshot, defaults: defaults)
 26        let loaded = SystemStatusWidgetSnapshotStore.load(defaults: defaults)
 27
 28        #expect(loaded != nil)
 29        #expect(loaded?.services.count == 2)
 30        #expect(loaded?.hasDisruption == true)
 31        #expect(loaded?.bannerSummary == "builds.sr.ht disrupted")
 32        #expect(loaded?.services[0].name == "git.sr.ht")
 33        #expect(loaded?.services[1].requiresAttention == true)
 34    }
 35
 36    @Test
 37    func loadReturnsNilWhenEmpty() {
 38        let defaultsName = "SystemStatusWidgetSnapshotTests-empty-\(UUID().uuidString)"
 39        let defaults = UserDefaults(suiteName: defaultsName)!
 40        defer { defaults.removePersistentDomain(forName: defaultsName) }
 41
 42        let loaded = SystemStatusWidgetSnapshotStore.load(defaults: defaults)
 43        #expect(loaded == nil)
 44    }
 45
 46    @Test
 47    func clearRemovesSnapshot() {
 48        let defaultsName = "SystemStatusWidgetSnapshotTests-clear-\(UUID().uuidString)"
 49        let defaults = UserDefaults(suiteName: defaultsName)!
 50        defer { defaults.removePersistentDomain(forName: defaultsName) }
 51
 52        let snapshot = SystemStatusWidgetSnapshot(
 53            services: [.init(id: "meta", name: "meta.sr.ht", status: "Operational", requiresAttention: false)],
 54            hasDisruption: false,
 55            overallStatusText: "All monitored services operational",
 56            bannerSummary: "",
 57            updatedAt: .now
 58        )
 59
 60        SystemStatusWidgetSnapshotStore.save(snapshot, defaults: defaults)
 61        #expect(SystemStatusWidgetSnapshotStore.load(defaults: defaults) != nil)
 62
 63        SystemStatusWidgetSnapshotStore.clear(defaults: defaults)
 64        #expect(SystemStatusWidgetSnapshotStore.load(defaults: defaults) == nil)
 65    }
 66
 67    @Test
 68    func snapshotsAreIsolatedPerAccount() {
 69        let defaultsName = "SystemStatusWidgetSnapshotTests-isolation-\(UUID().uuidString)"
 70        let defaults = UserDefaults(suiteName: defaultsName)!
 71        defer { defaults.removePersistentDomain(forName: defaultsName) }
 72
 73        let firstSnapshot = SystemStatusWidgetSnapshot(
 74            services: [.init(id: "git", name: "git.sr.ht", status: "Operational", requiresAttention: false)],
 75            hasDisruption: false,
 76            overallStatusText: "All monitored services operational",
 77            bannerSummary: "",
 78            updatedAt: Date(timeIntervalSince1970: 100)
 79        )
 80        let secondSnapshot = SystemStatusWidgetSnapshot(
 81            services: [.init(id: "builds", name: "builds.sr.ht", status: "Degraded", requiresAttention: true)],
 82            hasDisruption: true,
 83            overallStatusText: "Experiencing disruptions",
 84            bannerSummary: "builds.sr.ht disrupted",
 85            updatedAt: Date(timeIntervalSince1970: 200)
 86        )
 87
 88        SystemStatusWidgetSnapshotStore.save(firstSnapshot, accountID: "account-a", defaults: defaults)
 89        SystemStatusWidgetSnapshotStore.save(secondSnapshot, accountID: "account-b", defaults: defaults)
 90
 91        #expect(SystemStatusWidgetSnapshotStore.load(accountID: "account-a", defaults: defaults)?.services.first?.name == "git.sr.ht")
 92        #expect(SystemStatusWidgetSnapshotStore.load(accountID: "account-b", defaults: defaults)?.services.first?.name == "builds.sr.ht")
 93
 94        ActiveAccountContextStore.save("account-b", defaults: defaults)
 95        #expect(SystemStatusWidgetSnapshotStore.load(defaults: defaults)?.bannerSummary == "builds.sr.ht disrupted")
 96    }
 97
 98    @Test
 99    func unavailableSnapshotHasEmptyServices() {
100        let snapshot = SystemStatusWidgetSnapshot.unavailable
101        #expect(snapshot.services.isEmpty)
102        #expect(snapshot.hasDisruption == false)
103    }
104}