krz/hutch

an ios client for sourcehut

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

v3.7.0: HutchTests/TicketDetailViewModelTests.swift · raw

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