package github
import (
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/MichaelMure/git-bug/bridge/core/auth"
)
func TestSplitURL(t *testing.T) {
type args struct {
url string
}
type want struct {
owner string
project string
err error
}
tests := []struct {
name string
args args
want want
}{
{
name: "default url",
args: args{
url: "https://github.com/MichaelMure/git-bug",
},
want: want{
owner: "MichaelMure",
project: "git-bug",
err: nil,
},
},
{
name: "default issues url",
args: args{
url: "https://github.com/MichaelMure/git-bug/issues",
},
want: want{
owner: "MichaelMure",
project: "git-bug",
err: nil,
},
},
{
name: "default url with git extension",
args: args{
url: "https://github.com/MichaelMure/git-bug.git",
},
want: want{
owner: "MichaelMure",
project: "git-bug",
err: nil,
},
},
{
name: "url with git protocol",
args: args{
url: "git://github.com/MichaelMure/git-bug.git",
},
want: want{
owner: "MichaelMure",
project: "git-bug",
err: nil,
},
},
{
name: "ssh url",
args: args{
url: "git@github.com:MichaelMure/git-bug.git",
},
want: want{
owner: "MichaelMure",
project: "git-bug",
err: nil,
},
},
{
name: "bad url",
args: args{
url: "https://githb.com/MichaelMure/git-bug.git",
},
want: want{
err: ErrBadProjectURL,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
owner, project, err := splitURL(tt.args.url)
assert.Equal(t, tt.want.err, err)
assert.Equal(t, tt.want.owner, owner)
assert.Equal(t, tt.want.project, project)
})
}
}
func TestValidateUsername(t *testing.T) {
if env := os.Getenv("TRAVIS"); env == "true" {
t.Skip("Travis environment: avoiding non authenticated requests")
}
tests := []struct {
name string
input string
fixed string
ok bool
}{
{
name: "existing username",
input: "MichaelMure",
fixed: "MichaelMure",
ok: true,
},
{
name: "existing username with bad case",
input: "MicHaelmurE",
fixed: "MichaelMure",
ok: true,
},
{
name: "existing organisation",
input: "ipfs",
fixed: "ipfs",
ok: true,
},
{
name: "existing organisation with bad case",
input: "iPfS",
fixed: "ipfs",
ok: true,
},
{
name: "non existing username",
input: "cant-find-this",
fixed: "",
ok: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ok, fixed, err := validateUsername(tt.input)
assert.NoError(t, err)
assert.Equal(t, tt.ok, ok)
assert.Equal(t, tt.fixed, fixed)
})
}
}
func TestValidateProject(t *testing.T) {
envPrivate := os.Getenv("GITHUB_TOKEN_PRIVATE")
if envPrivate == "" {
t.Skip("Env var GITHUB_TOKEN_PRIVATE missing")
}
envPublic := os.Getenv("GITHUB_TOKEN_PUBLIC")
if envPublic == "" {
t.Skip("Env var GITHUB_TOKEN_PUBLIC missing")
}
tokenPrivate := auth.NewToken(target, envPrivate)
tokenPublic := auth.NewToken(target, envPublic)
type args struct {
owner string
project string
token *auth.Token
}
tests := []struct {
name string
args args
want bool
}{
{
name: "public repository and token with scope 'public_repo'",
args: args{
project: "git-bug",
owner: "MichaelMure",
token: tokenPublic,
},
want: true,
},
{
name: "private repository and token with scope 'repo'",
args: args{
project: "git-bug-test-github-bridge",
owner: "MichaelMure",
token: tokenPrivate,
},
want: true,
},
{
name: "private repository and token with scope 'public_repo'",
args: args{
project: "git-bug-test-github-bridge",
owner: "MichaelMure",
token: tokenPublic,
},
want: false,
},
{
name: "project not existing",
args: args{
project: "cant-find-this",
owner: "organisation-not-found",
token: tokenPublic,
},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ok, _ := validateProject(tt.args.owner, tt.args.project, tt.args.token)
assert.Equal(t, tt.want, ok)
})
}
}