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}