krz/hutch

an ios client for sourcehut

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

v3.1.7: HutchTests/TrackerListViewModelTests.swift · raw

 1import Foundation
 2import Testing
 3@testable import Hutch
 4
 5struct TrackerListViewModelTests {
 6
 7    @Test
 8    @MainActor
 9    func graphQLErrorDescriptionIsPreservedForTrackerCreationFailures() {
10        let error = SRHTError.graphQLErrors([
11            GraphQLError(message: "A tracker named bugs already exists", locations: nil)
12        ])
13
14        #expect(error.localizedDescription == "GraphQL error: A tracker named bugs already exists")
15    }
16
17    @Test
18    func filteredTrackersReturnsAllWhenSearchTextIsEmpty() {
19        let trackers = [
20            makeTracker(id: 1, name: "bugs", description: "Bug tracker", owner: "~owner"),
21            makeTracker(id: 2, name: "ideas", description: nil, owner: "~team")
22        ]
23
24        let filtered = filterTrackers(trackers, query: "")
25
26        #expect(filtered.count == 2)
27    }
28
29    @Test
30    func filteredTrackersMatchesDescription() {
31        let trackers = [
32            makeTracker(id: 1, name: "bugs", description: "Production incidents", owner: "~owner"),
33            makeTracker(id: 2, name: "ideas", description: "Feature requests", owner: "~team")
34        ]
35
36        let filtered = filterTrackers(trackers, query: "incident")
37
38        #expect(filtered.map(\.id) == [1])
39    }
40
41    @Test
42    func filteredTrackersMatchesOwner() {
43        let trackers = [
44            makeTracker(id: 1, name: "bugs", description: nil, owner: "~owner"),
45            makeTracker(id: 2, name: "ideas", description: nil, owner: "~team")
46        ]
47
48        let filtered = filterTrackers(trackers, query: "~team")
49
50        #expect(filtered.map(\.id) == [2])
51    }
52
53    private func filterTrackers(_ trackers: [TrackerSummary], query: String) -> [TrackerSummary] {
54        let q = query.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
55        guard !q.isEmpty else { return trackers }
56        return trackers.filter {
57            $0.name.lowercased().contains(q) ||
58            ($0.description?.lowercased().contains(q) == true) ||
59            $0.owner.canonicalName.lowercased().contains(q)
60        }
61    }
62
63    private func makeTracker(id: Int, name: String, description: String?, owner: String) -> TrackerSummary {
64        TrackerSummary(
65            id: id,
66            rid: "rid-\(id)",
67            name: name,
68            description: description,
69            visibility: .publicVisibility,
70            updated: Date(),
71            owner: Entity(canonicalName: owner)
72        )
73    }
74}