krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
v2.14.0: HutchTests/RepositorySettingsViewModelTests.swift · raw
1import Foundation
2import Testing
3@testable import Hutch
4
5private struct UpdateRepositoryInfoEnvelope: Decodable {
6 let updateRepository: UpdateRepositoryInfoPayload
7}
8
9private struct UpdateRepositoryInfoPayload: Decodable {
10 let id: Int
11}
12
13struct RepositorySettingsViewModelTests {
14
15 @Test
16 func saveInfoResponseDecodesMinimalRepositoryPayload() throws {
17 let json = """
18 {
19 "data": {
20 "updateRepository": {
21 "id": 42
22 }
23 }
24 }
25 """
26
27 let decoded = try JSONDecoder().decode(
28 GraphQLResponse<UpdateRepositoryInfoEnvelope>.self,
29 from: Data(json.utf8)
30 )
31
32 #expect(decoded.data?.updateRepository.id == 42)
33 }
34
35 @Test
36 @MainActor
37 func gitCanonicalEntityAddsMissingTilde() {
38 #expect(RepositorySettingsViewModel.gitCanonicalEntity(from: "alice") == "~alice")
39 #expect(RepositorySettingsViewModel.gitCanonicalEntity(from: "~alice") == "~alice")
40 #expect(RepositorySettingsViewModel.gitCanonicalEntity(from: " alice ") == "~alice")
41 }
42
43 @Test
44 @MainActor
45 func gitHeadReferenceUsesFullBranchRef() {
46 #expect(RepositorySettingsViewModel.gitHeadReference(from: "main") == "refs/heads/main")
47 #expect(RepositorySettingsViewModel.gitHeadReference(from: " refs/heads/dev ") == "refs/heads/dev")
48 }
49
50 @Test
51 @MainActor
52 func unchangedHeadIsOmittedFromSaveInput() {
53 let viewModel = RepositorySettingsViewModel(
54 repository: makeRepository(headName: "refs/heads/main"),
55 branches: [ReferenceDetail(name: "refs/heads/main", target: nil, date: nil)],
56 client: SRHTClient(token: "test-token")
57 )
58
59 #expect(viewModel.selectedHeadReferenceForSave() == nil)
60 }
61
62 @Test
63 @MainActor
64 func changedHeadUsesSelectedBranchReference() {
65 let viewModel = RepositorySettingsViewModel(
66 repository: makeRepository(headName: "refs/heads/main"),
67 branches: [
68 ReferenceDetail(name: "refs/heads/main", target: nil, date: nil),
69 ReferenceDetail(name: "refs/heads/dev", target: nil, date: nil)
70 ],
71 client: SRHTClient(token: "test-token")
72 )
73 viewModel.editedHead = "dev"
74
75 #expect(viewModel.selectedHeadReferenceForSave() == "refs/heads/dev")
76 }
77
78 @Test
79 @MainActor
80 func bareRepositoryOmitsHeadWhenNoBranchExists() {
81 let viewModel = RepositorySettingsViewModel(
82 repository: makeRepository(headName: nil),
83 branches: [],
84 client: SRHTClient(token: "test-token")
85 )
86
87 #expect(viewModel.selectedHeadReferenceForSave() == nil)
88 viewModel.editedHead = "main"
89 #expect(viewModel.selectedHeadReferenceForSave() == nil)
90 }
91
92 @MainActor
93 private func makeRepository(headName: String?) -> RepositorySummary {
94 RepositorySummary(
95 id: 1,
96 rid: "rid-1",
97 service: .git,
98 name: "repo",
99 description: "desc",
100 visibility: .public,
101 updated: .now,
102 owner: Entity(canonicalName: "~owner"),
103 head: headName.map { Reference(name: $0, target: nil) }
104 )
105 }
106}