From ec9eaef048362eec8d620f8416b4b256d0d4e9d2 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Wed, 8 Jan 2025 14:27:41 -0800 Subject: [PATCH] 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. --- pkg/cmd/pr/status/status.go | 13 +++--- pkg/cmd/pr/status/status_test.go | 68 ++++++++++++++++++++------------ 2 files changed, 51 insertions(+), 30 deletions(-) diff --git a/pkg/cmd/pr/status/status.go b/pkg/cmd/pr/status/status.go index 9245b1cdc..499202b7e 100644 --- a/pkg/cmd/pr/status/status.go +++ b/pkg/cmd/pr/status/status.go @@ -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 diff --git a/pkg/cmd/pr/status/status_test.go b/pkg/cmd/pr/status/status_test.go index e8e487559..6e2cf71f9 100644 --- a/pkg/cmd/pr/status/status_test.go +++ b/pkg/cmd/pr/status/status_test.go @@ -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) + }) } }