package extensions import ( "io" "io/ioutil" "os" "strings" "testing" "github.com/cli/cli/internal/config" "github.com/cli/cli/pkg/cmdutil" "github.com/cli/cli/pkg/extensions" "github.com/cli/cli/pkg/iostreams" "github.com/stretchr/testify/assert" ) func TestNewCmdExtensions(t *testing.T) { tempDir := t.TempDir() oldWd, _ := os.Getwd() assert.NoError(t, os.Chdir(tempDir)) t.Cleanup(func() { _ = os.Chdir(oldWd) }) tests := []struct { name string args []string managerStubs func(em *extensions.ExtensionManagerMock) func(*testing.T) wantErr bool wantStdout string wantStderr string }{ { name: "install an extension", args: []string{"install", "owner/gh-some-ext"}, managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) { em.InstallFunc = func(s string, out, errOut io.Writer) error { return nil } return func(t *testing.T) { calls := em.InstallCalls() assert.Equal(t, 1, len(calls)) assert.Equal(t, "https://github.com/owner/gh-some-ext.git", calls[0].URL) } }, }, { name: "install local extension", args: []string{"install", "."}, managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) { em.InstallLocalFunc = func(dir string) error { return nil } return func(t *testing.T) { calls := em.InstallLocalCalls() assert.Equal(t, 1, len(calls)) assert.Equal(t, tempDir, normalizeDir(calls[0].Dir)) } }, }, { name: "upgrade error", args: []string{"upgrade"}, wantErr: true, }, { name: "upgrade an extension", args: []string{"upgrade", "hello"}, managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) { em.UpgradeFunc = func(name string, out, errOut io.Writer) error { return nil } return func(t *testing.T) { calls := em.UpgradeCalls() assert.Equal(t, 1, len(calls)) assert.Equal(t, "hello", calls[0].Name) } }, }, { name: "upgrade all", args: []string{"upgrade", "--all"}, managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) { em.UpgradeFunc = func(name string, out, errOut io.Writer) error { return nil } return func(t *testing.T) { calls := em.UpgradeCalls() assert.Equal(t, 1, len(calls)) assert.Equal(t, "", calls[0].Name) } }, }, { name: "remove extension", args: []string{"remove", "hello"}, managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) { em.RemoveFunc = func(name string) error { return nil } return func(t *testing.T) { calls := em.RemoveCalls() assert.Equal(t, 1, len(calls)) assert.Equal(t, "hello", calls[0].Name) } }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ios, _, stdout, stderr := iostreams.Test() var assertFunc func(*testing.T) em := &extensions.ExtensionManagerMock{} if tt.managerStubs != nil { assertFunc = tt.managerStubs(em) } f := cmdutil.Factory{ Config: func() (config.Config, error) { return config.NewBlankConfig(), nil }, IOStreams: ios, ExtensionManager: em, } cmd := NewCmdExtensions(&f) cmd.SetArgs(tt.args) cmd.SetOut(ioutil.Discard) cmd.SetErr(ioutil.Discard) _, err := cmd.ExecuteC() if tt.wantErr { assert.Error(t, err) } else { assert.NoError(t, err) } if assertFunc != nil { assertFunc(t) } assert.Equal(t, tt.wantStdout, stdout.String()) assert.Equal(t, tt.wantStderr, stderr.String()) }) } } func normalizeDir(d string) string { return strings.TrimPrefix(d, "/private") }