From 4fab43a667752c873a9e44318bff5079ac7bef40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Thu, 14 Nov 2019 20:53:34 +0100 Subject: [PATCH] Cover more `pr checkout` test scenarios --- command/pr_checkout_test.go | 190 +++++++++++++++++++++++++++++++++--- context/remote.go | 2 +- 2 files changed, 175 insertions(+), 17 deletions(-) diff --git a/command/pr_checkout_test.go b/command/pr_checkout_test.go index 9f85f4f95..930d2b4d8 100644 --- a/command/pr_checkout_test.go +++ b/command/pr_checkout_test.go @@ -111,6 +111,58 @@ func TestPRCheckout_existingBranch(t *testing.T) { eq(t, strings.Join(ranCommands[2], " "), "git merge --ff-only refs/remotes/origin/feature") } +func TestPRCheckout_differentRepo_remoteExists(t *testing.T) { + ctx := context.NewBlank() + ctx.SetBranch("master") + ctx.SetRemotes(map[string]string{ + "origin": "OWNER/REPO", + "robot-fork": "hubot/REPO", + }) + initContext = func() context.Context { + return ctx + } + http := initFakeHTTP() + + http.StubResponse(200, bytes.NewBufferString(` + { "data": { "repository": { "pullRequest": { + "headRefName": "feature", + "headRepositoryOwner": { + "login": "hubot" + }, + "headRepository": { + "name": "REPO", + "defaultBranchRef": { + "name": "master" + } + }, + "isCrossRepository": true, + "maintainerCanModify": false + } } } } + `)) + + ranCommands := [][]string{} + restoreCmd := utils.SetPrepareCmd(func(cmd *exec.Cmd) utils.Runnable { + switch strings.Join(cmd.Args, " ") { + case "git show-ref --verify --quiet refs/heads/feature": + return &errorStub{"exit status: 1"} + default: + ranCommands = append(ranCommands, cmd.Args) + return &outputStub{} + } + }) + defer restoreCmd() + + RootCmd.SetArgs([]string{"pr", "checkout", "123"}) + _, err := prCheckoutCmd.ExecuteC() + eq(t, err, nil) + + eq(t, len(ranCommands), 4) + eq(t, strings.Join(ranCommands[0], " "), "git fetch robot-fork +refs/heads/feature:refs/remotes/robot-fork/feature") + eq(t, strings.Join(ranCommands[1], " "), "git checkout -b feature --no-track robot-fork/feature") + eq(t, strings.Join(ranCommands[2], " "), "git config branch.feature.remote robot-fork") + eq(t, strings.Join(ranCommands[3], " "), "git config branch.feature.merge refs/heads/feature") +} + func TestPRCheckout_differentRepo(t *testing.T) { ctx := context.NewBlank() ctx.SetBranch("master") @@ -141,8 +193,13 @@ func TestPRCheckout_differentRepo(t *testing.T) { ranCommands := [][]string{} restoreCmd := utils.SetPrepareCmd(func(cmd *exec.Cmd) utils.Runnable { - ranCommands = append(ranCommands, cmd.Args) - return &outputStub{} + switch strings.Join(cmd.Args, " ") { + case "git config branch.feature.merge": + return &errorStub{"exit status 1"} + default: + ranCommands = append(ranCommands, cmd.Args) + return &outputStub{} + } }) defer restoreCmd() @@ -150,12 +207,109 @@ func TestPRCheckout_differentRepo(t *testing.T) { _, err := prCheckoutCmd.ExecuteC() eq(t, err, nil) - eq(t, len(ranCommands), 5) - eq(t, strings.Join(ranCommands[0], " "), "git config branch.feature.merge") - eq(t, strings.Join(ranCommands[1], " "), "git fetch origin refs/pull/123/head:feature") - eq(t, strings.Join(ranCommands[2], " "), "git checkout feature") - eq(t, strings.Join(ranCommands[3], " "), "git config branch.feature.remote origin") - eq(t, strings.Join(ranCommands[4], " "), "git config branch.feature.merge refs/pull/123/head") + eq(t, len(ranCommands), 4) + eq(t, strings.Join(ranCommands[0], " "), "git fetch origin refs/pull/123/head:feature") + eq(t, strings.Join(ranCommands[1], " "), "git checkout feature") + eq(t, strings.Join(ranCommands[2], " "), "git config branch.feature.remote origin") + eq(t, strings.Join(ranCommands[3], " "), "git config branch.feature.merge refs/pull/123/head") +} + +func TestPRCheckout_differentRepo_existingBranch(t *testing.T) { + ctx := context.NewBlank() + ctx.SetBranch("master") + ctx.SetRemotes(map[string]string{ + "origin": "OWNER/REPO", + }) + initContext = func() context.Context { + return ctx + } + http := initFakeHTTP() + + http.StubResponse(200, bytes.NewBufferString(` + { "data": { "repository": { "pullRequest": { + "headRefName": "feature", + "headRepositoryOwner": { + "login": "hubot" + }, + "headRepository": { + "name": "REPO", + "defaultBranchRef": { + "name": "master" + } + }, + "isCrossRepository": true, + "maintainerCanModify": false + } } } } + `)) + + ranCommands := [][]string{} + restoreCmd := utils.SetPrepareCmd(func(cmd *exec.Cmd) utils.Runnable { + switch strings.Join(cmd.Args, " ") { + case "git config branch.feature.merge": + return &outputStub{[]byte("refs/heads/feature\n")} + default: + ranCommands = append(ranCommands, cmd.Args) + return &outputStub{} + } + }) + defer restoreCmd() + + RootCmd.SetArgs([]string{"pr", "checkout", "123"}) + _, err := prCheckoutCmd.ExecuteC() + eq(t, err, nil) + + eq(t, len(ranCommands), 2) + eq(t, strings.Join(ranCommands[0], " "), "git fetch origin refs/pull/123/head:feature") + eq(t, strings.Join(ranCommands[1], " "), "git checkout feature") +} + +func TestPRCheckout_differentRepo_currentBranch(t *testing.T) { + ctx := context.NewBlank() + ctx.SetBranch("feature") + ctx.SetRemotes(map[string]string{ + "origin": "OWNER/REPO", + }) + initContext = func() context.Context { + return ctx + } + http := initFakeHTTP() + + http.StubResponse(200, bytes.NewBufferString(` + { "data": { "repository": { "pullRequest": { + "headRefName": "feature", + "headRepositoryOwner": { + "login": "hubot" + }, + "headRepository": { + "name": "REPO", + "defaultBranchRef": { + "name": "master" + } + }, + "isCrossRepository": true, + "maintainerCanModify": false + } } } } + `)) + + ranCommands := [][]string{} + restoreCmd := utils.SetPrepareCmd(func(cmd *exec.Cmd) utils.Runnable { + switch strings.Join(cmd.Args, " ") { + case "git config branch.feature.merge": + return &outputStub{[]byte("refs/heads/feature\n")} + default: + ranCommands = append(ranCommands, cmd.Args) + return &outputStub{} + } + }) + defer restoreCmd() + + RootCmd.SetArgs([]string{"pr", "checkout", "123"}) + _, err := prCheckoutCmd.ExecuteC() + eq(t, err, nil) + + eq(t, len(ranCommands), 2) + eq(t, strings.Join(ranCommands[0], " "), "git fetch origin refs/pull/123/head") + eq(t, strings.Join(ranCommands[1], " "), "git merge --ff-only FETCH_HEAD") } func TestPRCheckout_maintainerCanModify(t *testing.T) { @@ -188,8 +342,13 @@ func TestPRCheckout_maintainerCanModify(t *testing.T) { ranCommands := [][]string{} restoreCmd := utils.SetPrepareCmd(func(cmd *exec.Cmd) utils.Runnable { - ranCommands = append(ranCommands, cmd.Args) - return &outputStub{} + switch strings.Join(cmd.Args, " ") { + case "git config branch.feature.merge": + return &errorStub{"exit status 1"} + default: + ranCommands = append(ranCommands, cmd.Args) + return &outputStub{} + } }) defer restoreCmd() @@ -197,10 +356,9 @@ func TestPRCheckout_maintainerCanModify(t *testing.T) { _, err := prCheckoutCmd.ExecuteC() eq(t, err, nil) - eq(t, len(ranCommands), 5) - eq(t, strings.Join(ranCommands[0], " "), "git config branch.feature.merge") - eq(t, strings.Join(ranCommands[1], " "), "git fetch origin refs/pull/123/head:feature") - eq(t, strings.Join(ranCommands[2], " "), "git checkout feature") - eq(t, strings.Join(ranCommands[3], " "), "git config branch.feature.remote https://github.com/hubot/REPO.git") - eq(t, strings.Join(ranCommands[4], " "), "git config branch.feature.merge refs/heads/feature") + eq(t, len(ranCommands), 4) + eq(t, strings.Join(ranCommands[0], " "), "git fetch origin refs/pull/123/head:feature") + eq(t, strings.Join(ranCommands[1], " "), "git checkout feature") + eq(t, strings.Join(ranCommands[2], " "), "git config branch.feature.remote https://github.com/hubot/REPO.git") + eq(t, strings.Join(ranCommands[3], " "), "git config branch.feature.merge refs/heads/feature") } diff --git a/context/remote.go b/context/remote.go index a30ac6c45..6c41eeaf1 100644 --- a/context/remote.go +++ b/context/remote.go @@ -28,7 +28,7 @@ func (r Remotes) FindByName(names ...string) (*Remote, error) { // FindByRepo returns the first Remote that points to a specific GitHub repository func (r Remotes) FindByRepo(owner, name string) (*Remote, error) { for _, rem := range r { - if strings.EqualFold(rem.Owner, owner) && strings.EqualFold(rem.Name, name) { + if strings.EqualFold(rem.RepoOwner(), owner) && strings.EqualFold(rem.RepoName(), name) { return rem, nil } }