github.com/thajeztah/cli@v0.0.0-20240223162942-dc6bfac81a8b/cli/command/image/prune_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"
    10  	"github.com/docker/docker/api/types/filters"
    11  	"github.com/docker/docker/api/types/image"
    12  	"github.com/pkg/errors"
    13  	"gotest.tools/v3/assert"
    14  	is "gotest.tools/v3/assert/cmp"
    15  	"gotest.tools/v3/golden"
    16  )
    17  
    18  func TestNewPruneCommandErrors(t *testing.T) {
    19  	testCases := []struct {
    20  		name            string
    21  		args            []string
    22  		expectedError   string
    23  		imagesPruneFunc func(pruneFilter filters.Args) (types.ImagesPruneReport, error)
    24  	}{
    25  		{
    26  			name:          "wrong-args",
    27  			args:          []string{"something"},
    28  			expectedError: "accepts no arguments.",
    29  		},
    30  		{
    31  			name:          "prune-error",
    32  			args:          []string{"--force"},
    33  			expectedError: "something went wrong",
    34  			imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
    35  				return types.ImagesPruneReport{}, errors.Errorf("something went wrong")
    36  			},
    37  		},
    38  	}
    39  	for _, tc := range testCases {
    40  		cmd := NewPruneCommand(test.NewFakeCli(&fakeClient{
    41  			imagesPruneFunc: tc.imagesPruneFunc,
    42  		}))
    43  		cmd.SetOut(io.Discard)
    44  		cmd.SetArgs(tc.args)
    45  		assert.ErrorContains(t, cmd.Execute(), tc.expectedError)
    46  	}
    47  }
    48  
    49  func TestNewPruneCommandSuccess(t *testing.T) {
    50  	testCases := []struct {
    51  		name            string
    52  		args            []string
    53  		imagesPruneFunc func(pruneFilter filters.Args) (types.ImagesPruneReport, error)
    54  	}{
    55  		{
    56  			name: "all",
    57  			args: []string{"--all"},
    58  			imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
    59  				assert.Check(t, is.Equal("false", pruneFilter.Get("dangling")[0]))
    60  				return types.ImagesPruneReport{}, nil
    61  			},
    62  		},
    63  		{
    64  			name: "force-deleted",
    65  			args: []string{"--force"},
    66  			imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
    67  				assert.Check(t, is.Equal("true", pruneFilter.Get("dangling")[0]))
    68  				return types.ImagesPruneReport{
    69  					ImagesDeleted:  []image.DeleteResponse{{Deleted: "image1"}},
    70  					SpaceReclaimed: 1,
    71  				}, nil
    72  			},
    73  		},
    74  		{
    75  			name: "label-filter",
    76  			args: []string{"--force", "--filter", "label=foobar"},
    77  			imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
    78  				assert.Check(t, is.Equal("foobar", pruneFilter.Get("label")[0]))
    79  				return types.ImagesPruneReport{}, nil
    80  			},
    81  		},
    82  		{
    83  			name: "force-untagged",
    84  			args: []string{"--force"},
    85  			imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
    86  				assert.Check(t, is.Equal("true", pruneFilter.Get("dangling")[0]))
    87  				return types.ImagesPruneReport{
    88  					ImagesDeleted:  []image.DeleteResponse{{Untagged: "image1"}},
    89  					SpaceReclaimed: 2,
    90  				}, nil
    91  			},
    92  		},
    93  	}
    94  	for _, tc := range testCases {
    95  		cli := test.NewFakeCli(&fakeClient{imagesPruneFunc: tc.imagesPruneFunc})
    96  		cmd := NewPruneCommand(cli)
    97  		cmd.SetOut(io.Discard)
    98  		cmd.SetArgs(tc.args)
    99  		err := cmd.Execute()
   100  		assert.NilError(t, err)
   101  		golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("prune-command-success.%s.golden", tc.name))
   102  	}
   103  }