krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
v3.0.4: 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}