231 lines
5.4 KiB
Go
231 lines
5.4 KiB
Go
package context
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"net/url"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/cli/cli/api"
|
|
"github.com/cli/cli/git"
|
|
"github.com/cli/cli/internal/ghrepo"
|
|
"github.com/cli/cli/pkg/httpmock"
|
|
)
|
|
|
|
func eq(t *testing.T, got interface{}, expected interface{}) {
|
|
t.Helper()
|
|
if !reflect.DeepEqual(got, expected) {
|
|
t.Errorf("expected: %v, got: %v", expected, got)
|
|
}
|
|
}
|
|
|
|
func Test_Remotes_FindByName(t *testing.T) {
|
|
list := Remotes{
|
|
&Remote{Remote: &git.Remote{Name: "mona"}, Repo: ghrepo.New("monalisa", "myfork")},
|
|
&Remote{Remote: &git.Remote{Name: "origin"}, Repo: ghrepo.New("monalisa", "octo-cat")},
|
|
&Remote{Remote: &git.Remote{Name: "upstream"}, Repo: ghrepo.New("hubot", "tools")},
|
|
}
|
|
|
|
r, err := list.FindByName("upstream", "origin")
|
|
eq(t, err, nil)
|
|
eq(t, r.Name, "upstream")
|
|
|
|
r, err = list.FindByName("nonexist", "*")
|
|
eq(t, err, nil)
|
|
eq(t, r.Name, "mona")
|
|
|
|
_, err = list.FindByName("nonexist")
|
|
eq(t, err, errors.New(`no GitHub remotes found`))
|
|
}
|
|
|
|
func Test_translateRemotes(t *testing.T) {
|
|
publicURL, _ := url.Parse("https://github.com/monalisa/hello")
|
|
originURL, _ := url.Parse("http://example.com/repo")
|
|
|
|
gitRemotes := git.RemoteSet{
|
|
&git.Remote{
|
|
Name: "origin",
|
|
FetchURL: originURL,
|
|
},
|
|
&git.Remote{
|
|
Name: "public",
|
|
FetchURL: publicURL,
|
|
},
|
|
}
|
|
|
|
identityURL := func(u *url.URL) *url.URL {
|
|
return u
|
|
}
|
|
result := TranslateRemotes(gitRemotes, identityURL)
|
|
|
|
if len(result) != 1 {
|
|
t.Errorf("got %d results", len(result))
|
|
}
|
|
if result[0].Name != "public" {
|
|
t.Errorf("got %q", result[0].Name)
|
|
}
|
|
if result[0].RepoName() != "hello" {
|
|
t.Errorf("got %q", result[0].RepoName())
|
|
}
|
|
}
|
|
|
|
func Test_resolvedRemotes_triangularSetup(t *testing.T) {
|
|
http := &httpmock.Registry{}
|
|
apiClient := api.NewClient(api.ReplaceTripper(http))
|
|
|
|
http.StubResponse(200, bytes.NewBufferString(`
|
|
{ "data": { "repository": { "forks": { "nodes": [
|
|
] } } } }
|
|
`))
|
|
|
|
resolved := ResolvedRemotes{
|
|
BaseOverride: nil,
|
|
Remotes: Remotes{
|
|
&Remote{
|
|
Remote: &git.Remote{Name: "origin"},
|
|
Repo: ghrepo.New("OWNER", "REPO"),
|
|
},
|
|
&Remote{
|
|
Remote: &git.Remote{Name: "fork"},
|
|
Repo: ghrepo.New("MYSELF", "REPO"),
|
|
},
|
|
},
|
|
Network: api.RepoNetworkResult{
|
|
Repositories: []*api.Repository{
|
|
{
|
|
Name: "NEWNAME",
|
|
Owner: api.RepositoryOwner{Login: "NEWOWNER"},
|
|
ViewerPermission: "READ",
|
|
},
|
|
{
|
|
Name: "REPO",
|
|
Owner: api.RepositoryOwner{Login: "MYSELF"},
|
|
ViewerPermission: "ADMIN",
|
|
},
|
|
},
|
|
},
|
|
apiClient: apiClient,
|
|
}
|
|
|
|
baseRepo, err := resolved.BaseRepo()
|
|
if err != nil {
|
|
t.Fatalf("got %v", err)
|
|
}
|
|
eq(t, ghrepo.FullName(baseRepo), "NEWOWNER/NEWNAME")
|
|
baseRemote, err := resolved.RemoteForRepo(baseRepo)
|
|
if err != nil {
|
|
t.Fatalf("got %v", err)
|
|
}
|
|
if baseRemote.Name != "origin" {
|
|
t.Errorf("got remote %q", baseRemote.Name)
|
|
}
|
|
|
|
headRepo, err := resolved.HeadRepo()
|
|
if err != nil {
|
|
t.Fatalf("got %v", err)
|
|
}
|
|
eq(t, ghrepo.FullName(headRepo), "MYSELF/REPO")
|
|
headRemote, err := resolved.RemoteForRepo(headRepo)
|
|
if err != nil {
|
|
t.Fatalf("got %v", err)
|
|
}
|
|
if headRemote.Name != "fork" {
|
|
t.Errorf("got remote %q", headRemote.Name)
|
|
}
|
|
}
|
|
|
|
func Test_resolvedRemotes_forkLookup(t *testing.T) {
|
|
http := &httpmock.Registry{}
|
|
apiClient := api.NewClient(api.ReplaceTripper(http))
|
|
|
|
http.StubResponse(200, bytes.NewBufferString(`
|
|
{ "data": { "repository": { "forks": { "nodes": [
|
|
{ "id": "FORKID",
|
|
"url": "https://github.com/FORKOWNER/REPO",
|
|
"name": "REPO",
|
|
"owner": { "login": "FORKOWNER" },
|
|
"viewerPermission": "WRITE"
|
|
}
|
|
] } } } }
|
|
`))
|
|
|
|
resolved := ResolvedRemotes{
|
|
BaseOverride: nil,
|
|
Remotes: Remotes{
|
|
&Remote{
|
|
Remote: &git.Remote{Name: "origin"},
|
|
Repo: ghrepo.New("OWNER", "REPO"),
|
|
},
|
|
},
|
|
Network: api.RepoNetworkResult{
|
|
Repositories: []*api.Repository{
|
|
{
|
|
Name: "NEWNAME",
|
|
Owner: api.RepositoryOwner{Login: "NEWOWNER"},
|
|
ViewerPermission: "READ",
|
|
},
|
|
},
|
|
},
|
|
apiClient: apiClient,
|
|
}
|
|
|
|
headRepo, err := resolved.HeadRepo()
|
|
if err != nil {
|
|
t.Fatalf("got %v", err)
|
|
}
|
|
eq(t, ghrepo.FullName(headRepo), "FORKOWNER/REPO")
|
|
_, err = resolved.RemoteForRepo(headRepo)
|
|
if err == nil {
|
|
t.Fatal("expected to not find a matching remote")
|
|
}
|
|
}
|
|
|
|
func Test_resolvedRemotes_clonedFork(t *testing.T) {
|
|
resolved := ResolvedRemotes{
|
|
BaseOverride: nil,
|
|
Remotes: Remotes{
|
|
&Remote{
|
|
Remote: &git.Remote{Name: "origin"},
|
|
Repo: ghrepo.New("OWNER", "REPO"),
|
|
},
|
|
},
|
|
Network: api.RepoNetworkResult{
|
|
Repositories: []*api.Repository{
|
|
{
|
|
Name: "REPO",
|
|
Owner: api.RepositoryOwner{Login: "OWNER"},
|
|
ViewerPermission: "ADMIN",
|
|
Parent: &api.Repository{
|
|
Name: "REPO",
|
|
Owner: api.RepositoryOwner{Login: "PARENTOWNER"},
|
|
ViewerPermission: "READ",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
baseRepo, err := resolved.BaseRepo()
|
|
if err != nil {
|
|
t.Fatalf("got %v", err)
|
|
}
|
|
eq(t, ghrepo.FullName(baseRepo), "PARENTOWNER/REPO")
|
|
baseRemote, err := resolved.RemoteForRepo(baseRepo)
|
|
if baseRemote != nil || err == nil {
|
|
t.Error("did not expect any remote for base")
|
|
}
|
|
|
|
headRepo, err := resolved.HeadRepo()
|
|
if err != nil {
|
|
t.Fatalf("got %v", err)
|
|
}
|
|
eq(t, ghrepo.FullName(headRepo), "OWNER/REPO")
|
|
headRemote, err := resolved.RemoteForRepo(headRepo)
|
|
if err != nil {
|
|
t.Fatalf("got %v", err)
|
|
}
|
|
if headRemote.Name != "origin" {
|
|
t.Errorf("got remote %q", headRemote.Name)
|
|
}
|
|
}
|