Skip to content

Commit

Permalink
Add unit tests for scaffold functionality for init, edit, create api,…
Browse files Browse the repository at this point in the history
… and create webhook subcommands

Signed-off-by: Rashmi Gottipati <chowdary.grashmi@gmail.com>
  • Loading branch information
rashmigottipati committed Oct 20, 2021
1 parent 1e24dad commit 72bc7c1
Show file tree
Hide file tree
Showing 7 changed files with 351 additions and 33 deletions.
1 change: 0 additions & 1 deletion pkg/cli/options_test.go
Expand Up @@ -71,7 +71,6 @@ var _ = Describe("discovering external plugins", func() {
err = fs.FS.MkdirAll(filepath.Dir(pluginFilePath), 0700)
Expect(err).To(BeNil())

// f, err = fs.FS.Create(filepath.Join(filepath.Dir(pluginFilePath), pluginFileName))
f, err = fs.FS.Create(pluginFilePath)
Expect(err).To(BeNil())
Expect(f).ToNot(BeNil())
Expand Down
11 changes: 3 additions & 8 deletions pkg/plugins/external/api.go
Expand Up @@ -17,11 +17,8 @@ limitations under the License.
package external

import (
"bytes"
"encoding/json"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"

Expand Down Expand Up @@ -61,10 +58,7 @@ func (p *createAPISubcommand) Scaffold(fs machinery.Filesystem) error {
return err
}

cmd := exec.Command(p.Path)
cmd.Stdin = bytes.NewBuffer(reqBytes)
cmd.Stderr = os.Stderr
out, err := cmd.Output()
out, err := outputGetter.GetExecOutput(reqBytes, p.Path)
if err != nil {
return err
}
Expand All @@ -79,10 +73,11 @@ func (p *createAPISubcommand) Scaffold(fs machinery.Filesystem) error {
return fmt.Errorf(strings.Join(res.ErrorMsgs, "\n"))
}

currentDir, err := os.Getwd()
currentDir, err := currentDirGetter.GetCurrentDir()
if err != nil {
return fmt.Errorf("error getting current directory: %v", err)
}

for filename, data := range res.Universe {
f, err := fs.FS.Create(filepath.Join(currentDir, filename))
if err != nil {
Expand Down
11 changes: 3 additions & 8 deletions pkg/plugins/external/edit.go
Expand Up @@ -17,11 +17,8 @@ limitations under the License.
package external

import (
"bytes"
"encoding/json"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"

Expand Down Expand Up @@ -51,10 +48,7 @@ func (p *editSubcommand) Scaffold(fs machinery.Filesystem) error {
return err
}

cmd := exec.Command(p.Path)
cmd.Stdin = bytes.NewBuffer(reqBytes)
cmd.Stderr = os.Stderr
out, err := cmd.Output()
out, err := outputGetter.GetExecOutput(reqBytes, p.Path)
if err != nil {
return err
}
Expand All @@ -69,10 +63,11 @@ func (p *editSubcommand) Scaffold(fs machinery.Filesystem) error {
return fmt.Errorf(strings.Join(res.ErrorMsgs, "\n"))
}

currentDir, err := os.Getwd()
currentDir, err := currentDirGetter.GetCurrentDir()
if err != nil {
return fmt.Errorf("error getting current directory: %v", err)
}

for filename, data := range res.Universe {
f, err := fs.FS.Create(filepath.Join(currentDir, filename))
if err != nil {
Expand Down
276 changes: 276 additions & 0 deletions pkg/plugins/external/external_test.go
@@ -0,0 +1,276 @@
package external

import (
"fmt"
"os"
"path/filepath"
"testing"

. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/spf13/afero"
"sigs.k8s.io/kubebuilder/v3/pkg/machinery"
)

func TestExternalPlugin(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Scaffold")
}

type mockValidOutputGetter struct{}

type mockInValidOutputGetter struct{}

var _ ExecOutputGetter = &mockValidOutputGetter{}

func (m *mockValidOutputGetter) GetExecOutput(request []byte, path string) ([]byte, error) {
return []byte(`{
"command": "init",
"error": false,
"error_msg": "none",
"universe": {"LICENSE": "Apache 2.0 License\n"}
}`), nil
}

var _ ExecOutputGetter = &mockInValidOutputGetter{}

func (m *mockInValidOutputGetter) GetExecOutput(request []byte, path string) ([]byte, error) {
return nil, fmt.Errorf("error getting exec command output")
}

type mockValidOsWdGetter struct{}

var _ OsWdGetter = &mockValidOsWdGetter{}

func (m *mockValidOsWdGetter) GetCurrentDir() (string, error) {
return "tmp/externalPlugin", nil
}

type mockInValidOsWdGetter struct{}

var _ OsWdGetter = &mockInValidOsWdGetter{}

func (m *mockInValidOsWdGetter) GetCurrentDir() (string, error) {
return "", fmt.Errorf("error getting current directory")
}

var _ = Describe("Run external plugin using Scaffold", func() {
Context("with valid mock values", func() {
const filePerm os.FileMode = 755
var (
pluginFileName string
args []string
f afero.File
fs machinery.Filesystem

err error
)

BeforeEach(func() {
outputGetter = &mockValidOutputGetter{}
currentDirGetter = &mockValidOsWdGetter{}
fs = machinery.Filesystem{
FS: afero.NewMemMapFs(),
}

pluginFileName = "externalPlugin.sh"
pluginFilePath := filepath.Join("tmp", "externalPlugin", pluginFileName)

err = fs.FS.MkdirAll(filepath.Dir(pluginFilePath), filePerm)
Expect(err).To(BeNil())

f, err = fs.FS.Create(pluginFilePath)
Expect(err).To(BeNil())
Expect(f).ToNot(BeNil())

_, err = fs.FS.Stat(pluginFilePath)
Expect(err).To(BeNil())

args = []string{"--domain", "example.com"}

})

AfterEach(func() {
filename := filepath.Join("tmp", "externalPlugin", "LICENSE")
fileInfo, err := fs.FS.Stat(filename)
Expect(err).To(BeNil())
Expect(fileInfo).NotTo(BeNil())
})

It("should successfully run init subcommand on the external plugin", func() {
i := initSubcommand{
Path: pluginFileName,
Args: args,
}

err = i.Scaffold(fs)
Expect(err).To(BeNil())
})

It("should successfully run edit subcommand on the external plugin", func() {
e := editSubcommand{
Path: pluginFileName,
Args: args,
}

err = e.Scaffold(fs)
Expect(err).To(BeNil())
})

It("should successfully run create api subcommand on the external plugin", func() {
c := createAPISubcommand{
Path: pluginFileName,
Args: args,
}

err = c.Scaffold(fs)
Expect(err).To(BeNil())
})

It("should successfully run create webhook subcommand on the external plugin", func() {
c := createWebhookSubcommand{
Path: pluginFileName,
Args: args,
}

err = c.Scaffold(fs)
Expect(err).To(BeNil())
})

})

Context("with invalid mock values of GetExecOutput()", func() {
var (
pluginFileName string
args []string
fs machinery.Filesystem
err error
)
BeforeEach(func() {
outputGetter = &mockInValidOutputGetter{}
currentDirGetter = &mockValidOsWdGetter{}
fs = machinery.Filesystem{
FS: afero.NewMemMapFs(),
}

pluginFileName = "myexternalplugin.sh"
args = []string{"--domain", "example.com"}

})

It("should return error upon running init subcommand on the external plugin", func() {
i := initSubcommand{
Path: pluginFileName,
Args: args,
}

err = i.Scaffold(fs)
Expect(err).NotTo(BeNil())
Expect(err.Error()).To(ContainSubstring("error getting exec command output"))

})

It("should return error upon running edit subcommand on the external plugin", func() {
e := editSubcommand{
Path: pluginFileName,
Args: args,
}

err = e.Scaffold(fs)
Expect(err).NotTo(BeNil())
Expect(err.Error()).To(ContainSubstring("error getting exec command output"))

})

It("should return error upon running create api subcommand on the external plugin", func() {
c := createAPISubcommand{
Path: pluginFileName,
Args: args,
}

err = c.Scaffold(fs)
Expect(err).NotTo(BeNil())
Expect(err.Error()).To(ContainSubstring("error getting exec command output"))
})

It("should return error upon running create webhook subcommand on the external plugin", func() {
c := createWebhookSubcommand{
Path: pluginFileName,
Args: args,
}

err = c.Scaffold(fs)
Expect(err).NotTo(BeNil())
Expect(err.Error()).To(ContainSubstring("error getting exec command output"))

})
})

Context("with invalid mock values of GetCurrentDir()", func() {
var (
pluginFileName string
args []string
fs machinery.Filesystem
err error
)
BeforeEach(func() {
outputGetter = &mockValidOutputGetter{}
currentDirGetter = &mockInValidOsWdGetter{}
fs = machinery.Filesystem{
FS: afero.NewMemMapFs(),
}

pluginFileName = "myexternalplugin.sh"
args = []string{"--domain", "example.com"}

})

It("should return error upon running init subcommand on the external plugin", func() {
i := initSubcommand{
Path: pluginFileName,
Args: args,
}

err = i.Scaffold(fs)
Expect(err).NotTo(BeNil())
Expect(err.Error()).To(ContainSubstring("error getting current directory"))

})

It("should return error upon running edit subcommand on the external plugin", func() {
e := editSubcommand{
Path: pluginFileName,
Args: args,
}

err = e.Scaffold(fs)
Expect(err).NotTo(BeNil())
Expect(err.Error()).To(ContainSubstring("error getting current directory"))

})

It("should return error upon running create api subcommand on the external plugin", func() {
c := createAPISubcommand{
Path: pluginFileName,
Args: args,
}

err = c.Scaffold(fs)
Expect(err).NotTo(BeNil())
Expect(err.Error()).To(ContainSubstring("error getting current directory"))
})

It("should return error upon running create webhook subcommand on the external plugin", func() {
c := createWebhookSubcommand{
Path: pluginFileName,
Args: args,
}

err = c.Scaffold(fs)
Expect(err).NotTo(BeNil())
Expect(err.Error()).To(ContainSubstring("error getting current directory"))

})
})

})

0 comments on commit 72bc7c1

Please sign in to comment.