diff --git a/cli/command/container/client_test.go b/cli/command/container/client_test.go index a9e0b89f48..a2918a82d7 100644 --- a/cli/command/container/client_test.go +++ b/cli/command/container/client_test.go @@ -42,6 +42,8 @@ type fakeClient struct { containerAttachFunc func(ctx context.Context, containerID string, options container.AttachOptions) (types.HijackedResponse, error) containerDiffFunc func(ctx context.Context, containerID string) ([]container.FilesystemChange, error) containerRenameFunc func(ctx context.Context, oldName, newName string) error + containerCommitFunc func(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error) + containerPauseFunc func(ctx context.Context, container string) error Version string } @@ -215,3 +217,18 @@ func (f *fakeClient) ContainerRename(ctx context.Context, oldName, newName strin return nil } + +func (f *fakeClient) ContainerCommit(ctx context.Context, containerID string, options container.CommitOptions) (types.IDResponse, error) { + if f.containerCommitFunc != nil { + return f.containerCommitFunc(ctx, containerID, options) + } + return types.IDResponse{}, nil +} + +func (f *fakeClient) ContainerPause(ctx context.Context, containerID string) error { + if f.containerPauseFunc != nil { + return f.containerPauseFunc(ctx, containerID) + } + + return nil +} diff --git a/cli/command/container/commit_test.go b/cli/command/container/commit_test.go new file mode 100644 index 0000000000..a9127035a2 --- /dev/null +++ b/cli/command/container/commit_test.go @@ -0,0 +1,71 @@ +package container + +import ( + "context" + "io" + "testing" + + "github.com/docker/cli/internal/test" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/pkg/errors" + "gotest.tools/v3/assert" + is "gotest.tools/v3/assert/cmp" +) + +func TestRunCommit(t *testing.T) { + cli := test.NewFakeCli(&fakeClient{ + containerCommitFunc: func( + ctx context.Context, + container string, + options container.CommitOptions, + ) (types.IDResponse, error) { + assert.Check(t, is.Equal(options.Author, "Author Name ")) + assert.Check(t, is.DeepEqual(options.Changes, []string{"EXPOSE 80"})) + assert.Check(t, is.Equal(options.Comment, "commit message")) + assert.Check(t, is.Equal(options.Pause, false)) + assert.Check(t, is.Equal(container, "container-id")) + + return types.IDResponse{ID: "image-id"}, nil + }, + }) + + cmd := NewCommitCommand(cli) + cmd.SetOut(io.Discard) + cmd.SetArgs( + []string{ + "--author", "Author Name ", + "--change", "EXPOSE 80", + "--message", "commit message", + "--pause=false", + "container-id", + }, + ) + + err := cmd.Execute() + assert.NilError(t, err) + + assert.Assert(t, is.Equal(cli.OutBuffer().String(), "image-id\n")) +} + +func TestRunCommitClientError(t *testing.T) { + clientError := errors.New("client error") + + cli := test.NewFakeCli(&fakeClient{ + containerCommitFunc: func( + ctx context.Context, + container string, + options container.CommitOptions, + ) (types.IDResponse, error) { + return types.IDResponse{}, clientError + }, + }) + + cmd := NewCommitCommand(cli) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + cmd.SetArgs([]string{"container-id"}) + + err := cmd.Execute() + assert.ErrorIs(t, err, clientError) +} diff --git a/cli/command/container/kill_test.go b/cli/command/container/kill_test.go new file mode 100644 index 0000000000..7bd1f10b92 --- /dev/null +++ b/cli/command/container/kill_test.go @@ -0,0 +1,74 @@ +package container + +import ( + "context" + "fmt" + "io" + "strings" + "testing" + + "github.com/docker/cli/internal/test" + "gotest.tools/v3/assert" + is "gotest.tools/v3/assert/cmp" +) + +func TestRunKill(t *testing.T) { + cli := test.NewFakeCli(&fakeClient{ + containerKillFunc: func( + ctx context.Context, + container string, + signal string, + ) error { + assert.Assert(t, is.Equal(signal, "STOP")) + return nil + }, + }) + + cmd := NewKillCommand(cli) + cmd.SetOut(io.Discard) + + cmd.SetArgs([]string{ + "--signal", "STOP", + "container-id-1", + "container-id-2", + }) + err := cmd.Execute() + assert.NilError(t, err) + + containerIDs := strings.SplitN(cli.OutBuffer().String(), "\n", 2) + assert.Assert(t, is.Len(containerIDs, 2)) + + containerID1 := strings.TrimSpace(containerIDs[0]) + containerID2 := strings.TrimSpace(containerIDs[1]) + + assert.Check(t, is.Equal(containerID1, "container-id-1")) + assert.Check(t, is.Equal(containerID2, "container-id-2")) +} + +func TestRunKillClientError(t *testing.T) { + cli := test.NewFakeCli(&fakeClient{ + containerKillFunc: func( + ctx context.Context, + container string, + signal string, + ) error { + return fmt.Errorf("client error for container %s", container) + }, + }) + + cmd := NewKillCommand(cli) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + cmd.SetArgs([]string{"container-id-1", "container-id-2"}) + err := cmd.Execute() + + errs := strings.SplitN(err.Error(), "\n", 2) + assert.Assert(t, is.Len(errs, 2)) + + errContainerID1 := errs[0] + errContainerID2 := errs[1] + + assert.Assert(t, is.Equal(errContainerID1, "client error for container container-id-1")) + assert.Assert(t, is.Equal(errContainerID2, "client error for container container-id-2")) +} diff --git a/cli/command/container/pause_test.go b/cli/command/container/pause_test.go new file mode 100644 index 0000000000..a359797a94 --- /dev/null +++ b/cli/command/container/pause_test.go @@ -0,0 +1,65 @@ +package container + +import ( + "context" + "fmt" + "io" + "strings" + "testing" + + "github.com/docker/cli/internal/test" + "gotest.tools/v3/assert" + is "gotest.tools/v3/assert/cmp" +) + +func TestRunPause(t *testing.T) { + cli := test.NewFakeCli( + &fakeClient{ + containerPauseFunc: func(ctx context.Context, container string) error { + return nil + }, + }, + ) + + cmd := NewPauseCommand(cli) + cmd.SetOut(io.Discard) + cmd.SetArgs([]string{"container-id-1", "container-id-2"}) + + err := cmd.Execute() + assert.NilError(t, err) + + containerIDs := strings.SplitN(cli.OutBuffer().String(), "\n", 2) + assert.Assert(t, is.Len(containerIDs, 2)) + + containerID1 := strings.TrimSpace(containerIDs[0]) + containerID2 := strings.TrimSpace(containerIDs[1]) + + assert.Check(t, is.Equal(containerID1, "container-id-1")) + assert.Check(t, is.Equal(containerID2, "container-id-2")) +} + +func TestRunPauseClientError(t *testing.T) { + cli := test.NewFakeCli( + &fakeClient{ + containerPauseFunc: func(ctx context.Context, container string) error { + return fmt.Errorf("client error for container %s", container) + }, + }, + ) + + cmd := NewPauseCommand(cli) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + cmd.SetArgs([]string{"container-id-1", "container-id-2"}) + + err := cmd.Execute() + + errs := strings.SplitN(err.Error(), "\n", 2) + assert.Assert(t, is.Len(errs, 2)) + + errContainerID1 := errs[0] + errContainerID2 := errs[1] + + assert.Assert(t, is.Equal(errContainerID1, "client error for container container-id-1")) + assert.Assert(t, is.Equal(errContainerID2, "client error for container container-id-2")) +}