From 08b02da3fc4a39064e8efe8716280017886f81c0 Mon Sep 17 00:00:00 2001 From: bchadwic Date: Wed, 23 Mar 2022 21:29:57 -0700 Subject: [PATCH] beginning testing --- context/context.go | 19 +++--- pkg/cmd/repo/default/default.go | 24 +++----- pkg/cmd/repo/default/default_test.go | 87 +++++++++++++++++++++++++++- pkg/cmd/repo/repo.go | 2 +- 4 files changed, 103 insertions(+), 29 deletions(-) diff --git a/context/context.go b/context/context.go index 7b6863def..f596d8810 100644 --- a/context/context.go +++ b/context/context.go @@ -74,16 +74,7 @@ func GetBaseRepo(remotes Remotes) (ghrepo.Interface, error) { return nil, errors.New("a default repo has not been set, use `gh repo default` to set a default repo") } -func RemoveBaseRepo(remotes Remotes) { - for _, remote := range remotes { - if remote.Resolved == "base" { - remote.Resolved = "" - git.UnsetRemoteResolution(remote.Remote.Name) - } - } -} - -func (r *ResolvedRemotes) SetGitConfigBaseRepo(io *iostreams.IOStreams) error { +func (r *ResolvedRemotes) SetBaseRepo(io *iostreams.IOStreams) error { resolution := "base" if !io.CanPrompt() { git.SetRemoteResolution(r.remotes[0].Name, resolution) @@ -146,6 +137,14 @@ func (r *ResolvedRemotes) SetGitConfigBaseRepo(io *iostreams.IOStreams) error { return git.SetRemoteResolution(remote.Name, resolution) } +func RemoveBaseRepo(remotes Remotes) { + for _, remote := range remotes { + if remote.Resolved == "base" { + git.UnsetRemoteResolution(remote.Remote.Name) + } + } +} + func (r *ResolvedRemotes) BaseRepo(io *iostreams.IOStreams) (ghrepo.Interface, error) { if r.baseOverride != nil { return r.baseOverride, nil diff --git a/pkg/cmd/repo/default/default.go b/pkg/cmd/repo/default/default.go index 6b1926fd2..22b59bdf6 100644 --- a/pkg/cmd/repo/default/default.go +++ b/pkg/cmd/repo/default/default.go @@ -15,18 +15,16 @@ import ( type DefaultOptions struct { IO *iostreams.IOStreams - BaseRepo func() (ghrepo.Interface, error) Remotes func() (context.Remotes, error) HttpClient func() (*http.Client, error) ViewFlag bool } -func NewCmdDefault(f *cmdutil.Factory, runF func(*DefaultOptions) error) *cobra.Command { +func NewCmdDefault(f *cmdutil.Factory) *cobra.Command { opts := &DefaultOptions{ IO: f.IOStreams, HttpClient: f.HttpClient, - BaseRepo: f.BaseRepo, Remotes: f.Remotes, } @@ -34,23 +32,15 @@ func NewCmdDefault(f *cmdutil.Factory, runF func(*DefaultOptions) error) *cobra. Use: "default", Short: "Configure the default repository used for various commands", Long: heredoc.Doc(` - The default repository is used to determine which repository gh - should automatically query for the commands: - issue, pr, browse, run, repo rename, secret, workflow + The default repository is used to determine which remote + repository gh should automatically point to. `), Example: heredoc.Doc(` $ gh repo default cli/cli `), Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - if !opts.IO.CanPrompt() && !opts.ViewFlag { - return cmdutil.FlagErrorf("a repository name is required when not running interactively") - } - - if runF != nil { - return runF(opts) - } - return defaultRun(opts) + return runDefault(opts) }, } @@ -58,7 +48,7 @@ func NewCmdDefault(f *cmdutil.Factory, runF func(*DefaultOptions) error) *cobra. return cmd } -func defaultRun(opts *DefaultOptions) error { +func runDefault(opts *DefaultOptions) error { remotes, err := opts.Remotes() if err != nil { return err @@ -78,10 +68,10 @@ func defaultRun(opts *DefaultOptions) error { return err } apiClient := api.NewClientFromHTTP(httpClient) - context.RemoveBaseRepo(remotes) repoContext, err := context.ResolveRemotesToRepos(remotes, apiClient, "") if err != nil { return err } - return repoContext.SetGitConfigBaseRepo(opts.IO) + context.RemoveBaseRepo(remotes) + return repoContext.SetBaseRepo(opts.IO) } diff --git a/pkg/cmd/repo/default/default_test.go b/pkg/cmd/repo/default/default_test.go index 66fa1b529..5bc6db460 100644 --- a/pkg/cmd/repo/default/default_test.go +++ b/pkg/cmd/repo/default/default_test.go @@ -1 +1,86 @@ -package base +package base + +import ( + "errors" + "fmt" + "net/http" + "testing" + + "github.com/cli/cli/v2/context" + "github.com/cli/cli/v2/git" + "github.com/cli/cli/v2/internal/ghrepo" + "github.com/cli/cli/v2/pkg/httpmock" + "github.com/cli/cli/v2/pkg/iostreams" + "github.com/stretchr/testify/assert" +) + +func Test_defaultRun(t *testing.T) { + tests := []struct { + name string + opts DefaultOptions + wantedErr error + wantedStdOut string + }{ + { + opts: DefaultOptions{ + Remotes: func() (context.Remotes, error) { + return []*context.Remote{ + { + Remote: &git.Remote{ + Name: "origin", + Resolved: "base", + }, + Repo: ghrepo.New("hubot", "Spoon-Knife"), + }, + }, nil + }, + ViewFlag: true, + }, + wantedStdOut: "hubot/Spoon-Knife", + }, + { + opts: DefaultOptions{ + Remotes: func() (context.Remotes, error) { + return []*context.Remote{ + { + Remote: &git.Remote{ + Name: "origin", + }, + Repo: ghrepo.New("hubot", "Spoon-Knife"), + }, + }, nil + }, + ViewFlag: true, + }, + wantedErr: errors.New("a default repo has not been set, use `gh repo default` to set a default repo"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + io, _, stdout, stderr := iostreams.Test() + + reg := httpmock.Registry{} + defer reg.Verify(t) + + opts := tt.opts + opts.IO = io + opts.HttpClient = func() (*http.Client, error) { + return &http.Client{Transport: ®}, nil + } + + err := runDefault(&opts) + if tt.wantedErr != nil { + assert.EqualError(t, tt.wantedErr, err.Error()) + } else { + assert.NoError(t, err) + if opts.ViewFlag { + assert.Equal(t, fmt.Sprintf("%s\n", tt.wantedStdOut), stdout.String()) + } else { + assert.Equal(t, "", stdout.String()) + assert.Equal(t, "", stderr.String()) + } + } + }) + } +} diff --git a/pkg/cmd/repo/repo.go b/pkg/cmd/repo/repo.go index d3dce190d..01cae54b4 100644 --- a/pkg/cmd/repo/repo.go +++ b/pkg/cmd/repo/repo.go @@ -53,7 +53,7 @@ func NewCmdRepo(f *cmdutil.Factory) *cobra.Command { cmd.AddCommand(repoRenameCmd.NewCmdRename(f, nil)) cmd.AddCommand(repoDeleteCmd.NewCmdDelete(f, nil)) cmd.AddCommand(repoArchiveCmd.NewCmdArchive(f, nil)) - cmd.AddCommand(repoDefaultCmd.NewCmdDefault(f, nil)) + cmd.AddCommand(repoDefaultCmd.NewCmdDefault(f)) return cmd }