summaryrefslogtreecommitdiff
path: root/HutchTests/RepositorySettingsViewModelTests.swift
blob: 5b0653905ce310553b4538ac94089e8589561bf3 (plain) (blame)
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) }
        )
    }
}