github.com/AliyunContainerService/cli@v0.0.0-20181009023821-814ced4b30d0/cli/command/image/remove_test.go (about) 1 package image 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "testing" 7 8 "github.com/docker/cli/internal/test" 9 "github.com/docker/docker/api/types" 10 "github.com/pkg/errors" 11 "gotest.tools/assert" 12 is "gotest.tools/assert/cmp" 13 "gotest.tools/golden" 14 ) 15 16 type notFound struct { 17 imageID string 18 } 19 20 func (n notFound) Error() string { 21 return fmt.Sprintf("Error: No such image: %s", n.imageID) 22 } 23 24 func (n notFound) NotFound() bool { 25 return true 26 } 27 28 func TestNewRemoveCommandAlias(t *testing.T) { 29 cmd := newRemoveCommand(test.NewFakeCli(&fakeClient{})) 30 assert.Check(t, cmd.HasAlias("rmi")) 31 assert.Check(t, cmd.HasAlias("remove")) 32 assert.Check(t, !cmd.HasAlias("other")) 33 } 34 35 func TestNewRemoveCommandErrors(t *testing.T) { 36 testCases := []struct { 37 name string 38 args []string 39 expectedError string 40 imageRemoveFunc func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) 41 }{ 42 { 43 name: "wrong args", 44 expectedError: "requires at least 1 argument.", 45 }, 46 { 47 name: "ImageRemove fail with force option", 48 args: []string{"-f", "image1"}, 49 expectedError: "error removing image", 50 imageRemoveFunc: func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) { 51 assert.Check(t, is.Equal("image1", image)) 52 return []types.ImageDeleteResponseItem{}, errors.Errorf("error removing image") 53 }, 54 }, 55 { 56 name: "ImageRemove fail", 57 args: []string{"arg1"}, 58 expectedError: "error removing image", 59 imageRemoveFunc: func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) { 60 assert.Check(t, !options.Force) 61 assert.Check(t, options.PruneChildren) 62 return []types.ImageDeleteResponseItem{}, errors.Errorf("error removing image") 63 }, 64 }, 65 } 66 for _, tc := range testCases { 67 t.Run(tc.name, func(t *testing.T) { 68 cmd := NewRemoveCommand(test.NewFakeCli(&fakeClient{ 69 imageRemoveFunc: tc.imageRemoveFunc, 70 })) 71 cmd.SetOutput(ioutil.Discard) 72 cmd.SetArgs(tc.args) 73 assert.ErrorContains(t, cmd.Execute(), tc.expectedError) 74 }) 75 } 76 } 77 78 func TestNewRemoveCommandSuccess(t *testing.T) { 79 testCases := []struct { 80 name string 81 args []string 82 imageRemoveFunc func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) 83 expectedStderr string 84 }{ 85 { 86 name: "Image Deleted", 87 args: []string{"image1"}, 88 imageRemoveFunc: func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) { 89 assert.Check(t, is.Equal("image1", image)) 90 return []types.ImageDeleteResponseItem{{Deleted: image}}, nil 91 }, 92 }, 93 { 94 name: "Image not found with force option", 95 args: []string{"-f", "image1"}, 96 imageRemoveFunc: func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) { 97 assert.Check(t, is.Equal("image1", image)) 98 assert.Check(t, is.Equal(true, options.Force)) 99 return []types.ImageDeleteResponseItem{}, notFound{"image1"} 100 }, 101 expectedStderr: "Error: No such image: image1\n", 102 }, 103 104 { 105 name: "Image Untagged", 106 args: []string{"image1"}, 107 imageRemoveFunc: func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) { 108 assert.Check(t, is.Equal("image1", image)) 109 return []types.ImageDeleteResponseItem{{Untagged: image}}, nil 110 }, 111 }, 112 { 113 name: "Image Deleted and Untagged", 114 args: []string{"image1", "image2"}, 115 imageRemoveFunc: func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) { 116 if image == "image1" { 117 return []types.ImageDeleteResponseItem{{Untagged: image}}, nil 118 } 119 return []types.ImageDeleteResponseItem{{Deleted: image}}, nil 120 }, 121 }, 122 } 123 for _, tc := range testCases { 124 t.Run(tc.name, func(t *testing.T) { 125 cli := test.NewFakeCli(&fakeClient{imageRemoveFunc: tc.imageRemoveFunc}) 126 cmd := NewRemoveCommand(cli) 127 cmd.SetOutput(ioutil.Discard) 128 cmd.SetArgs(tc.args) 129 assert.NilError(t, cmd.Execute()) 130 assert.Check(t, is.Equal(tc.expectedStderr, cli.ErrBuffer().String())) 131 golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("remove-command-success.%s.golden", tc.name)) 132 }) 133 } 134 }