github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/image/prune_test.go (about)

     1  package image
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/docker/cli/cli/streams"
    11  	"github.com/docker/cli/internal/test"
    12  	"github.com/docker/docker/api/types"
    13  	"github.com/docker/docker/api/types/filters"
    14  	"github.com/docker/docker/api/types/image"
    15  	"github.com/pkg/errors"
    16  	"gotest.tools/v3/assert"
    17  	is "gotest.tools/v3/assert/cmp"
    18  	"gotest.tools/v3/golden"
    19  )
    20  
    21  func TestNewPruneCommandErrors(t *testing.T) {
    22  	testCases := []struct {
    23  		name            string
    24  		args            []string
    25  		expectedError   string
    26  		imagesPruneFunc func(pruneFilter filters.Args) (types.ImagesPruneReport, error)
    27  	}{
    28  		{
    29  			name:          "wrong-args",
    30  			args:          []string{"something"},
    31  			expectedError: "accepts no arguments.",
    32  		},
    33  		{
    34  			name:          "prune-error",
    35  			args:          []string{"--force"},
    36  			expectedError: "something went wrong",
    37  			imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
    38  				return types.ImagesPruneReport{}, errors.Errorf("something went wrong")
    39  			},
    40  		},
    41  	}
    42  	for _, tc := range testCases {
    43  		cmd := NewPruneCommand(test.NewFakeCli(&fakeClient{
    44  			imagesPruneFunc: tc.imagesPruneFunc,
    45  		}))
    46  		cmd.SetOut(io.Discard)
    47  		cmd.SetArgs(tc.args)
    48  		assert.ErrorContains(t, cmd.Execute(), tc.expectedError)
    49  	}
    50  }
    51  
    52  func TestNewPruneCommandSuccess(t *testing.T) {
    53  	testCases := []struct {
    54  		name            string
    55  		args            []string
    56  		imagesPruneFunc func(pruneFilter filters.Args) (types.ImagesPruneReport, error)
    57  	}{
    58  		{
    59  			name: "all",
    60  			args: []string{"--all"},
    61  			imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
    62  				assert.Check(t, is.Equal("false", pruneFilter.Get("dangling")[0]))
    63  				return types.ImagesPruneReport{}, nil
    64  			},
    65  		},
    66  		{
    67  			name: "force-deleted",
    68  			args: []string{"--force"},
    69  			imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
    70  				assert.Check(t, is.Equal("true", pruneFilter.Get("dangling")[0]))
    71  				return types.ImagesPruneReport{
    72  					ImagesDeleted:  []image.DeleteResponse{{Deleted: "image1"}},
    73  					SpaceReclaimed: 1,
    74  				}, nil
    75  			},
    76  		},
    77  		{
    78  			name: "label-filter",
    79  			args: []string{"--force", "--filter", "label=foobar"},
    80  			imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
    81  				assert.Check(t, is.Equal("foobar", pruneFilter.Get("label")[0]))
    82  				return types.ImagesPruneReport{}, nil
    83  			},
    84  		},
    85  		{
    86  			name: "force-untagged",
    87  			args: []string{"--force"},
    88  			imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
    89  				assert.Check(t, is.Equal("true", pruneFilter.Get("dangling")[0]))
    90  				return types.ImagesPruneReport{
    91  					ImagesDeleted:  []image.DeleteResponse{{Untagged: "image1"}},
    92  					SpaceReclaimed: 2,
    93  				}, nil
    94  			},
    95  		},
    96  	}
    97  	for _, tc := range testCases {
    98  		t.Run(tc.name, func(t *testing.T) {
    99  			cli := test.NewFakeCli(&fakeClient{imagesPruneFunc: tc.imagesPruneFunc})
   100  			// when prompted, answer "Y" to confirm the prune.
   101  			// will not be prompted if --force is used.
   102  			cli.SetIn(streams.NewIn(io.NopCloser(strings.NewReader("Y\n"))))
   103  			cmd := NewPruneCommand(cli)
   104  			cmd.SetOut(io.Discard)
   105  			cmd.SetArgs(tc.args)
   106  			err := cmd.Execute()
   107  			assert.NilError(t, err)
   108  			golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("prune-command-success.%s.golden", tc.name))
   109  		})
   110  	}
   111  }
   112  
   113  func TestPrunePromptTermination(t *testing.T) {
   114  	ctx, cancel := context.WithCancel(context.Background())
   115  	t.Cleanup(cancel)
   116  
   117  	cli := test.NewFakeCli(&fakeClient{
   118  		imagesPruneFunc: func(pruneFilter filters.Args) (types.ImagesPruneReport, error) {
   119  			return types.ImagesPruneReport{}, errors.New("fakeClient imagesPruneFunc should not be called")
   120  		},
   121  	})
   122  	cmd := NewPruneCommand(cli)
   123  	test.TerminatePrompt(ctx, t, cmd, cli)
   124  }