github.com/ali-iotechsys/cli@v20.10.0+incompatible/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/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() 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.SetOut(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.SetOut(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  }