krz/hutch

an ios client for sourcehut

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

main: HutchTests/TicketDetailViewModelTests.swift · raw

  1import Foundation
  2import Testing
  3@testable import Hutch
  4
  5@MainActor
  6struct TicketDetailViewModelTests {
  7
  8    @Test
  9    @MainActor
 10    func reopenStatusInputOmitsResolution() {
 11        let input = TicketDetailViewModel.statusUpdateInput(
 12            status: .reported,
 13            resolution: .unresolved
 14        )
 15
 16        #expect(input["status"] as? String == TicketStatus.reported.rawValue)
 17        #expect(input["resolution"] == nil)
 18    }
 19
 20    @Test
 21    @MainActor
 22    func resolveStatusInputIncludesResolution() {
 23        let input = TicketDetailViewModel.statusUpdateInput(
 24            status: .resolved,
 25            resolution: .fixed
 26        )
 27
 28        #expect(input["status"] as? String == TicketStatus.resolved.rawValue)
 29        #expect(input["resolution"] as? String == TicketResolution.fixed.rawValue)
 30    }
 31
 32    @Test
 33    @MainActor
 34    func ticketUpdateInputOmitsUnchangedFields() {
 35        let input = TicketDetailViewModel.ticketUpdateInput(
 36            subject: "Same subject",
 37            body: "Same body",
 38            currentSubject: "Same subject",
 39            currentBody: "Same body"
 40        )
 41
 42        #expect(input.isEmpty)
 43    }
 44
 45    @Test
 46    @MainActor
 47    func ticketUpdateInputCarriesOnlyTheChangedField() {
 48        let input = TicketDetailViewModel.ticketUpdateInput(
 49            subject: "New subject",
 50            body: "Same body",
 51            currentSubject: "Old subject",
 52            currentBody: "Same body"
 53        )
 54
 55        #expect(input["subject"] as? String == "New subject")
 56        #expect(!input.keys.contains("body"))
 57    }
 58
 59    @Test
 60    @MainActor
 61    func ticketUpdateInputTrimsWhitespaceBeforeComparing() {
 62        let input = TicketDetailViewModel.ticketUpdateInput(
 63            subject: "  Same subject  ",
 64            body: "\n Same body \n",
 65            currentSubject: "Same subject",
 66            currentBody: "Same body"
 67        )
 68
 69        #expect(input.isEmpty)
 70    }
 71
 72    @Test
 73    @MainActor
 74    func ticketUpdateInputUsesNilToClearBody() {
 75        let input = TicketDetailViewModel.ticketUpdateInput(
 76            subject: "Same subject",
 77            body: "   ",
 78            currentSubject: "Same subject",
 79            currentBody: "Existing body"
 80        )
 81
 82        // The key must survive with a nil value so it encodes as a JSON null and
 83        // actually clears the body, rather than being dropped from the mutation.
 84        #expect(input.keys.contains("body"))
 85        #expect(input["body"] as? String == nil)
 86    }
 87
 88    @Test
 89    @MainActor
 90    func ticketUpdateInputTreatsNilBodyAsEmpty() {
 91        let input = TicketDetailViewModel.ticketUpdateInput(
 92            subject: "Same subject",
 93            body: "",
 94            currentSubject: "Same subject",
 95            currentBody: nil
 96        )
 97
 98        #expect(input.isEmpty)
 99    }
100}