krz/hutch

an ios client for sourcehut

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

v2.3.1: 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}