summaryrefslogtreecommitdiff
path: root/HutchTests/TrackerListViewModelTests.swift
blob: 5c57e0484648169eb908b8bc14a579d7c12a7f7a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import Foundation
import Testing
@testable import Hutch

struct TrackerListViewModelTests {

    @Test
    @MainActor
    func graphQLErrorDescriptionIsPreservedForTrackerCreationFailures() {
        let error = SRHTError.graphQLErrors([
            GraphQLError(message: "A tracker named bugs already exists", locations: nil)
        ])

        #expect(error.localizedDescription == "GraphQL error: A tracker named bugs already exists")
    }

    @Test
    func filteredTrackersReturnsAllWhenSearchTextIsEmpty() {
        let trackers = [
            makeTracker(id: 1, name: "bugs", description: "Bug tracker", owner: "~owner"),
            makeTracker(id: 2, name: "ideas", description: nil, owner: "~team")
        ]

        let filtered = filterTrackers(trackers, query: "")

        #expect(filtered.count == 2)
    }

    @Test
    func filteredTrackersMatchesDescription() {
        let trackers = [
            makeTracker(id: 1, name: "bugs", description: "Production incidents", owner: "~owner"),
            makeTracker(id: 2, name: "ideas", description: "Feature requests", owner: "~team")
        ]

        let filtered = filterTrackers(trackers, query: "incident")

        #expect(filtered.map(\.id) == [1])
    }

    @Test
    func filteredTrackersMatchesOwner() {
        let trackers = [
            makeTracker(id: 1, name: "bugs", description: nil, owner: "~owner"),
            makeTracker(id: 2, name: "ideas", description: nil, owner: "~team")
        ]

        let filtered = filterTrackers(trackers, query: "~team")

        #expect(filtered.map(\.id) == [2])
    }

    private func filterTrackers(_ trackers: [TrackerSummary], query: String) -> [TrackerSummary] {
        let q = query.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
        guard !q.isEmpty else { return trackers }
        return trackers.filter {
            $0.name.lowercased().contains(q) ||
            ($0.description?.lowercased().contains(q) == true) ||
            $0.owner.canonicalName.lowercased().contains(q)
        }
    }

    private func makeTracker(id: Int, name: String, description: String?, owner: String) -> TrackerSummary {
        TrackerSummary(
            id: id,
            rid: "rid-\(id)",
            name: name,
            description: description,
            visibility: .publicVisibility,
            updated: Date(),
            owner: Entity(canonicalName: owner)
        )
    }
}