package readme import ( "testing" ) func TestParseSourceURL(t *testing.T) { tests := []struct { name string sourceURL string wantPlatform Platform wantUser string wantRepo string wantOK bool }{ // GitHub { name: "github standard", sourceURL: "https://github.com/bigmoves/quickslice", wantPlatform: PlatformGitHub, wantUser: "bigmoves", wantRepo: "quickslice", wantOK: true, }, { name: "github with .git suffix", sourceURL: "https://github.com/user/repo.git", wantPlatform: PlatformGitHub, wantUser: "user", wantRepo: "repo", wantOK: true, }, { name: "github with trailing slash", sourceURL: "https://github.com/user/repo/", wantPlatform: PlatformGitHub, wantUser: "user", wantRepo: "repo", wantOK: true, }, { name: "github with subpath (ignored)", sourceURL: "https://github.com/user/repo/tree/main", wantPlatform: PlatformGitHub, wantUser: "user", wantRepo: "repo", wantOK: true, }, { name: "github user only", sourceURL: "https://github.com/user", wantOK: false, }, // GitLab { name: "gitlab standard", sourceURL: "https://gitlab.com/user/repo", wantPlatform: PlatformGitLab, wantUser: "user", wantRepo: "repo", wantOK: true, }, { name: "gitlab nested groups", sourceURL: "https://gitlab.com/group/subgroup/repo", wantPlatform: PlatformGitLab, wantUser: "group/subgroup", wantRepo: "repo", wantOK: true, }, { name: "gitlab deep nested groups", sourceURL: "https://gitlab.com/a/b/c/d/repo", wantPlatform: PlatformGitLab, wantUser: "a/b/c/d", wantRepo: "repo", wantOK: true, }, { name: "gitlab with .git suffix", sourceURL: "https://gitlab.com/user/repo.git", wantPlatform: PlatformGitLab, wantUser: "user", wantRepo: "repo", wantOK: true, }, // Tangled { name: "tangled standard", sourceURL: "https://tangled.org/evan.jarrett.net/at-container-registry", wantPlatform: PlatformTangled, wantUser: "evan.jarrett.net", wantRepo: "at-container-registry", wantOK: true, }, { name: "tangled with legacy @ prefix", sourceURL: "https://tangled.org/@evan.jarrett.net/at-container-registry", wantPlatform: PlatformTangled, wantUser: "evan.jarrett.net", wantRepo: "at-container-registry", wantOK: true, }, { name: "tangled.sh domain", sourceURL: "https://tangled.sh/user/repo", wantPlatform: PlatformTangled, wantUser: "user", wantRepo: "repo", wantOK: true, }, { name: "tangled with trailing slash", sourceURL: "https://tangled.org/user/repo/", wantPlatform: PlatformTangled, wantUser: "user", wantRepo: "repo", wantOK: true, }, // Codeberg { name: "codeberg standard", sourceURL: "https://codeberg.org/user/repo", wantPlatform: PlatformCodeberg, wantUser: "user", wantRepo: "repo", wantOK: true, }, // Unsupported / Invalid { name: "unsupported platform", sourceURL: "https://bitbucket.org/user/repo", wantOK: false, }, { name: "empty url", sourceURL: "", wantOK: false, }, { name: "invalid url", sourceURL: "not-a-url", wantOK: false, }, { name: "just host", sourceURL: "https://github.com", wantOK: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { platform, user, repo, ok := ParseSourceURL(tt.sourceURL) if ok != tt.wantOK { t.Errorf("ParseSourceURL(%q) ok = %v, want %v", tt.sourceURL, ok, tt.wantOK) return } if !tt.wantOK { return } if platform != tt.wantPlatform { t.Errorf("ParseSourceURL(%q) platform = %v, want %v", tt.sourceURL, platform, tt.wantPlatform) } if user != tt.wantUser { t.Errorf("ParseSourceURL(%q) user = %q, want %q", tt.sourceURL, user, tt.wantUser) } if repo != tt.wantRepo { t.Errorf("ParseSourceURL(%q) repo = %q, want %q", tt.sourceURL, repo, tt.wantRepo) } }) } } func TestDeriveReadmeURL(t *testing.T) { tests := []struct { name string sourceURL string branch string want string }{ // GitHub { name: "github main", sourceURL: "https://github.com/bigmoves/quickslice", branch: "main", want: "https://raw.githubusercontent.com/bigmoves/quickslice/refs/heads/main/README.md", }, { name: "github master", sourceURL: "https://github.com/user/repo", branch: "master", want: "https://raw.githubusercontent.com/user/repo/refs/heads/master/README.md", }, // GitLab { name: "gitlab main", sourceURL: "https://gitlab.com/user/repo", branch: "main", want: "https://gitlab.com/user/repo/-/raw/main/README.md", }, { name: "gitlab nested groups", sourceURL: "https://gitlab.com/group/subgroup/repo", branch: "main", want: "https://gitlab.com/group/subgroup/repo/-/raw/main/README.md", }, // Tangled { name: "tangled main", sourceURL: "https://tangled.org/evan.jarrett.net/at-container-registry", branch: "main", want: "https://tangled.org/evan.jarrett.net/at-container-registry/raw/main/README.md", }, { name: "tangled legacy @ prefix", sourceURL: "https://tangled.org/@user/repo", branch: "main", want: "https://tangled.org/user/repo/raw/main/README.md", }, // Codeberg { name: "codeberg main", sourceURL: "https://codeberg.org/user/repo", branch: "main", want: "https://codeberg.org/user/repo/raw/branch/main/README.md", }, // Unsupported { name: "unsupported platform", sourceURL: "https://bitbucket.org/user/repo", branch: "main", want: "", }, { name: "empty url", sourceURL: "", branch: "main", want: "", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := DeriveReadmeURL(tt.sourceURL, tt.branch) if got != tt.want { t.Errorf("DeriveReadmeURL(%q, %q) = %q, want %q", tt.sourceURL, tt.branch, got, tt.want) } }) } }