-
Notifications
You must be signed in to change notification settings - Fork 66
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Unit tests for cli/commands/image (except build and tag)
Signed-off-by: Ignacio Capurro <[email protected]>
- Loading branch information
Showing
58 changed files
with
1,445 additions
and
123 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
package image | ||
|
||
import ( | ||
"io" | ||
"io/ioutil" | ||
"strings" | ||
"time" | ||
|
||
"github.com/docker/docker/api/types" | ||
"github.com/docker/docker/api/types/filters" | ||
"github.com/docker/docker/api/types/image" | ||
"github.com/docker/docker/client" | ||
"golang.org/x/net/context" | ||
) | ||
|
||
type fakeClient struct { | ||
client.Client | ||
imageTagFunc func(string, string) error | ||
imageSaveFunc func(images []string) (io.ReadCloser, error) | ||
imageRemoveFunc func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) | ||
imagePushFunc func(ref string, options types.ImagePushOptions) (io.ReadCloser, error) | ||
infoFunc func() (types.Info, error) | ||
imagePullFunc func(ref string, options types.ImagePullOptions) (io.ReadCloser, error) | ||
imagesPruneFunc func(pruneFilter filters.Args) (types.ImagesPruneReport, error) | ||
imageLoadFunc func(input io.Reader, quiet bool) (types.ImageLoadResponse, error) | ||
imageListFunc func(options types.ImageListOptions) ([]types.ImageSummary, error) | ||
imageInspectFunc func(image string) (types.ImageInspect, []byte, error) | ||
imageImportFunc func(source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error) | ||
imageHistoryFunc func(image string) ([]image.HistoryResponseItem, error) | ||
} | ||
|
||
func (cli *fakeClient) ImageTag(_ context.Context, image, ref string) error { | ||
if cli.imageTagFunc != nil { | ||
return cli.imageTagFunc(image, ref) | ||
} | ||
return nil | ||
} | ||
|
||
func (cli *fakeClient) ImageSave(_ context.Context, images []string) (io.ReadCloser, error) { | ||
if cli.imageSaveFunc != nil { | ||
return cli.imageSaveFunc(images) | ||
} | ||
return ioutil.NopCloser(strings.NewReader("")), nil | ||
} | ||
|
||
func (cli *fakeClient) ImageRemove(_ context.Context, image string, | ||
options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) { | ||
if cli.imageRemoveFunc != nil { | ||
return cli.imageRemoveFunc(image, options) | ||
} | ||
return []types.ImageDeleteResponseItem{}, nil | ||
} | ||
|
||
func (cli *fakeClient) ImagePush(_ context.Context, ref string, options types.ImagePushOptions) (io.ReadCloser, error) { | ||
if cli.imagePushFunc != nil { | ||
return cli.imagePushFunc(ref, options) | ||
} | ||
return ioutil.NopCloser(strings.NewReader("")), nil | ||
} | ||
|
||
func (cli *fakeClient) Info(_ context.Context) (types.Info, error) { | ||
if cli.infoFunc != nil { | ||
return cli.infoFunc() | ||
} | ||
return types.Info{}, nil | ||
} | ||
|
||
func (cli *fakeClient) ImagePull(_ context.Context, ref string, options types.ImagePullOptions) (io.ReadCloser, error) { | ||
if cli.imagePullFunc != nil { | ||
cli.imagePullFunc(ref, options) | ||
} | ||
return ioutil.NopCloser(strings.NewReader("")), nil | ||
} | ||
|
||
func (cli *fakeClient) ImagesPrune(_ context.Context, pruneFilter filters.Args) (types.ImagesPruneReport, error) { | ||
if cli.imagesPruneFunc != nil { | ||
return cli.imagesPruneFunc(pruneFilter) | ||
} | ||
return types.ImagesPruneReport{}, nil | ||
} | ||
|
||
func (cli *fakeClient) ImageLoad(_ context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) { | ||
if cli.imageLoadFunc != nil { | ||
return cli.imageLoadFunc(input, quiet) | ||
} | ||
return types.ImageLoadResponse{}, nil | ||
} | ||
|
||
func (cli *fakeClient) ImageList(ctx context.Context, options types.ImageListOptions) ([]types.ImageSummary, error) { | ||
if cli.imageListFunc != nil { | ||
return cli.imageListFunc(options) | ||
} | ||
return []types.ImageSummary{{}}, nil | ||
} | ||
|
||
func (cli *fakeClient) ImageInspectWithRaw(_ context.Context, image string) (types.ImageInspect, []byte, error) { | ||
if cli.imageInspectFunc != nil { | ||
return cli.imageInspectFunc(image) | ||
} | ||
return types.ImageInspect{}, nil, nil | ||
} | ||
|
||
func (cli *fakeClient) ImageImport(_ context.Context, source types.ImageImportSource, ref string, | ||
options types.ImageImportOptions) (io.ReadCloser, error) { | ||
if cli.imageImportFunc != nil { | ||
return cli.imageImportFunc(source, ref, options) | ||
} | ||
return ioutil.NopCloser(strings.NewReader("")), nil | ||
} | ||
|
||
func (cli *fakeClient) ImageHistory(_ context.Context, img string) ([]image.HistoryResponseItem, error) { | ||
if cli.imageHistoryFunc != nil { | ||
return cli.imageHistoryFunc(img) | ||
} | ||
return []image.HistoryResponseItem{{ID: img, Created: time.Now().Unix()}}, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
package image | ||
|
||
import ( | ||
"bytes" | ||
"fmt" | ||
"io/ioutil" | ||
"regexp" | ||
"testing" | ||
"time" | ||
|
||
"github.com/docker/docker/api/types/image" | ||
"github.com/docker/docker/cli/internal/test" | ||
"github.com/docker/docker/pkg/testutil" | ||
"github.com/docker/docker/pkg/testutil/golden" | ||
"github.com/pkg/errors" | ||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
func TestNewHistoryCommandErrors(t *testing.T) { | ||
testCases := []struct { | ||
name string | ||
args []string | ||
expectedError string | ||
imageHistoryFunc func(img string) ([]image.HistoryResponseItem, error) | ||
}{ | ||
{ | ||
name: "wrong-args", | ||
args: []string{}, | ||
expectedError: "requires exactly 1 argument(s).", | ||
}, | ||
{ | ||
name: "client-error", | ||
args: []string{"image:tag"}, | ||
expectedError: "something went wrong", | ||
imageHistoryFunc: func(img string) ([]image.HistoryResponseItem, error) { | ||
return []image.HistoryResponseItem{{}}, errors.Errorf("something went wrong") | ||
}, | ||
}, | ||
} | ||
for _, tc := range testCases { | ||
buf := new(bytes.Buffer) | ||
cmd := NewHistoryCommand(test.NewFakeCli(&fakeClient{imageHistoryFunc: tc.imageHistoryFunc}, buf)) | ||
cmd.SetOutput(ioutil.Discard) | ||
cmd.SetArgs(tc.args) | ||
testutil.ErrorContains(t, cmd.Execute(), tc.expectedError) | ||
} | ||
} | ||
|
||
func TestNewHistoryCommandSuccess(t *testing.T) { | ||
testCases := []struct { | ||
name string | ||
args []string | ||
outputRegex string | ||
imageHistoryFunc func(img string) ([]image.HistoryResponseItem, error) | ||
}{ | ||
{ | ||
name: "simple", | ||
args: []string{"image:tag"}, | ||
imageHistoryFunc: func(img string) ([]image.HistoryResponseItem, error) { | ||
return []image.HistoryResponseItem{{ | ||
ID: "1234567890123456789", | ||
Created: time.Now().Unix(), | ||
}}, nil | ||
}, | ||
}, | ||
{ | ||
name: "quiet", | ||
args: []string{"--quiet", "image:tag"}, | ||
}, | ||
// TODO: This test is failing since the output does not contain an RFC3339 date | ||
//{ | ||
// name: "non-human", | ||
// args: []string{"--human=false", "image:tag"}, | ||
// outputRegex: "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}", // RFC3339 date format match | ||
//}, | ||
{ | ||
name: "non-human-header", | ||
args: []string{"--human=false", "image:tag"}, | ||
outputRegex: "CREATED\\sAT", | ||
}, | ||
{ | ||
name: "quiet-no-trunc", | ||
args: []string{"--quiet", "--no-trunc", "image:tag"}, | ||
imageHistoryFunc: func(img string) ([]image.HistoryResponseItem, error) { | ||
return []image.HistoryResponseItem{{ | ||
ID: "1234567890123456789", | ||
Created: time.Now().Unix(), | ||
}}, nil | ||
}, | ||
}, | ||
} | ||
for _, tc := range testCases { | ||
buf := new(bytes.Buffer) | ||
cmd := NewHistoryCommand(test.NewFakeCli(&fakeClient{imageHistoryFunc: tc.imageHistoryFunc}, buf)) | ||
cmd.SetOutput(ioutil.Discard) | ||
cmd.SetArgs(tc.args) | ||
err := cmd.Execute() | ||
assert.NoError(t, err) | ||
actual := buf.String() | ||
if tc.outputRegex == "" { | ||
expected := string(golden.Get(t, []byte(actual), fmt.Sprintf("history-command-success.%s.golden", tc.name))[:]) | ||
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, expected) | ||
} else { | ||
match, _ := regexp.MatchString(tc.outputRegex, actual) | ||
assert.Equal(t, match, true) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.