diff options
| author | Christian Cleberg <[email protected]> | 2026-03-18 22:56:34 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-03-18 22:56:34 -0500 |
| commit | ffc0ef0988b5e7d01951c23af85a1cf026b3da9f (patch) | |
| tree | 868cef24e91ddaa5e7d5e39362d97ec6a94107c9 /HutchTests | |
| parent | ed48e72520c51e4635cd3840dbc569bdd74c950f (diff) | |
| download | hutch-ffc0ef0988b5e7d01951c23af85a1cf026b3da9f.tar.gz hutch-ffc0ef0988b5e7d01951c23af85a1cf026b3da9f.tar.bz2 hutch-ffc0ef0988b5e7d01951c23af85a1cf026b3da9f.zip | |
add Home dashboard and repository build status indicators
Diffstat (limited to 'HutchTests')
| -rw-r--r-- | HutchTests/HomeViewModelTests.swift | 67 | ||||
| -rw-r--r-- | HutchTests/RepositoryListViewModelTests.swift | 26 |
2 files changed, 93 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 + ) + } +} diff --git a/HutchTests/RepositoryListViewModelTests.swift b/HutchTests/RepositoryListViewModelTests.swift index d6e76bf..7bd9126 100644 --- a/HutchTests/RepositoryListViewModelTests.swift +++ b/HutchTests/RepositoryListViewModelTests.swift @@ -28,6 +28,32 @@ struct RepositoryListViewModelTests { #expect(descriptionMatches.map(\.id) == [2]) } + @Test + func buildStatusKeysParsesSourceHutRepositoryURLsFromManifest() { + let manifest = """ + image: alpine/latest + sources: + - https://git.sr.ht/~owner/hutch + - ssh://[email protected]/~owner/wiki + tasks: + - echo "build" + """ + + let keys = RepositoryListViewModel.buildStatusKeys(in: manifest) + + #expect(keys.contains("git|~owner|hutch")) + #expect(keys.contains("hg|~owner|wiki")) + } + + @Test + func repositoryBuildStatusMapsJobStatesToRowStates() { + #expect(RepositoryListViewModel.repositoryBuildStatus(for: .success) == .success) + #expect(RepositoryListViewModel.repositoryBuildStatus(for: .running) == .running) + #expect(RepositoryListViewModel.repositoryBuildStatus(for: .queued) == .running) + #expect(RepositoryListViewModel.repositoryBuildStatus(for: .failed) == .failed) + #expect(RepositoryListViewModel.repositoryBuildStatus(for: .timeout) == .failed) + } + @MainActor private func makeRepository( id: Int, |
