krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
v2.16.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 buildFilterPrioritizesActionableStates() {
33 let jobs = [
34 makeJob(id: 1, status: .success, tags: []),
35 makeJob(id: 2, status: .failed, tags: []),
36 makeJob(id: 3, status: .running, tags: []),
37 makeJob(id: 4, status: .cancelled, tags: [])
38 ]
39
40 let attention = BuildListViewModel.filterJobs(jobs, filter: .attention)
41 let active = BuildListViewModel.filterJobs(jobs, filter: .active)
42
43 #expect(attention.map(\.id) == [2, 3])
44 #expect(active.map(\.id) == [3])
45 }
46
47 private func filterJobs(_ jobs: [JobSummary], query: String) -> [JobSummary] {
48 let q = query.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
49 guard !q.isEmpty else { return jobs }
50 return jobs.filter {
51 String($0.id).contains(q) ||
52 $0.tags.contains { $0.lowercased().contains(q) } ||
53 ($0.note?.lowercased().contains(q) == true) ||
54 ($0.image?.lowercased().contains(q) == true)
55 }
56 }
57
58 private func makeJob(id: Int, status: JobStatus = .success, tags: [String]) -> JobSummary {
59 JobSummary(
60 id: id,
61 created: Date(),
62 updated: Date(),
63 status: status,
64 note: nil,
65 tags: tags,
66 visibility: nil,
67 image: nil,
68 tasks: []
69 )
70 }
71}