summaryrefslogtreecommitdiff
path: root/HutchTests
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-05-14 12:41:55 -0500
committerChristian Cleberg <[email protected]>2026-05-14 12:41:55 -0500
commit0d61e05e98f6f020722ee4d43f024c1da348d2a9 (patch)
treeb388972b86cf83de380381c52c4390c3beafc69a /HutchTests
parentf28e5cee1643e3f99d7bf90476d1dcf9347229a0 (diff)
downloadhutch-3.4.0.tar.gz
hutch-3.4.0.tar.bz2
hutch-3.4.0.zip
feat: add Safari extension for sourcehut deep linksv3.4.0
Diffstat (limited to 'HutchTests')
-rw-r--r--HutchTests/AppStateTests.swift8
-rw-r--r--HutchTests/DeepLinkTests.swift32
-rw-r--r--HutchTests/SourceHutWebDeepLinkMapperTests.swift44
3 files changed, 83 insertions, 1 deletions
diff --git a/HutchTests/AppStateTests.swift b/HutchTests/AppStateTests.swift
index 88a8272..b7e1755 100644
--- a/HutchTests/AppStateTests.swift
+++ b/HutchTests/AppStateTests.swift
@@ -6,6 +6,14 @@ struct AppStateTests {
@Test
@MainActor
+ func srhtUsernameNormalizesWebPathOwner() {
+ #expect(AppState.srhtUsername(from: "~vicho") == "vicho")
+ #expect(AppState.srhtUsername(from: " vicho ") == "vicho")
+ #expect(AppState.srhtUsername(from: " ~vicho ") == "vicho")
+ }
+
+ @Test
+ @MainActor
func presentRepositoryDeepLinkErrorSetsUserFacingMessage() {
let appState = AppState()
diff --git a/HutchTests/DeepLinkTests.swift b/HutchTests/DeepLinkTests.swift
index c57cfce..500c4cd 100644
--- a/HutchTests/DeepLinkTests.swift
+++ b/HutchTests/DeepLinkTests.swift
@@ -19,7 +19,19 @@ struct DeepLinkTests {
@Test
func parsesRepositoryLink() {
let link = DeepLink(url: HutchDeepLinkURL.repositoryGit)
- #expect(link == .repository(owner: "~user", repo: "repo"))
+ #expect(link == .repository(service: .git, owner: "~user", repo: "repo"))
+ }
+
+ @Test
+ func parsesHgRepositoryLink() {
+ let link = DeepLink(url: HutchDeepLinkURL.repositoryHg)
+ #expect(link == .repository(service: .hg, owner: "~user", repo: "repo"))
+ }
+
+ @Test
+ func parsesServiceOwnerRootAsUserProfile() {
+ let link = DeepLink(url: HutchDeepLinkURL.gitOwnerRoot)
+ #expect(link == .userProfile(owner: "~owner"))
}
@Test
@@ -35,6 +47,18 @@ struct DeepLinkTests {
}
@Test
+ func parsesBuildJobLinkWithOwnerPath() {
+ let link = DeepLink(url: HutchDeepLinkURL.buildJobWithOwner)
+ #expect(link == .build(jobId: 12345))
+ }
+
+ @Test
+ func parsesMailingListLink() {
+ let link = DeepLink(url: HutchDeepLinkURL.mailingList)
+ #expect(link == .mailingList(owner: "~owner", list: "list"))
+ }
+
+ @Test
func parsesBuildsTabLink() {
let link = DeepLink(url: HutchDeepLinkURL.builds)
#expect(link == .buildsTab)
@@ -65,6 +89,12 @@ struct DeepLinkTests {
}
@Test
+ func parsesUserProfileLink() {
+ let link = DeepLink(url: HutchDeepLinkURL.userProfile)
+ #expect(link == .userProfile(owner: "~owner"))
+ }
+
+ @Test
func rejectsNonHutchScheme() {
let link = DeepLink(url: URL(string: "https://example.com/home")!)
#expect(link == nil)
diff --git a/HutchTests/SourceHutWebDeepLinkMapperTests.swift b/HutchTests/SourceHutWebDeepLinkMapperTests.swift
new file mode 100644
index 0000000..0fa3aaa
--- /dev/null
+++ b/HutchTests/SourceHutWebDeepLinkMapperTests.swift
@@ -0,0 +1,44 @@
+import Foundation
+import Testing
+@testable import Hutch
+
+struct SourceHutWebDeepLinkMapperTests {
+ @Test
+ func mapsRepositoryURLs() {
+ #expect(mapped("https://git.sr.ht/~ccleberg/Hutch") == "hutch://git/~ccleberg/Hutch")
+ #expect(mapped("https://hg.sr.ht/~user/repo") == "hutch://hg/~user/repo")
+ }
+
+ @Test
+ func mapsTrackerBuildAndListURLs() {
+ #expect(mapped("https://todo.sr.ht/~ccleberg/hutch/123") == "hutch://todo/~ccleberg/hutch/123")
+ #expect(mapped("https://builds.sr.ht/~ccleberg/job/12345") == "hutch://builds/~ccleberg/job/12345")
+ #expect(mapped("https://lists.sr.ht/~ccleberg/hutch-announce") == "hutch://lists/~ccleberg/hutch-announce")
+ }
+
+ @Test
+ func mapsProfileHostsToLookup() {
+ #expect(mapped("https://sr.ht/~ccleberg") == "hutch://lookup/~ccleberg")
+ #expect(mapped("https://meta.sr.ht/~ccleberg") == "hutch://lookup/~ccleberg")
+ #expect(mapped("https://git.sr.ht/~ccleberg/") == "hutch://lookup/~ccleberg")
+ #expect(mapped("https://hg.sr.ht/~user") == "hutch://lookup/~user")
+ #expect(mapped("https://todo.sr.ht/~user") == "hutch://lookup/~user")
+ #expect(mapped("https://lists.sr.ht/~user") == "hutch://lookup/~user")
+ #expect(mapped("https://sr.ht/projects/~user") == "hutch://lookup/~user")
+ }
+
+ @Test
+ func preservesQueryAndFragment() {
+ #expect(mapped("https://git.sr.ht/~ccleberg/Hutch/tree/main/item/README.md?plain=1#L10") == "hutch://git/~ccleberg/Hutch/tree/main/item/README.md?plain=1#L10")
+ }
+
+ @Test
+ func rejectsUnsupportedHostsAndSchemes() {
+ #expect(SourceHutWebDeepLinkMapper.deepLink(for: URL(string: "https://chat.sr.ht")!) == nil)
+ #expect(SourceHutWebDeepLinkMapper.deepLink(for: URL(string: "http://git.sr.ht/~ccleberg/Hutch")!) == nil)
+ }
+
+ private func mapped(_ string: String) -> String? {
+ SourceHutWebDeepLinkMapper.deepLink(for: URL(string: string)!)?.absoluteString
+ }
+}