krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

v2.15.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}