krz/hutch

an ios client for sourcehut

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

main: HutchTests/ProjectPinStoreTests.swift · raw

 1import Foundation
 2import Testing
 3@testable import Hutch
 4
 5@MainActor
 6struct ProjectPinStoreTests {
 7    @Test
 8    func storesPinnedProjectsPerUser() {
 9        let defaults = UserDefaults(suiteName: #function)!
10        defaults.removePersistentDomain(forName: #function)
11
12        ProjectPinStore.togglePin(projectID: "project-1", for: "~alice", defaults: defaults)
13        ProjectPinStore.togglePin(projectID: "project-2", for: "~bob", defaults: defaults)
14
15        #expect(ProjectPinStore.loadPinnedProjectIDs(for: "~alice", defaults: defaults) == ["project-1"])
16        #expect(ProjectPinStore.loadPinnedProjectIDs(for: "~bob", defaults: defaults) == ["project-2"])
17    }
18
19    @Test
20    func toggleRemovesExistingPin() {
21        let defaults = UserDefaults(suiteName: #function)!
22        defaults.removePersistentDomain(forName: #function)
23
24        ProjectPinStore.togglePin(projectID: "project-1", for: "~alice", defaults: defaults)
25        ProjectPinStore.togglePin(projectID: "project-1", for: "~alice", defaults: defaults)
26
27        #expect(ProjectPinStore.loadPinnedProjectIDs(for: "~alice", defaults: defaults).isEmpty)
28    }
29
30    @Test
31    func loadPinnedProjectsNormalizesWhitespaceAndDuplicates() throws {
32        let defaults = UserDefaults(suiteName: #function)!
33        defaults.removePersistentDomain(forName: #function)
34
35        let encoded = try JSONEncoder().encode([
36            "~alice": [" project-1 ", "", "project-1", "project-2"]
37        ])
38        defaults.set(encoded, forKey: AppStorageKeys.pinnedHomeProjects)
39
40        #expect(ProjectPinStore.loadPinnedProjectIDs(for: "~alice", defaults: defaults) == ["project-1", "project-2"])
41    }
42}