From fe1ccc69661603d419a642a450e4ac9e1258adb0 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Mon, 13 Apr 2026 19:44:44 -0500 Subject: fix: centralize URLs, tighten models, and polish SwiftUI bindings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add shared HutchDeepLinkURL constants for app, widgets, and tests. - Bump marketing version to 3.1.2 and build to 70 (app + widget extension). - Point Hutch stats default base URL at HutchStatsAPI; add SRHTWebURL status incident feed and reuse it from SystemStatusService. - Group Project into Metadata and Resources; split ContributionStatsResponse into StatsWindow and StatsTotals with updated decoding and tests. - Replace @Bindable usage with explicit Bindings in Profile, Projects list, and repository ACL flows; simplify Home pinned-item helper; add no-op bodies on cancel alert buttons where the compiler requires a statement. - Move repository row build-status indicator next to the relative-updated caption and reserve a fixed 8×8 slot so the row does not jump when status loads. - Use NSString.lastPathComponent for build artifact filenames; collapse duplicate ACL error branches; minor HutchStats HTTP and XMLParserDelegate cleanups. - Point widgets at HutchDeepLinkURL helpers; align tests with the new response and URL types. --- HutchTests/SRHTWebURLTests.swift | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'HutchTests/SRHTWebURLTests.swift') diff --git a/HutchTests/SRHTWebURLTests.swift b/HutchTests/SRHTWebURLTests.swift index a183f00..c1f0dc0 100644 --- a/HutchTests/SRHTWebURLTests.swift +++ b/HutchTests/SRHTWebURLTests.swift @@ -3,6 +3,16 @@ import Testing @testable import Hutch struct SRHTWebURLTests { + private enum Expected { + static let chatOrigin = "https://chat.sr.ht" + static let statusOrigin = "https://status.sr.ht" + static let gitRepoHTTPS = "https://git.sr.ht/~ccleberg/hutch" + static let gitSSH = "git@git.sr.ht:~ccleberg/hutch" + static let tracker = "https://todo.sr.ht/~ccleberg/todo" + static let ticket = "https://todo.sr.ht/~ccleberg/todo/42" + static let buildJob = "https://builds.sr.ht/~ccleberg/job/12" + } + private let repository = RepositorySummary( id: 1, rid: "repo-1", @@ -26,21 +36,21 @@ struct SRHTWebURLTests { @Test func browserOnlyServiceURLsUseCanonicalHosts() { - #expect(SRHTWebURL.chat.absoluteString == "https://chat.sr.ht") - #expect(SRHTWebURL.status.absoluteString == "https://status.sr.ht") + #expect(SRHTWebURL.chat.absoluteString == Expected.chatOrigin) + #expect(SRHTWebURL.status.absoluteString == Expected.statusOrigin) } @Test func repositoryAndCloneURLsUseStableUserScopedPaths() { - #expect(SRHTWebURL.repository(repository)?.absoluteString == "https://git.sr.ht/~ccleberg/hutch") - #expect(SRHTWebURL.httpsCloneURL(repository) == "https://git.sr.ht/~ccleberg/hutch") - #expect(SRHTWebURL.sshCloneURL(repository) == "git@git.sr.ht:~ccleberg/hutch") + #expect(SRHTWebURL.repository(repository)?.absoluteString == Expected.gitRepoHTTPS) + #expect(SRHTWebURL.httpsCloneURL(repository) == Expected.gitRepoHTTPS) + #expect(SRHTWebURL.sshCloneURL(repository) == Expected.gitSSH) } @Test func trackerTicketAndBuildURLsUseStableUserScopedPaths() { - #expect(SRHTWebURL.tracker(tracker)?.absoluteString == "https://todo.sr.ht/~ccleberg/todo") - #expect(SRHTWebURL.ticket(ownerUsername: "ccleberg", trackerName: "todo", ticketId: 42)?.absoluteString == "https://todo.sr.ht/~ccleberg/todo/42") - #expect(SRHTWebURL.build(jobId: 12, ownerCanonicalName: "~ccleberg")?.absoluteString == "https://builds.sr.ht/~ccleberg/job/12") + #expect(SRHTWebURL.tracker(tracker)?.absoluteString == Expected.tracker) + #expect(SRHTWebURL.ticket(ownerUsername: "ccleberg", trackerName: "todo", ticketId: 42)?.absoluteString == Expected.ticket) + #expect(SRHTWebURL.build(jobId: 12, ownerCanonicalName: "~ccleberg")?.absoluteString == Expected.buildJob) } } -- cgit v1.2.3