diff options
| author | Christian Cleberg <[email protected]> | 2026-05-14 12:41:55 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-05-14 12:41:55 -0500 |
| commit | 0d61e05e98f6f020722ee4d43f024c1da348d2a9 (patch) | |
| tree | b388972b86cf83de380381c52c4390c3beafc69a /HutchTests | |
| parent | f28e5cee1643e3f99d7bf90476d1dcf9347229a0 (diff) | |
| download | hutch-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.swift | 8 | ||||
| -rw-r--r-- | HutchTests/DeepLinkTests.swift | 32 | ||||
| -rw-r--r-- | HutchTests/SourceHutWebDeepLinkMapperTests.swift | 44 |
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 + } +} |
