Refactor prSelectorForCurrentBranch and tests
Replace the git config argument in prSelectorForCurrentBranch with the branchConfig it was used to fetch. The tests needed to be refactored accordingly to support this change to the prSelectorForCurrentBranch API. In addition, I've moved the test to a table test format so I can expand the test coverage in the next commit.
This commit is contained in:
parent
527d1db298
commit
ec9eaef048
2 changed files with 51 additions and 30 deletions
|
|
@ -72,6 +72,7 @@ func NewCmdStatus(f *cmdutil.Factory, runF func(*StatusOptions) error) *cobra.Co
|
|||
}
|
||||
|
||||
func statusRun(opts *StatusOptions) error {
|
||||
ctx := context.Background()
|
||||
httpClient, err := opts.HttpClient()
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
@ -93,7 +94,8 @@ func statusRun(opts *StatusOptions) error {
|
|||
}
|
||||
|
||||
remotes, _ := opts.Remotes()
|
||||
currentPRNumber, currentPRHeadRef, err = prSelectorForCurrentBranch(opts.GitClient, baseRepo, currentBranch, remotes)
|
||||
branchConfig, _ := opts.GitClient.ReadBranchConfig(ctx, currentBranch)
|
||||
currentPRNumber, currentPRHeadRef, err = prSelectorForCurrentBranch(branchConfig, baseRepo, currentBranch, remotes)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not query for pull request for current branch: %w", err)
|
||||
}
|
||||
|
|
@ -184,14 +186,15 @@ func statusRun(opts *StatusOptions) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func prSelectorForCurrentBranch(gitClient *git.Client, baseRepo ghrepo.Interface, prHeadRef string, rem ghContext.Remotes) (int, string, error) {
|
||||
branchConfig, _ := gitClient.ReadBranchConfig(context.Background(), prHeadRef)
|
||||
|
||||
func prSelectorForCurrentBranch(branchConfig git.BranchConfig, baseRepo ghrepo.Interface, prHeadRef string, rem ghContext.Remotes) (int, string, error) {
|
||||
// the branch is configured to merge a special PR head ref
|
||||
prHeadRE := regexp.MustCompile(`^refs/pull/(\d+)/head$`)
|
||||
if m := prHeadRE.FindStringSubmatch(branchConfig.MergeRef); m != nil {
|
||||
prNumber, err := strconv.Atoi(m[1])
|
||||
return prNumber, prHeadRef, err
|
||||
if err != nil {
|
||||
return 0, "", err
|
||||
}
|
||||
return prNumber, prHeadRef, nil
|
||||
}
|
||||
|
||||
var err error
|
||||
|
|
|
|||
|
|
@ -4,23 +4,23 @@ import (
|
|||
"bytes"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/MakeNowJust/heredoc"
|
||||
"github.com/cli/cli/v2/context"
|
||||
"github.com/cli/cli/v2/git"
|
||||
"github.com/cli/cli/v2/internal/config"
|
||||
fd "github.com/cli/cli/v2/internal/featuredetection"
|
||||
"github.com/cli/cli/v2/internal/gh"
|
||||
"github.com/cli/cli/v2/internal/ghrepo"
|
||||
"github.com/cli/cli/v2/internal/run"
|
||||
"github.com/cli/cli/v2/pkg/cmdutil"
|
||||
"github.com/cli/cli/v2/pkg/httpmock"
|
||||
"github.com/cli/cli/v2/pkg/iostreams"
|
||||
"github.com/cli/cli/v2/test"
|
||||
"github.com/google/shlex"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func runCommand(rt http.RoundTripper, branch string, isTTY bool, cli string) (*test.CmdOut, error) {
|
||||
|
|
@ -376,30 +376,48 @@ Requesting a code review from you
|
|||
}
|
||||
|
||||
func Test_prSelectorForCurrentBranch(t *testing.T) {
|
||||
rs, cleanup := run.Stub()
|
||||
defer cleanup(t)
|
||||
|
||||
rs.Register(`git config --get-regexp \^branch\\.`, 0, heredoc.Doc(`
|
||||
branch.Frederick888/main.remote git@github.com:Frederick888/playground.git
|
||||
branch.Frederick888/main.merge refs/heads/main
|
||||
`))
|
||||
|
||||
repo := ghrepo.NewWithHost("octocat", "playground", "github.com")
|
||||
rem := context.Remotes{
|
||||
&context.Remote{
|
||||
Remote: &git.Remote{Name: "origin"},
|
||||
Repo: repo,
|
||||
tests := []struct {
|
||||
name string
|
||||
branchConfig git.BranchConfig
|
||||
baseRepo ghrepo.Interface
|
||||
prHeadRef string
|
||||
remotes context.Remotes
|
||||
wantPrNumber int
|
||||
wantSelector string
|
||||
wantError error
|
||||
}{
|
||||
{
|
||||
name: "Branch merges from a remote specified by URL",
|
||||
branchConfig: git.BranchConfig{
|
||||
RemoteURL: &url.URL{
|
||||
Scheme: "ssh",
|
||||
User: url.User("git"),
|
||||
Host: "github.com",
|
||||
Path: "Frederick888/playground.git",
|
||||
},
|
||||
MergeRef: "refs/heads/main",
|
||||
},
|
||||
baseRepo: ghrepo.NewWithHost("octocat", "playground", "github.com"),
|
||||
prHeadRef: "Frederick888/main",
|
||||
remotes: context.Remotes{
|
||||
&context.Remote{
|
||||
Remote: &git.Remote{Name: "origin"},
|
||||
Repo: ghrepo.NewWithHost("octocat", "playground", "github.com"),
|
||||
},
|
||||
},
|
||||
wantPrNumber: 0,
|
||||
wantSelector: "Frederick888:main",
|
||||
wantError: nil,
|
||||
},
|
||||
}
|
||||
gitClient := &git.Client{GitPath: "some/path/git"}
|
||||
prNum, headRef, err := prSelectorForCurrentBranch(gitClient, repo, "Frederick888/main", rem)
|
||||
if err != nil {
|
||||
t.Fatalf("prSelectorForCurrentBranch error: %v", err)
|
||||
}
|
||||
if prNum != 0 {
|
||||
t.Errorf("expected prNum to be 0, got %q", prNum)
|
||||
}
|
||||
if headRef != "Frederick888:main" {
|
||||
t.Errorf("expected headRef to be \"Frederick888:main\", got %q", headRef)
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
|
||||
prNum, headRef, err := prSelectorForCurrentBranch(tt.branchConfig, tt.baseRepo, tt.prHeadRef, tt.remotes)
|
||||
assert.Equal(t, tt.wantPrNumber, prNum)
|
||||
assert.Equal(t, tt.wantSelector, headRef)
|
||||
assert.Equal(t, tt.wantError, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue