From 46d762176eafb748b2094bd518ecf66d86388779 Mon Sep 17 00:00:00 2001
From: baude <bbaude@redhat.com>
Date: Wed, 1 Nov 2017 16:44:08 -0500
Subject: create_cli_test.go: Unittests

Create unittests for the create_cli helper functions. As
such, remove cli context usage from the functions to
further divide between cli input and parsing.  Also, simplifies
unit testing.

Signed-off-by: baude <bbaude@redhat.com>
---
 cmd/kpod/create.go          |  5 +--
 cmd/kpod/create_cli.go      | 18 ++++++---
 cmd/kpod/create_cli_test.go | 98 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 112 insertions(+), 9 deletions(-)
 create mode 100644 cmd/kpod/create_cli_test.go

(limited to 'cmd')

diff --git a/cmd/kpod/create.go b/cmd/kpod/create.go
index 9d4d08b08..545714c68 100644
--- a/cmd/kpod/create.go
+++ b/cmd/kpod/create.go
@@ -252,13 +252,12 @@ func parseCreateOpts(c *cli.Context, runtime *libpod.Runtime) (*createConfig, er
 	}
 
 	// LABEL VARIABLES
-	labels, err := getAllLabels(c)
+	labels, err := getAllLabels(c.StringSlice("label-file"), c.StringSlice("labels"))
 	if err != nil {
 		return &createConfig{}, errors.Wrapf(err, "unable to process labels")
 	}
 	// ENVIRONMENT VARIABLES
-	// TODO where should env variables be verified to be x=y format
-	env, err := getAllEnvironmentVariables(c)
+	env, err := getAllEnvironmentVariables(c.StringSlice("env-file"), c.StringSlice("env"))
 	if err != nil {
 		return &createConfig{}, errors.Wrapf(err, "unable to process environment variables")
 	}
diff --git a/cmd/kpod/create_cli.go b/cmd/kpod/create_cli.go
index 996155ba0..1cc00adc5 100644
--- a/cmd/kpod/create_cli.go
+++ b/cmd/kpod/create_cli.go
@@ -4,13 +4,12 @@ import (
 	"strings"
 
 	"github.com/pkg/errors"
-	"github.com/urfave/cli"
 )
 
