Skip to content

Commit

Permalink
Add unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
dsimansk committed Jul 13, 2021
1 parent c210272 commit 9d7c9cd
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 21 deletions.
2 changes: 1 addition & 1 deletion pkg/kn/commands/container/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func NewContainerCreateCommand(p *commands.KnParams) *cobra.Command {
name = args[0]
}
// Detect pipe input from previous container command
if podSpecFlags.Containers == "" && detectPipeInput(os.Stdin) {
if detectPipeInput(os.Stdin) {
podSpecFlags.Containers = "-"
}
podSpec := &corev1.PodSpec{}
Expand Down
5 changes: 4 additions & 1 deletion pkg/kn/commands/container/create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func TestContainerCreate(t *testing.T) {
output, err := executeContainerCommand("create", "foo", "--image", "registry.foo:bar")
assert.NilError(t, err)
assert.Assert(t, len(output) > 0)
assert.Assert(t, util.ContainsAllIgnoreCase(output, "containers", "image", "registry.foo:bar"))
assert.Assert(t, util.ContainsAllIgnoreCase(output, "containers", "image", "foo", "registry.foo:bar"))
}

func TestDetectPipeInput(t *testing.T) {
Expand All @@ -45,4 +45,7 @@ func TestDetectPipeInput(t *testing.T) {
// os.Stdin is not piped
piped = detectPipeInput(os.Stdin)
assert.Assert(t, piped == false)

piped = detectPipeInput(nil)
assert.Assert(t, piped == false)
}
7 changes: 6 additions & 1 deletion pkg/kn/flags/podspec.go
Original file line number Diff line number Diff line change
Expand Up @@ -276,10 +276,15 @@ func (p *PodSpecFlags) ResolvePodSpec(podSpec *corev1.PodSpec, flags *pflag.Flag
}

if flags.Changed("containers") || p.Containers == "-" {
err = UpdateContainers(podSpec, p.Containers)
var fromFile *corev1.PodSpec
fromFile, err = decodeContainersFromFile(p.Containers)
if err != nil {
return err
}
if fromFile == nil {
println("fromFile is nil")
}
UpdateContainers(podSpec, fromFile.Containers)
}

return nil
Expand Down
39 changes: 21 additions & 18 deletions pkg/kn/flags/podspec_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -259,24 +259,8 @@ func UpdateImagePullSecrets(spec *corev1.PodSpec, pullsecrets string) {
}

// UpdateContainers updates the containers array with additional ones provided from file or os.Stdin
func UpdateContainers(spec *corev1.PodSpec, containers string) error {
var f *os.File
var err error
if containers == "-" {
f = os.Stdin
} else {
f, err = os.Open(containers)
if err != nil {
return err
}
}
podSpec := &corev1.PodSpec{}
decoder := yaml.NewYAMLOrJSONDecoder(f, 512)
if err = decoder.Decode(podSpec); err != nil {
return err
}
spec.Containers = append(spec.Containers, podSpec.Containers...)
return f.Close()
func UpdateContainers(spec *corev1.PodSpec, containers []corev1.Container) {
spec.Containers = append(spec.Containers, containers...)
}

// =======================================================================================
Expand Down Expand Up @@ -662,3 +646,22 @@ func reviseVolumesToRemove(volumeMounts []corev1.VolumeMount, volumesToRemove []
}
return volumesToRemove
}

func decodeContainersFromFile(filename string) (*corev1.PodSpec, error) {
var f *os.File
var err error
if filename == "-" {
f = os.Stdin
} else {
f, err = os.Open(filename)
if err != nil {
return nil, err
}
}
podSpec := &corev1.PodSpec{}
decoder := yaml.NewYAMLOrJSONDecoder(f, 512)
if err = decoder.Decode(podSpec); err != nil {
return nil, f.Close()
}
return podSpec, f.Close()
}
59 changes: 59 additions & 0 deletions pkg/kn/flags/podspec_helper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,13 @@ package flags

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

"knative.dev/client/lib/test"

"gotest.tools/v3/assert"
corev1 "k8s.io/api/core/v1"
"knative.dev/client/pkg/util"
Expand Down Expand Up @@ -763,3 +768,57 @@ func Test_isValidEnvValueFromArg(t *testing.T) {
})
}
}

func TestUpdateContainers(t *testing.T) {
podSpec, _ := getPodSpec()
containers := []corev1.Container{
{
Name: "foo",
Image: "foo:bar",
},
{
Name: "bar",
Image: "foo:bar",
},
}
UpdateContainers(podSpec, containers)
assert.Assert(t, len(podSpec.Containers) > 2)
}

func TestParseContainers(t *testing.T) {
rawInput := `
containers:
- image: first
name: foo
resources: {}
- image: second
name: bar
resources: {}`

stdinReader, stdinWriter, err := os.Pipe()
assert.NilError(t, err)
_, err = stdinWriter.Write([]byte(rawInput))
assert.NilError(t, err)
stdinWriter.Close()

origStdin := os.Stdin
defer func() { os.Stdin = origStdin }()
os.Stdin = stdinReader

fromFile, err := decodeContainersFromFile("-")
assert.NilError(t, err)
assert.Equal(t, len(fromFile.Containers), 2)

tempDir, err := ioutil.TempDir("", "kn-file")
defer os.RemoveAll(tempDir)
assert.NilError(t, err)
fileName := filepath.Join(tempDir, "container.yaml")
ioutil.WriteFile(fileName, []byte(rawInput), test.FileModeReadWrite)
fromFile, err = decodeContainersFromFile(fileName)
assert.NilError(t, err)
assert.Equal(t, len(fromFile.Containers), 2)

_, err = decodeContainersFromFile("non-existing")
assert.Assert(t, err != nil)
assert.Assert(t, util.ContainsAll(err.Error(), "no", "file", "directory"))
}

0 comments on commit 9d7c9cd

Please sign in to comment.