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}