krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
v2.4.1: 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 private func filterJobs(_ jobs: [JobSummary], query: String) -> [JobSummary] {
32 let q = query.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
33 guard !q.isEmpty else { return jobs }
34 return jobs.filter {
35 String($0.id).contains(q) ||
36 $0.tags.contains { $0.lowercased().contains(q) } ||
37 ($0.note?.lowercased().contains(q) == true) ||
38 ($0.image?.lowercased().contains(q) == true)
39 }
40 }
41
42 private func makeJob(id: Int, tags: [String]) -> JobSummary {
43 JobSummary(
44 id: id,
45 created: Date(),
46 updated: Date(),
47 status: .success,
48 note: nil,
49 tags: tags,
50 visibility: nil,
51 image: nil,
52 tasks: []
53 )
54 }
55}