krz/hutch

an ios client for sourcehut

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

v2.15.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    @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}