summaryrefslogtreecommitdiff
path: root/HutchTests
diff options
context:
space:
mode:
Diffstat (limited to 'HutchTests')
-rw-r--r--HutchTests/TicketBulkActionTests.swift35
-rw-r--r--HutchTests/TicketListViewModelTests.swift38
2 files changed, 73 insertions, 0 deletions
diff --git a/HutchTests/TicketBulkActionTests.swift b/HutchTests/TicketBulkActionTests.swift
new file mode 100644
index 0000000..2f4d1fd
--- /dev/null
+++ b/HutchTests/TicketBulkActionTests.swift
@@ -0,0 +1,35 @@
+import Testing
+@testable import Hutch
+
+struct TicketBulkActionTests {
+
+ @Test
+ func bulkActionResultFormatsSuccessMessage() {
+ let result = TicketBulkActionResult(
+ action: .close,
+ totalCount: 3,
+ updatedCount: 3,
+ unchangedCount: 0,
+ failures: []
+ )
+
+ #expect(result.title == "Close Complete")
+ #expect(result.message == "Closed 3 tickets.")
+ }
+
+ @Test
+ func bulkActionResultFormatsPartialFailureMessage() {
+ let result = TicketBulkActionResult(
+ action: .assign,
+ totalCount: 4,
+ updatedCount: 2,
+ unchangedCount: 1,
+ failures: [
+ TicketBulkActionFailure(ticketID: 42, message: "Network error")
+ ]
+ )
+
+ #expect(result.title == "Assign Partially Applied")
+ #expect(result.message == "Assigned 2 tickets. 1 already assigned. Failed: #42.")
+ }
+}
diff --git a/HutchTests/TicketListViewModelTests.swift b/HutchTests/TicketListViewModelTests.swift
index 0f42bf8..a237071 100644
--- a/HutchTests/TicketListViewModelTests.swift
+++ b/HutchTests/TicketListViewModelTests.swift
@@ -2,6 +2,7 @@ import Foundation
import Testing
@testable import Hutch
+@MainActor
struct TicketListViewModelTests {
@Test
@@ -82,6 +83,43 @@ struct TicketListViewModelTests {
}
@Test
+ func synchronizeTicketsReplacesEditedLabelsAndRemovesDeletedOnes() {
+ let existing = [
+ makeTicket(
+ id: 7,
+ title: "Triage me",
+ status: .reported,
+ submitter: "~owner",
+ labels: [
+ makeLabel(id: 1, name: "bug"),
+ makeLabel(id: 2, name: "stale")
+ ]
+ )
+ ]
+
+ let updated = TicketListViewModel.synchronizeTickets(
+ existing,
+ with: [makeLabel(id: 1, name: "bugfix")]
+ )
+
+ #expect(updated.first?.labels.map(\.id) == [1])
+ #expect(updated.first?.labels.first?.name == "bugfix")
+ }
+
+ @Test
+ func reconciledSelectedLabelIDsRemovesUnknownIDs() {
+ let reconciled = TicketListViewModel.reconciledSelectedLabelIDs(
+ [1, 2, 5],
+ availableLabels: [
+ makeLabel(id: 2, name: "triage"),
+ makeLabel(id: 3, name: "qa")
+ ]
+ )
+
+ #expect(reconciled == [2])
+ }
+
+ @Test
@MainActor
func resolveTicketInputHasCorrectStatusAndDefaultResolution() {
let input: [String: any Sendable] = [