describing current functionality as tests
This commit is contained in:
		
							parent
							
								
									5aa7da98af
								
							
						
					
					
						commit
						6c6f300423
					
				|  | @ -3,9 +3,6 @@ package helmexec | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"io/ioutil" |  | ||||||
| 	"os" |  | ||||||
| 	"os/exec" |  | ||||||
| 	"strings" | 	"strings" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -14,6 +11,7 @@ const ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type execer struct { | type execer struct { | ||||||
|  | 	runner		Runner | ||||||
| 	writer      io.Writer | 	writer      io.Writer | ||||||
| 	kubeContext string | 	kubeContext string | ||||||
| 	extra       []string | 	extra       []string | ||||||
|  | @ -23,6 +21,7 @@ func NewHelmExec(writer io.Writer, kubeContext string) Interface { | ||||||
| 	return &execer{ | 	return &execer{ | ||||||
| 		writer:      writer, | 		writer:      writer, | ||||||
| 		kubeContext: kubeContext, | 		kubeContext: kubeContext, | ||||||
|  | 		runner:		 new(CliRunner), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -84,12 +83,6 @@ func (helm *execer) DeleteRelease(name string) error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (helm *execer) exec(args ...string) ([]byte, error) { | func (helm *execer) exec(args ...string) ([]byte, error) { | ||||||
| 	dir, err := ioutil.TempDir("", "helmfile-exec") |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	defer os.RemoveAll(dir) |  | ||||||
| 
 |  | ||||||
| 	cmdargs := args | 	cmdargs := args | ||||||
| 	if len(helm.extra) > 0 { | 	if len(helm.extra) > 0 { | ||||||
| 		cmdargs = append(cmdargs, helm.extra...) | 		cmdargs = append(cmdargs, helm.extra...) | ||||||
|  | @ -100,8 +93,19 @@ func (helm *execer) exec(args ...string) ([]byte, error) { | ||||||
| 	if helm.writer != nil { | 	if helm.writer != nil { | ||||||
| 		helm.writer.Write([]byte(fmt.Sprintf("exec: helm %s\n", strings.Join(cmdargs, " ")))) | 		helm.writer.Write([]byte(fmt.Sprintf("exec: helm %s\n", strings.Join(cmdargs, " ")))) | ||||||
| 	} | 	} | ||||||
| 
 | 	return helm.runner.Execute(command, cmdargs) | ||||||
| 	cmd := exec.Command(command, cmdargs...) |  | ||||||
| 	cmd.Dir = dir |  | ||||||
| 	return cmd.CombinedOutput() |  | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // for unit testing
 | ||||||
|  | func (helm *execer) setRunner(runner Runner) { | ||||||
|  | 	helm.runner = runner | ||||||
|  | } | ||||||
|  | func (helm *execer) getExtra() []string { | ||||||
|  | 	return helm.extra | ||||||
|  | } | ||||||
|  | func (helm *execer) getKubeContent() string { | ||||||
|  | 	return helm.kubeContext | ||||||
|  | } | ||||||
|  | func (helm *execer) getWriter() io.Writer { | ||||||
|  | 	return helm.writer | ||||||
|  | } | ||||||
|  | @ -0,0 +1,178 @@ | ||||||
|  | package helmexec | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"io" | ||||||
|  | 	"reflect" | ||||||
|  | 	"testing" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Mocking the command-line runner
 | ||||||
|  | 
 | ||||||
|  | type MockRunner struct { | ||||||
|  | 	output []byte | ||||||
|  | 	err error | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (mock *MockRunner) Execute(cmd string, args []string) ([]byte, error) { | ||||||
|  | 	return []byte{}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewMockExec(writer io.Writer, kubeContext string) Interface { | ||||||
|  | 	nhe := NewHelmExec(writer, kubeContext) | ||||||
|  | 	runner := &MockRunner{} | ||||||
|  | 	nhe.setRunner(runner) | ||||||
|  | 	return nhe | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Test methods
 | ||||||
|  | 
 | ||||||
|  | func TestNewHelmExec(t *testing.T) { | ||||||
|  | 	buffer := bytes.NewBufferString("something") | ||||||
|  | 	helm := NewHelmExec(buffer, "dev") | ||||||
|  | 	if helm.getKubeContent() != "dev" { | ||||||
|  | 		t.Error("helmexec.NewHelmExec() - kubeContext") | ||||||
|  | 	} | ||||||
|  | 	if buffer.String() != "something" { | ||||||
|  | 		t.Error("helmexec.NewHelmExec() - changed buffer") | ||||||
|  | 	} | ||||||
|  | 	if len(helm.getExtra()) != 0 { | ||||||
|  | 		t.Error("helmexec.NewHelmExec() - extra args not empty") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Test_SetExtraArgs(t *testing.T) { | ||||||
|  | 	helm := NewHelmExec(new(bytes.Buffer), "dev") | ||||||
|  | 	helm.SetExtraArgs() | ||||||
|  | 	if len(helm.getExtra()) != 0 { | ||||||
|  | 		t.Error("helmexec.SetExtraArgs() - passing no arguments should not change extra field") | ||||||
|  | 	} | ||||||
|  | 	helm.SetExtraArgs("foo") | ||||||
|  | 	if !reflect.DeepEqual(helm.getExtra(), []string{"foo"}) { | ||||||
|  | 		t.Error("helmexec.SetExtraArgs() - one extra argument missing") | ||||||
|  | 	} | ||||||
|  | 	helm.SetExtraArgs("alpha", "beta") | ||||||
|  | 	if !reflect.DeepEqual(helm.getExtra(), []string{"alpha", "beta"}) { | ||||||
|  | 		t.Error("helmexec.SetExtraArgs() - two extra arguments missing (overwriting the previous value)") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Test_AddRepo(t *testing.T) { | ||||||
|  | 	var buffer bytes.Buffer | ||||||
|  | 	helm := NewMockExec(&buffer, "dev") | ||||||
|  | 	helm.AddRepo("myRepo", "https://repo.example.com/", "cert.pem", "key.pem") | ||||||
|  | 	expected := "exec: helm repo add myRepo https://repo.example.com/ --cert-file cert.pem --key-file key.pem --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.AddRepo()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	buffer.Reset() | ||||||
|  | 	helm.AddRepo("myRepo", "https://repo.example.com/", "", "") | ||||||
|  | 	expected = "exec: helm repo add myRepo https://repo.example.com/ --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.AddRepo()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Test_UpdateRepo(t *testing.T) { | ||||||
|  | 	var buffer bytes.Buffer | ||||||
|  | 	helm := NewMockExec(&buffer, "dev") | ||||||
|  | 	helm.UpdateRepo() | ||||||
|  | 	expected := "exec: helm repo update --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.UpdateRepo()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Test_SyncRelease(t *testing.T) { | ||||||
|  | 	var buffer bytes.Buffer | ||||||
|  | 	helm := NewMockExec(&buffer, "dev") | ||||||
|  | 	helm.SyncRelease("release", "chart", "--timeout 10", "--wait") | ||||||
|  | 	expected := "exec: helm upgrade --install release chart --timeout 10 --wait --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.SyncRelease()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	buffer.Reset() | ||||||
|  | 	helm.SyncRelease("release", "chart") | ||||||
|  | 	expected = "exec: helm upgrade --install release chart --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.AddRepo()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Test_DecryptSecret(t *testing.T) { | ||||||
|  | 	var buffer bytes.Buffer | ||||||
|  | 	helm := NewMockExec(&buffer, "dev") | ||||||
|  | 	helm.DecryptSecret("secretName") | ||||||
|  | 	expected := "exec: helm secrets dec secretName --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.DecryptSecret()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Test_DiffRelease(t *testing.T) { | ||||||
|  | 	var buffer bytes.Buffer | ||||||
|  | 	helm := NewMockExec(&buffer, "dev") | ||||||
|  | 	helm.DiffRelease("release", "chart", "--timeout 10", "--wait") | ||||||
|  | 	expected := "exec: helm diff release chart --timeout 10 --wait --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.DiffRelease()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	buffer.Reset() | ||||||
|  | 	helm.DiffRelease("release", "chart") | ||||||
|  | 	expected = "exec: helm diff release chart --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.DiffRelease()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Test_DeleteRelease(t *testing.T) { | ||||||
|  | 	var buffer bytes.Buffer | ||||||
|  | 	helm := NewMockExec(&buffer, "dev") | ||||||
|  | 	helm.DeleteRelease("release") | ||||||
|  | 	expected := "exec: helm delete --purge release --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.DeleteRelease()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Test_exec(t *testing.T) { | ||||||
|  | 	var buffer bytes.Buffer | ||||||
|  | 	helm := NewMockExec(&buffer, "") | ||||||
|  | 	helm.exec("version") | ||||||
|  | 	expected := "exec: helm version\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.exec()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	helm = NewMockExec(nil, "dev") | ||||||
|  | 	ret, _ := helm.exec("diff") | ||||||
|  | 	if len(ret) != 0 { | ||||||
|  | 		t.Error("helmexec.exec() - expected empty return value") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	buffer.Reset() | ||||||
|  | 	helm = NewMockExec(&buffer, "dev") | ||||||
|  | 	helm.exec("diff", "release", "chart", "--timeout 10", "--wait") | ||||||
|  | 	expected = "exec: helm diff release chart --timeout 10 --wait --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.exec()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	buffer.Reset() | ||||||
|  | 	helm.exec("version") | ||||||
|  | 	expected = "exec: helm version --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.exec()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	buffer.Reset() | ||||||
|  | 	helm.SetExtraArgs("foo") | ||||||
|  | 	helm.exec("version") | ||||||
|  | 	expected = "exec: helm version foo --kube-context dev\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.exec()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -1,5 +1,7 @@ | ||||||
| package helmexec | package helmexec | ||||||
| 
 | 
 | ||||||
|  | import "io" | ||||||
|  | 
 | ||||||
| type Interface interface { | type Interface interface { | ||||||
| 	SetExtraArgs(args ...string) | 	SetExtraArgs(args ...string) | ||||||
| 
 | 
 | ||||||
|  | @ -11,4 +13,11 @@ type Interface interface { | ||||||
| 	DeleteRelease(name string) error | 	DeleteRelease(name string) error | ||||||
| 
 | 
 | ||||||
| 	DecryptSecret(name string) (string, error) | 	DecryptSecret(name string) (string, error) | ||||||
|  | 
 | ||||||
|  | 	// unit testing
 | ||||||
|  | 	exec(args ...string) ([]byte, error) | ||||||
|  | 	setRunner(runner Runner) | ||||||
|  | 	getExtra() []string | ||||||
|  | 	getKubeContent() string | ||||||
|  | 	getWriter() io.Writer | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,30 @@ | ||||||
|  | package helmexec | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"os" | ||||||
|  | 	"os/exec" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	tmpPrefix = "helmfile-" | ||||||
|  | 	tmpSuffix = "-exec" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type Runner interface { | ||||||
|  | 	Execute(cmd string, args []string) ([]byte, error) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type CliRunner struct {} | ||||||
|  | 
 | ||||||
|  | func (cli CliRunner) Execute(cmd string, args []string) ([]byte, error) { | ||||||
|  | 	dir, err := ioutil.TempDir("", tmpPrefix + cmd + tmpSuffix) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer os.RemoveAll(dir) | ||||||
|  | 
 | ||||||
|  | 	preparedCmd := exec.Command(cmd, args...) | ||||||
|  | 	preparedCmd.Dir = dir | ||||||
|  | 	return preparedCmd.CombinedOutput() | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue