summaryrefslogtreecommitdiff
path: root/HutchTests/HomeViewModelTests.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-03-18 22:56:34 -0500
committerChristian Cleberg <[email protected]>2026-03-18 22:56:34 -0500
commitffc0ef0988b5e7d01951c23af85a1cf026b3da9f (patch)
tree868cef24e91ddaa5e7d5e39362d97ec6a94107c9 /HutchTests/HomeViewModelTests.swift
parented48e72520c51e4635cd3840dbc569bdd74c950f (diff)
downloadhutch-ffc0ef0988b5e7d01951c23af85a1cf026b3da9f.tar.gz
hutch-ffc0ef0988b5e7d01951c23af85a1cf026b3da9f.tar.bz2
hutch-ffc0ef0988b5e7d01951c23af85a1cf026b3da9f.zip
add Home dashboard and repository build status indicators
Diffstat (limited to 'HutchTests/HomeViewModelTests.swift')
-rw-r--r--HutchTests/HomeViewModelTests.swift67
1 files changed, 67 insertions, 0 deletions
diff --git a/HutchTests/HomeViewModelTests.swift b/HutchTests/HomeViewModelTests.swift
new file mode 100644
index 0000000..5475bdd
--- /dev/null
+++ b/HutchTests/HomeViewModelTests.swift
@@ -0,0 +1,67 @@
+import Foundation
+import Testing
+@testable import Hutch
+
+struct HomeViewModelTests {
+
+ @Test
+ func failedBuildsKeepsOnlyFailedAndTimedOutJobs() {
+ let jobs = [
+ makeJob(id: 1, status: .success, created: Date(timeIntervalSince1970: 10)),
+ makeJob(id: 2, status: .failed, created: Date(timeIntervalSince1970: 20)),
+ makeJob(id: 3, status: .timeout, created: Date(timeIntervalSince1970: 30)),
+ makeJob(id: 4, status: .running, created: Date(timeIntervalSince1970: 40))
+ ]
+
+ let failedBuilds = HomeViewModel.failedBuilds(from: jobs)
+
+ #expect(failedBuilds.map(\.job.id) == [2, 3])
+ }
+
+ @Test
+ func matchesCurrentUserAssigneeNormalizesCanonicalNameAndUsername() {
+ let currentUser = User(
+ id: 42,
+ username: "owner",
+ canonicalName: "~owner",
+ email: "[email protected]",
+ avatar: nil
+ )
+
+ #expect(HomeViewModel.matchesCurrentUserAssignee(Entity(canonicalName: "~owner"), currentUser: currentUser))
+ #expect(HomeViewModel.matchesCurrentUserAssignee(Entity(canonicalName: "owner"), currentUser: currentUser))
+ #expect(HomeViewModel.matchesCurrentUserAssignee(Entity(canonicalName: currentUser.username), currentUser: currentUser))
+ #expect(HomeViewModel.matchesCurrentUserAssignee(Entity(canonicalName: "~someone-else"), currentUser: currentUser) == false)
+ }
+
+ @Test
+ func primaryRepositoryReferenceParsesManifestSourceURL() {
+ let manifest = """
+ image: alpine/latest
+ sources:
+ - https://git.sr.ht/~owner/hutch
+ tasks:
+ - true
+ """
+
+ let repository = HomeViewModel.primaryRepositoryReference(in: manifest)
+
+ #expect(repository?.ownerCanonicalName == "~owner")
+ #expect(repository?.name == "hutch")
+ }
+
+ private func makeJob(id: Int, status: JobStatus, created: Date) -> HomeJobPayload {
+ HomeJobPayload(
+ id: id,
+ created: created,
+ updated: created,
+ status: status,
+ note: nil,
+ tags: [],
+ visibility: nil,
+ image: nil,
+ tasks: [],
+ manifest: nil
+ )
+ }
+}