github.com/khulnasoft/cli@v0.0.0-20240402070845-01bcad7beefa/cli/command/image/remove_test.go (about)

     1  package image
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"testing"
     7  
     8  	"github.com/docker/docker/api/types/image"
     9  	"github.com/khulnasoft/cli/internal/test"
    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  }