krz/hutch

an ios client for sourcehut

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

v2.13.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    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}