242 lines
4.4 KiB
Go
242 lines
4.4 KiB
Go
package git
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestIsURL(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
url string
|
|
want bool
|
|
}{
|
|
{
|
|
name: "scp-like",
|
|
url: "git@example.com:owner/repo",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "scp-like with no user",
|
|
url: "example.com:owner/repo",
|
|
want: false,
|
|
},
|
|
{
|
|
name: "ssh",
|
|
url: "ssh://git@example.com/owner/repo",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "git",
|
|
url: "git://example.com/owner/repo",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "git with extension",
|
|
url: "git://example.com/owner/repo.git",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "git+ssh",
|
|
url: "git+ssh://git@example.com/owner/repo.git",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "https",
|
|
url: "https://example.com/owner/repo.git",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "git+https",
|
|
url: "git+https://example.com/owner/repo.git",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "no protocol",
|
|
url: "example.com/owner/repo",
|
|
want: false,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
assert.Equal(t, tt.want, IsURL(tt.url))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestParseURL(t *testing.T) {
|
|
type url struct {
|
|
Scheme string
|
|
User string
|
|
Host string
|
|
Path string
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
url string
|
|
want url
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "HTTPS",
|
|
url: "https://example.com/owner/repo.git",
|
|
want: url{
|
|
Scheme: "https",
|
|
User: "",
|
|
Host: "example.com",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "HTTP",
|
|
url: "http://example.com/owner/repo.git",
|
|
want: url{
|
|
Scheme: "http",
|
|
User: "",
|
|
Host: "example.com",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "git",
|
|
url: "git://example.com/owner/repo.git",
|
|
want: url{
|
|
Scheme: "git",
|
|
User: "",
|
|
Host: "example.com",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "ssh",
|
|
url: "ssh://git@example.com/owner/repo.git",
|
|
want: url{
|
|
Scheme: "ssh",
|
|
User: "git",
|
|
Host: "example.com",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "ssh with port",
|
|
url: "ssh://git@example.com:443/owner/repo.git",
|
|
want: url{
|
|
Scheme: "ssh",
|
|
User: "git",
|
|
Host: "example.com",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "ssh, ipv6",
|
|
url: "ssh://git@[::1]/owner/repo.git",
|
|
want: url{
|
|
Scheme: "ssh",
|
|
User: "git",
|
|
Host: "[::1]",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "ssh with port, ipv6",
|
|
url: "ssh://git@[::1]:22/owner/repo.git",
|
|
want: url{
|
|
Scheme: "ssh",
|
|
User: "git",
|
|
Host: "[::1]",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "git+ssh",
|
|
url: "git+ssh://example.com/owner/repo.git",
|
|
want: url{
|
|
Scheme: "ssh",
|
|
User: "",
|
|
Host: "example.com",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "git+https",
|
|
url: "git+https://example.com/owner/repo.git",
|
|
want: url{
|
|
Scheme: "https",
|
|
User: "",
|
|
Host: "example.com",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "scp-like",
|
|
url: "git@example.com:owner/repo.git",
|
|
want: url{
|
|
Scheme: "ssh",
|
|
User: "git",
|
|
Host: "example.com",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "scp-like, leading slash",
|
|
url: "git@example.com:/owner/repo.git",
|
|
want: url{
|
|
Scheme: "ssh",
|
|
User: "git",
|
|
Host: "example.com",
|
|
Path: "/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "file protocol",
|
|
url: "file:///example.com/owner/repo.git",
|
|
want: url{
|
|
Scheme: "file",
|
|
User: "",
|
|
Host: "",
|
|
Path: "/example.com/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "file path",
|
|
url: "/example.com/owner/repo.git",
|
|
want: url{
|
|
Scheme: "",
|
|
User: "",
|
|
Host: "",
|
|
Path: "/example.com/owner/repo.git",
|
|
},
|
|
},
|
|
{
|
|
name: "Windows file path",
|
|
url: "C:\\example.com\\owner\\repo.git",
|
|
want: url{
|
|
Scheme: "c",
|
|
User: "",
|
|
Host: "",
|
|
Path: "",
|
|
},
|
|
},
|
|
{
|
|
name: "fails to parse",
|
|
url: "ssh://git@[/tmp/git-repo",
|
|
wantErr: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
u, err := ParseURL(tt.url)
|
|
if tt.wantErr {
|
|
require.Error(t, err)
|
|
return
|
|
}
|
|
|
|
assert.Equal(t, u.Scheme, tt.want.Scheme)
|
|
assert.Equal(t, u.User.Username(), tt.want.User)
|
|
assert.Equal(t, u.Host, tt.want.Host)
|
|
assert.Equal(t, u.Path, tt.want.Path)
|
|
})
|
|
}
|
|
}
|