-func getAllLabels(cli *cli.Context) (map[string]string, error) {
+func getAllLabels(labelFile, inputLabels []string) (map[string]string, error) {
 	var labelValues []string
 	labels := make(map[string]string)
-	labelValues, labelErr := readKVStrings(cli.StringSlice("label-file"), cli.StringSlice("label"))
+	labelValues, labelErr := readKVStrings(labelFile, inputLabels)
 	if labelErr != nil {
 		return labels, errors.Wrapf(labelErr, "unable to process labels from --label and label-file")
 	}
@@ -18,7 +17,7 @@ func getAllLabels(cli *cli.Context) (map[string]string, error) {
 	if len(labelValues) > 0 {
 		for _, i := range labelValues {
 			spliti := strings.Split(i, "=")
-			if len(spliti) > 1 {
+			if len(spliti) < 2 {
 				return labels, errors.Errorf("labels must be in KEY=VALUE format: %s is invalid", i)
 			}
 			labels[spliti[0]] = spliti[1]
@@ -27,8 +26,8 @@ func getAllLabels(cli *cli.Context) (map[string]string, error) {
 	return labels, nil
 }
 
-func getAllEnvironmentVariables(cli *cli.Context) ([]string, error) {
-	env, err := readKVStrings(cli.StringSlice("env-file"), cli.StringSlice("env"))
+func getAllEnvironmentVariables(envFiles, envInput []string) ([]string, error) {
+	env, err := readKVStrings(envFiles, envInput)
 	if err != nil {
 		return []string{}, errors.Wrapf(err, "unable to process variables from --env and --env-file")
 	}
@@ -36,6 +35,13 @@ func getAllEnvironmentVariables(cli *cli.Context) ([]string, error) {
 	if len(env) == 0 {
 		env = append(env, defaultEnvVariables...)
 	}
+	// Each environment variable must be in the K=V format
+	for _,i := range env{
+		spliti := strings.Split(i, "=")
+		if len(spliti) != 2 {
+			return env, errors.Errorf("environment variables must be in the format KEY=VALUE: %s is invalid", i)
+		}
+	}
 	return env, nil
 }
 
diff --git a/cmd/kpod/create_cli_test.go b/cmd/kpod/create_cli_test.go
new file mode 100644
index 000000000..928a5ce05
--- /dev/null
+++ b/cmd/kpod/create_cli_test.go
@@ -0,0 +1,98 @@
+package main
+
+import (
+	"github.com/stretchr/testify/assert"
+	"io/ioutil"
+	"os"
+	"testing"
+)
+
+var (
+	Var1 = []string{"ONE=1", "TWO=2"}
+)
+
+func createTmpFile(content []byte) (string, error) {
+	tmpfile, err := ioutil.TempFile(os.TempDir(), "unittest")
+	if err != nil {
+		return "", err
+	}
+
+	if _, err := tmpfile.Write(content); err != nil {
+		return "", err
+
+	}
+	if err := tmpfile.Close(); err != nil {
+		return "", err
+	}
+	return tmpfile.Name(), nil
+}
+
+func TestConvertStringSliceToMap(t *testing.T) {
+	strSlice := []string{"BLAU=BLUE", "GELB=YELLOW"}
+	result, _ := convertStringSliceToMap(strSlice, "=")
+	assert.Equal(t, result["BLAU"], "BLUE")
+}
+
+func TestConvertStringSliceToMapBadData(t *testing.T) {
+	strSlice := []string{"BLAU=BLUE", "GELB^YELLOW"}
+	_, err := convertStringSliceToMap(strSlice, "=")
+	assert.Error(t, err)
+}
+
+func TestGetAllLabels(t *testing.T) {
+	fileLabels := []string{}
+	labels, _ := getAllLabels(fileLabels, Var1)
+	assert.Equal(t, len(labels), 2)
+}
+
+func TestGetAllLabelsBadKeyValue(t *testing.T) {
+	inLabels := []string{"ONE1", "TWO=2"}
+	fileLabels := []string{}
+	_, err := getAllLabels(fileLabels, inLabels)
+	assert.Error(t, err, assert.AnError)
+}
+
+func TestGetAllLabelsBadLabelFile(t *testing.T) {
+	fileLabels := []string{"/foobar5001/be"}
+	_, err := getAllLabels(fileLabels, Var1)
+	assert.Error(t, err, assert.AnError)
+}
+
+func TestGetAllLabelsFile(t *testing.T) {
+	content := []byte("THREE=3")
+	tFile, err := createTmpFile(content)
+	defer os.Remove(tFile)
+	assert.NoError(t, err)
+	fileLabels := []string{tFile}
+	result, _ := getAllLabels(fileLabels, Var1)
+	assert.Equal(t, len(result), 3)
+}
+
+func TestGetAllEnvironmentVariables(t *testing.T) {
+	fileEnvs := []string{}
+	result, _ := getAllEnvironmentVariables(fileEnvs, Var1)
+	assert.Equal(t, len(result), 2)
+}
+
+func TestGetAllEnvironmentVariablesBadKeyValue(t *testing.T) {
+	inEnvs := []string{"ONE1", "TWO=2"}
+	fileEnvs := []string{}
+	_, err := getAllEnvironmentVariables(fileEnvs, inEnvs)
+	assert.Error(t, err, assert.AnError)
+}
+
+func TestGetAllEnvironmentVariablesBadEnvFile(t *testing.T) {
+	fileEnvs := []string{"/foobar5001/be"}
+	_, err := getAllEnvironmentVariables(fileEnvs, Var1)
+	assert.Error(t, err, assert.AnError)
+}
+
+func TestGetAllEnvironmentVariablesFile(t *testing.T) {
+	content := []byte("THREE=3")
+	tFile, err := createTmpFile(content)
+	defer os.Remove(tFile)
+	assert.NoError(t, err)
+	fileEnvs := []string{tFile}
+	result, _ := getAllEnvironmentVariables(fileEnvs, Var1)
+	assert.Equal(t, len(result), 3)
+}
-- 
cgit v1.2.3-54-g00ecf