Skip to content

Commit 1856229

Browse files
authored
Merge pull request #5506 from Stavrospanakakis/cli-container-testing
command: add tests for container kill, commit, and pause
2 parents eb53046 + 442c386 commit 1856229

4 files changed

Lines changed: 227 additions & 0 deletions

File tree

cli/command/container/client_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ type fakeClient struct {
4242
containerAttachFunc func(ctx context.Context, containerID string, options container.AttachOptions) (types.HijackedResponse, error)
4343
containerDiffFunc func(ctx context.Context, containerID string) ([]container.FilesystemChange, error)
4444
containerRenameFunc func(ctx context.Context, oldName, newName string) error
45+
containerCommitFunc func(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error)
46+
containerPauseFunc func(ctx context.Context, container string) error
4547
Version string
4648
}
4749

@@ -215,3 +217,18 @@ func (f *fakeClient) ContainerRename(ctx context.Context, oldName, newName strin
215217

216218
return nil
217219
}
220+
221+
func (f *fakeClient) ContainerCommit(ctx context.Context, containerID string, options container.CommitOptions) (types.IDResponse, error) {
222+
if f.containerCommitFunc != nil {
223+
return f.containerCommitFunc(ctx, containerID, options)
224+
}
225+
return types.IDResponse{}, nil
226+
}
227+
228+
func (f *fakeClient) ContainerPause(ctx context.Context, containerID string) error {
229+
if f.containerPauseFunc != nil {
230+
return f.containerPauseFunc(ctx, containerID)
231+
}
232+
233+
return nil
234+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package container
2+
3+
import (
4+
"context"
5+
"io"
6+
"testing"
7+
8+
"github.com/docker/cli/internal/test"
9+
"github.com/docker/docker/api/types"
10+
"github.com/docker/docker/api/types/container"
11+
"github.com/pkg/errors"
12+
"gotest.tools/v3/assert"
13+
is "gotest.tools/v3/assert/cmp"
14+
)
15+
16+
func TestRunCommit(t *testing.T) {
17+
cli := test.NewFakeCli(&fakeClient{
18+
containerCommitFunc: func(
19+
ctx context.Context,
20+
container string,
21+
options container.CommitOptions,
22+
) (types.IDResponse, error) {
23+
assert.Check(t, is.Equal(options.Author, "Author Name <author@name.com>"))
24+
assert.Check(t, is.DeepEqual(options.Changes, []string{"EXPOSE 80"}))
25+
assert.Check(t, is.Equal(options.Comment, "commit message"))
26+
assert.Check(t, is.Equal(options.Pause, false))
27+
assert.Check(t, is.Equal(container, "container-id"))
28+
29+
return types.IDResponse{ID: "image-id"}, nil
30+
},
31+
})
32+
33+
cmd := NewCommitCommand(cli)
34+
cmd.SetOut(io.Discard)
35+
cmd.SetArgs(
36+
[]string{
37+
"--author", "Author Name <author@name.com>",
38+
"--change", "EXPOSE 80",
39+
"--message", "commit message",
40+
"--pause=false",
41+
"container-id",
42+
},
43+
)
44+
45+
err := cmd.Execute()
46+
assert.NilError(t, err)
47+
48+
assert.Assert(t, is.Equal(cli.OutBuffer().String(), "image-id\n"))
49+
}
50+
51+
func TestRunCommitClientError(t *testing.T) {
52+
clientError := errors.New("client error")
53+
54+
cli := test.NewFakeCli(&fakeClient{
55+
containerCommitFunc: func(
56+
ctx context.Context,
57+
container string,
58+
options container.CommitOptions,
59+
) (types.IDResponse, error) {
60+
return types.IDResponse{}, clientError
61+
},
62+
})
63+
64+
cmd := NewCommitCommand(cli)
65+
cmd.SetOut(io.Discard)
66+
cmd.SetErr(io.Discard)
67+
cmd.SetArgs([]string{"container-id"})
68+
69+
err := cmd.Execute()
70+
assert.ErrorIs(t, err, clientError)
71+
}

cli/command/container/kill_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package container
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"strings"
8+
"testing"
9+
10+
"github.com/docker/cli/internal/test"
11+
"gotest.tools/v3/assert"
12+
is "gotest.tools/v3/assert/cmp"
13+
)
14+
15+
func TestRunKill(t *testing.T) {
16+
cli := test.NewFakeCli(&fakeClient{
17+
containerKillFunc: func(
18+
ctx context.Context,
19+
container string,
20+
signal string,
21+
) error {
22+
assert.Assert(t, is.Equal(signal, "STOP"))
23+
return nil
24+
},
25+
})
26+
27+
cmd := NewKillCommand(cli)
28+
cmd.SetOut(io.Discard)
29+
30+
cmd.SetArgs([]string{
31+
"--signal", "STOP",
32+
"container-id-1",
33+
"container-id-2",
34+
})
35+
err := cmd.Execute()
36+
assert.NilError(t, err)
37+
38+
containerIDs := strings.SplitN(cli.OutBuffer().String(), "\n", 2)
39+
assert.Assert(t, is.Len(containerIDs, 2))
40+
41+
containerID1 := strings.TrimSpace(containerIDs[0])
42+
containerID2 := strings.TrimSpace(containerIDs[1])
43+
44+
assert.Check(t, is.Equal(containerID1, "container-id-1"))
45+
assert.Check(t, is.Equal(containerID2, "container-id-2"))
46+
}
47+
48+
func TestRunKillClientError(t *testing.T) {
49+
cli := test.NewFakeCli(&fakeClient{
50+
containerKillFunc: func(
51+
ctx context.Context,
52+
container string,
53+
signal string,
54+
) error {
55+
return fmt.Errorf("client error for container %s", container)
56+
},
57+
})
58+
59+
cmd := NewKillCommand(cli)
60+
cmd.SetOut(io.Discard)
61+
cmd.SetErr(io.Discard)
62+
63+
cmd.SetArgs([]string{"container-id-1", "container-id-2"})
64+
err := cmd.Execute()
65+
66+
errs := strings.SplitN(err.Error(), "\n", 2)
67+
assert.Assert(t, is.Len(errs, 2))
68+
69+
errContainerID1 := errs[0]
70+
errContainerID2 := errs[1]
71+
72+
assert.Assert(t, is.Equal(errContainerID1, "client error for container container-id-1"))
73+
assert.Assert(t, is.Equal(errContainerID2, "client error for container container-id-2"))
74+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package container
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"strings"
8+
"testing"
9+
10+
"github.com/docker/cli/internal/test"
11+
"gotest.tools/v3/assert"
12+
is "gotest.tools/v3/assert/cmp"
13+
)
14+
15+
func TestRunPause(t *testing.T) {
16+
cli := test.NewFakeCli(
17+
&fakeClient{
18+
containerPauseFunc: func(ctx context.Context, container string) error {
19+
return nil
20+
},
21+
},
22+
)
23+
24+
cmd := NewPauseCommand(cli)
25+
cmd.SetOut(io.Discard)
26+
cmd.SetArgs([]string{"container-id-1", "container-id-2"})
27+
28+
err := cmd.Execute()
29+
assert.NilError(t, err)
30+
31+
containerIDs := strings.SplitN(cli.OutBuffer().String(), "\n", 2)
32+
assert.Assert(t, is.Len(containerIDs, 2))
33+
34+
containerID1 := strings.TrimSpace(containerIDs[0])
35+
containerID2 := strings.TrimSpace(containerIDs[1])
36+
37+
assert.Check(t, is.Equal(containerID1, "container-id-1"))
38+
assert.Check(t, is.Equal(containerID2, "container-id-2"))
39+
}
40+
41+
func TestRunPauseClientError(t *testing.T) {
42+
cli := test.NewFakeCli(
43+
&fakeClient{
44+
containerPauseFunc: func(ctx context.Context, container string) error {
45+
return fmt.Errorf("client error for container %s", container)
46+
},
47+
},
48+
)
49+
50+
cmd := NewPauseCommand(cli)
51+
cmd.SetOut(io.Discard)
52+
cmd.SetErr(io.Discard)
53+
cmd.SetArgs([]string{"container-id-1", "container-id-2"})
54+
55+
err := cmd.Execute()
56+
57+
errs := strings.SplitN(err.Error(), "\n", 2)
58+
assert.Assert(t, is.Len(errs, 2))
59+
60+
errContainerID1 := errs[0]
61+
errContainerID2 := errs[1]
62+
63+
assert.Assert(t, is.Equal(errContainerID1, "client error for container container-id-1"))
64+
assert.Assert(t, is.Equal(errContainerID2, "client error for container container-id-2"))
65+
}

0 commit comments

Comments
 (0)