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