150 lines
3.6 KiB
Go
150 lines
3.6 KiB
Go
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")
|
|
}
|