cli/pkg/cmd/factory/remote_resolver_test.go
Eng Zer Jun 471cbea4fa
test: use t.Setenv to set env vars in tests (#6333)
This commit replaces `os.Setenv` with `t.Setenv` in tests. The
environment variable is automatically restored to its original value
when the test and all its subtests complete.

Reference: https://pkg.go.dev/testing#T.Setenv
Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
2022-09-26 08:46:02 +00:00

292 lines
7.9 KiB
Go

package factory
import (
"net/url"
"testing"
"github.com/cli/cli/v2/git"
"github.com/cli/cli/v2/internal/config"
"github.com/stretchr/testify/assert"
)
type identityTranslator struct{}
func (it identityTranslator) Translate(u *url.URL) *url.URL {
return u
}
func Test_remoteResolver(t *testing.T) {
tests := []struct {
name string
remotes func() (git.RemoteSet, error)
config config.Config
output []string
wantsErr bool
}{
{
name: "no authenticated hosts",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("origin", "https://github.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{}
}
cfg.DefaultHostFunc = func() (string, string) {
return "github.com", "default"
}
return cfg
}(),
wantsErr: true,
},
{
name: "no git remotes",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "example.com", "hosts"
}
return cfg
}(),
wantsErr: true,
},
{
name: "one authenticated host with no matching git remote and no fallback remotes",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("origin", "https://test.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "example.com", "hosts"
}
cfg.AuthTokenFunc = func(string) (string, string) {
return "", ""
}
return cfg
}(),
wantsErr: true,
},
{
name: "one authenticated host with no matching git remote and fallback remotes",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("origin", "https://github.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "example.com", "hosts"
}
return cfg
}(),
output: []string{"origin"},
},
{
name: "one authenticated host with matching git remote",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("origin", "https://example.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "example.com", "default"
}
return cfg
}(),
output: []string{"origin"},
},
{
name: "one authenticated host with multiple matching git remotes",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("upstream", "https://example.com/owner/repo.git"),
git.NewRemote("github", "https://example.com/owner/repo.git"),
git.NewRemote("origin", "https://example.com/owner/repo.git"),
git.NewRemote("fork", "https://example.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "example.com", "default"
}
return cfg
}(),
output: []string{"upstream", "github", "origin", "fork"},
},
{
name: "multiple authenticated hosts with no matching git remote",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("origin", "https://test.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com", "github.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "github.com", "default"
}
cfg.AuthTokenFunc = func(string) (string, string) {
return "", ""
}
return cfg
}(),
wantsErr: true,
},
{
name: "multiple authenticated hosts with one matching git remote",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("upstream", "https://test.com/owner/repo.git"),
git.NewRemote("origin", "https://example.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com", "github.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "github.com", "default"
}
return cfg
}(),
output: []string{"origin"},
},
{
name: "multiple authenticated hosts with multiple matching git remotes",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("upstream", "https://example.com/owner/repo.git"),
git.NewRemote("github", "https://github.com/owner/repo.git"),
git.NewRemote("origin", "https://example.com/owner/repo.git"),
git.NewRemote("fork", "https://github.com/owner/repo.git"),
git.NewRemote("test", "https://test.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com", "github.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "github.com", "default"
}
return cfg
}(),
output: []string{"upstream", "github", "origin", "fork"},
},
{
name: "override host with no matching git remotes",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("origin", "https://example.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "test.com", "GH_HOST"
}
return cfg
}(),
wantsErr: true,
},
{
name: "override host with one matching git remote",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("upstream", "https://example.com/owner/repo.git"),
git.NewRemote("origin", "https://test.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "test.com", "GH_HOST"
}
return cfg
}(),
output: []string{"origin"},
},
{
name: "override host with multiple matching git remotes",
remotes: func() (git.RemoteSet, error) {
return git.RemoteSet{
git.NewRemote("upstream", "https://test.com/owner/repo.git"),
git.NewRemote("github", "https://example.com/owner/repo.git"),
git.NewRemote("origin", "https://test.com/owner/repo.git"),
}, nil
},
config: func() config.Config {
cfg := &config.ConfigMock{}
cfg.HostsFunc = func() []string {
return []string{"example.com", "test.com"}
}
cfg.DefaultHostFunc = func() (string, string) {
return "test.com", "GH_HOST"
}
return cfg
}(),
output: []string{"upstream", "origin"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rr := &remoteResolver{
readRemotes: tt.remotes,
getConfig: func() (config.Config, error) { return tt.config, nil },
urlTranslator: identityTranslator{},
}
resolver := rr.Resolver()
remotes, err := resolver()
if tt.wantsErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
names := []string{}
for _, r := range remotes {
names = append(names, r.Name)
}
assert.Equal(t, tt.output, names)
})
}
}