krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
v2.6.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 func gitCanonicalEntityAddsMissingTilde() {
37 #expect(RepositorySettingsViewModel.gitCanonicalEntity(from: "alice") == "~alice")
38 #expect(RepositorySettingsViewModel.gitCanonicalEntity(from: "~alice") == "~alice")
39 #expect(RepositorySettingsViewModel.gitCanonicalEntity(from: " alice ") == "~alice")
40 }
41
42 @Test
43 func gitHeadReferenceUsesFullBranchRef() {
44 #expect(RepositorySettingsViewModel.gitHeadReference(from: "main") == "refs/heads/main")
45 #expect(RepositorySettingsViewModel.gitHeadReference(from: " refs/heads/dev ") == "refs/heads/dev")
46 }
47
48 @Test
49 @MainActor
50 func unchangedHeadIsOmittedFromSaveInput() {
51 let viewModel = RepositorySettingsViewModel(
52 repository: makeRepository(headName: "refs/heads/main"),
53 branches: [Reference(name: "refs/heads/main", target: nil)],
54 client: SRHTClient(token: "test-token")
55 )
56
57 #expect(viewModel.selectedHeadReferenceForSave() == nil)
58 }
59
60 @Test
61 @MainActor
62 func changedHeadUsesSelectedBranchReference() {
63 let viewModel = RepositorySettingsViewModel(
64 repository: makeRepository(headName: "refs/heads/main"),
65 branches: [
66 Reference(name: "refs/heads/main", target: nil),
67 Reference(name: "refs/heads/dev", target: nil)
68 ],
69 client: SRHTClient(token: "test-token")
70 )
71 viewModel.editedHead = "dev"
72
73 #expect(viewModel.selectedHeadReferenceForSave() == "refs/heads/dev")
74 }
75
76 @Test
77 @MainActor
78 func bareRepositoryOmitsHeadWhenNoBranchExists() {
79 let viewModel = RepositorySettingsViewModel(
80 repository: makeRepository(headName: nil),
81 branches: [],
82 client: SRHTClient(token: "test-token")
83 )
84
85 #expect(viewModel.selectedHeadReferenceForSave() == nil)
86 viewModel.editedHead = "main"
87 #expect(viewModel.selectedHeadReferenceForSave() == nil)
88 }
89
90 @MainActor
91 private func makeRepository(headName: String?) -> RepositorySummary {
92 RepositorySummary(
93 id: 1,
94 rid: "rid-1",
95 service: .git,
96 name: "repo",
97 description: "desc",
98 visibility: .public,
99 updated: .now,
100 owner: Entity(canonicalName: "~owner"),
101 head: headName.map { Reference(name: $0, target: nil) }
102 )
103 }
104}