krz/hutch

an ios client for sourcehut

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

v3.0.0: HutchTests/BuildListViewModelTests.swift · raw

 1import Foundation
 2import Testing
 3@testable import Hutch
 4
 5struct BuildListViewModelTests {
 6
 7    @Test
 8    func filteredJobsReturnsAllWhenSearchTextIsEmpty() {
 9        let jobs = [makeJob(id: 1, tags: ["ci"]), makeJob(id: 2, tags: [])]
10        let filtered = filterJobs(jobs, query: "")
11
12        #expect(filtered.count == 2)
13    }
14
15    @Test
16    func filteredJobsMatchesByTag() {
17        let jobs = [makeJob(id: 1, tags: ["ci", "deploy"]), makeJob(id: 2, tags: ["lint"])]
18        let filtered = filterJobs(jobs, query: "deploy")
19
20        #expect(filtered.map(\.id) == [1])
21    }
22
23    @Test
24    func filteredJobsMatchesByJobId() {
25        let jobs = [makeJob(id: 42, tags: []), makeJob(id: 99, tags: [])]
26        let filtered = filterJobs(jobs, query: "42")
27
28        #expect(filtered.map(\.id) == [42])
29    }
30
31    @Test
32    func filteredJobsMatchesByStatus() {
33        let jobs = [
34            makeJob(id: 1, status: .running, tags: []),
35            makeJob(id: 2, status: .success, tags: [])
36        ]
37
38        let filtered = filterJobs(jobs, query: "running")
39
40        #expect(filtered.map(\.id) == [1])
41    }
42
43    @Test
44    func buildFilterPrioritizesActionableStates() {
45        let jobs = [
46            makeJob(id: 1, status: .success, tags: []),
47            makeJob(id: 2, status: .failed, tags: []),
48            makeJob(id: 3, status: .running, tags: []),
49            makeJob(id: 4, status: .cancelled, tags: [])
50        ]
51
52        let attention = BuildListViewModel.filterJobs(jobs, filter: .attention)
53        let active = BuildListViewModel.filterJobs(jobs, filter: .active)
54
55        #expect(attention.map(\.id) == [2, 3])
56        #expect(active.map(\.id) == [3])
57    }
58
59    private func filterJobs(_ jobs: [JobSummary], query: String) -> [JobSummary] {
60        BuildListViewModel.searchJobs(jobs, matching: query)
61    }
62
63    private func makeJob(id: Int, status: JobStatus = .success, tags: [String]) -> JobSummary {
64        JobSummary(
65            id: id,
66            created: Date(),
67            updated: Date(),
68            status: status,
69            note: nil,
70            tags: tags,
71            visibility: nil,
72            image: nil,
73            tasks: []
74        )
75    }
76}