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