@testable import ForgejoKit import Foundation import Testing struct WorkflowServiceURLTests { private func makeClient() -> ForgejoClient { ForgejoClient(serverURL: "https://forgejo.example.com", username: "user", password: "pass") } @Test func runsListURLNoFilters() throws { let client = makeClient() let queryItems = [ URLQueryItem(name: "page", value: "1"), URLQueryItem(name: "limit", value: "20"), ] let url = try client.makeRepoURL( owner: "owner", repo: "repo", path: "/actions/runs", queryItems: queryItems, ) #expect(url.path == "/api/v1/repos/owner/repo/actions/runs") #expect(url.query?.contains("page=1") == true) #expect(url.query?.contains("limit=20") == true) } @Test func runsListURLAllFilters() throws { let client = makeClient() let queryItems = [ URLQueryItem(name: "page", value: "2"), URLQueryItem(name: "limit", value: "50"), URLQueryItem(name: "status", value: "running"), URLQueryItem(name: "event", value: "push"), URLQueryItem(name: "ref", value: "main"), URLQueryItem(name: "workflow_id", value: "ci.yml"), URLQueryItem(name: "run_number", value: "42"), URLQueryItem(name: "head_sha", value: "abc123"), ] let url = try client.makeRepoURL( owner: "owner", repo: "repo", path: "/actions/runs", queryItems: queryItems, ) #expect(url.query?.contains("status=running") == true) #expect(url.query?.contains("event=push") == true) #expect(url.query?.contains("ref=main") == true) #expect(url.query?.contains("workflow_id=ci.yml") == true) #expect(url.query?.contains("run_number=42") == true) #expect(url.query?.contains("head_sha=abc123") == true) } @Test func runDetailURL() throws { let client = makeClient() let url = try client.makeRepoURL(owner: "owner", repo: "repo", path: "/actions/runs/123") #expect(url.absoluteString == "https://forgejo.example.com/api/v1/repos/owner/repo/actions/runs/123") } @Test func ownerAndRepoArePercentEncoded() throws { let client = makeClient() let url = try client.makeRepoURL(owner: "my org", repo: "my repo", path: "/actions/runs") #expect(url.absoluteString.contains("my%20org")) #expect(url.absoluteString.contains("my%20repo")) } // MARK: - Experimental run-view URL (web routes, not /api/v1) @Test func runViewURLIsUnderRepoWebRoute() throws { let client = makeClient() let url = try client.makeURL(path: "/owner/repo/actions/runs/12/jobs/0") #expect(url.absoluteString == "https://forgejo.example.com/owner/repo/actions/runs/12/jobs/0") } @Test func runViewURLEncodesOwnerAndRepo() throws { let client = makeClient() let owner = ForgejoClient.encodedPathSegment("my org") let repo = ForgejoClient.encodedPathSegment("my repo") let url = try client.makeURL(path: "/\(owner)/\(repo)/actions/runs/3/jobs/1") #expect(url.absoluteString.contains("my%20org")) #expect(url.absoluteString.contains("my%20repo")) } }