krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
main: HutchTests/RepositoryListViewModelTests.swift · raw
1import Foundation
2import Testing
3@testable import Hutch
4
5@MainActor
6struct RepositoryListViewModelTests {
7
8 @Test
9 @MainActor
10 func searchIndexRefreshRequiresMinimumQueryLength() {
11 #expect(RepositoryListViewModel.shouldRefreshSearchIndex(for: "ab") == false)
12 #expect(RepositoryListViewModel.shouldRefreshSearchIndex(for: "abc") == true)
13 #expect(RepositoryListViewModel.shouldRefreshSearchIndex(for: " abc ") == true)
14 }
15
16 @Test
17 @MainActor
18 func filterRepositoriesMatchesNameAndDescriptionLocally() {
19 let repositories = [
20 makeRepository(id: 1, service: .git, name: "Hutch", description: "SourceHut client"),
21 makeRepository(id: 2, service: .hg, name: "Mail", description: "patch queue"),
22 makeRepository(id: 3, service: .git, name: "Tree", description: nil)
23 ]
24
25 let nameMatches = RepositoryListViewModel.filterRepositories(repositories, matching: "hut")
26 let descriptionMatches = RepositoryListViewModel.filterRepositories(repositories, matching: "patch")
27
28 #expect(nameMatches.map(\.id) == [1])
29 #expect(descriptionMatches.map(\.id) == [2])
30 }
31
32 @Test
33 @MainActor
34 func filterRepositoriesMatchesOwnerAndDefaultBranchLocally() {
35 let repositories = [
36 makeRepository(id: 1, service: .git, name: "Hutch", description: nil, owner: "~alice", branch: "main"),
37 makeRepository(id: 2, service: .hg, name: "Mail", description: nil, owner: "~bob", branch: "stable")
38 ]
39
40 let ownerMatches = RepositoryListViewModel.filterRepositories(repositories, matching: "~bob")
41 let branchMatches = RepositoryListViewModel.filterRepositories(repositories, matching: "main")
42
43 #expect(ownerMatches.map(\.id) == [2])
44 #expect(branchMatches.map(\.id) == [1])
45 }
46
47 @Test
48 func buildStatusKeysParsesSourceHutRepositoryURLsFromManifest() {
49 let manifest = """
50 image: alpine/latest
51 sources:
52 - https://git.sr.ht/~owner/hutch
53 - ssh://hg@hg.sr.ht/~owner/wiki
54 tasks:
55 - echo "build"
56 """
57
58 let keys = RepositoryListViewModel.buildStatusKeys(in: manifest)
59
60 #expect(keys.contains("git|~owner|hutch"))
61 #expect(keys.contains("hg|~owner|wiki"))
62 }
63
64 @Test
65 func repositoryBuildStatusMapsJobStatesToRowStates() {
66 #expect(RepositoryListViewModel.repositoryBuildStatus(for: .success) == .success)
67 #expect(RepositoryListViewModel.repositoryBuildStatus(for: .running) == .running)
68 #expect(RepositoryListViewModel.repositoryBuildStatus(for: .queued) == .running)
69 #expect(RepositoryListViewModel.repositoryBuildStatus(for: .failed) == .failed)
70 #expect(RepositoryListViewModel.repositoryBuildStatus(for: .timeout) == .failed)
71 }
72
73 @MainActor
74 private func makeRepository(
75 id: Int,
76 service: SRHTService,
77 name: String,
78 description: String?,
79 owner: String = "~owner",
80 branch: String = "main"
81 ) -> RepositorySummary {
82 RepositorySummary(
83 fields: .init(
84 id: id,
85 rid: "rid-\(id)",
86 service: service,
87 name: name,
88 description: description,
89 visibility: .publicVisibility,
90 updated: Date(timeIntervalSince1970: TimeInterval(id)),
91 owner: Entity(canonicalName: owner),
92 head: Reference(name: branch, target: nil)
93 )
94 )
95 }
96}