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

     1  package volume
     2  
     3  import (
     4  	"io"
     5  	"testing"
     6  
     7  	"github.com/docker/cli/cli/config/configfile"
     8  	"github.com/docker/cli/internal/test"
     9  	"github.com/docker/cli/internal/test/builders"
    10  	"github.com/docker/docker/api/types/filters"
    11  	"github.com/docker/docker/api/types/volume"
    12  	"github.com/pkg/errors"
    13  	"gotest.tools/v3/assert"
    14  	"gotest.tools/v3/golden"
    15  )
    16  
    17  func TestVolumeListErrors(t *testing.T) {
    18  	testCases := []struct {
    19  		args           []string
    20  		flags          map[string]string
    21  		volumeListFunc func(filter filters.Args) (volume.ListResponse, error)
    22  		expectedError  string
    23  	}{
    24  		{
    25  			args:          []string{"foo"},
    26  			expectedError: "accepts no argument",
    27  		},
    28  		{
    29  			volumeListFunc: func(filter filters.Args) (volume.ListResponse, error) {
    30  				return volume.ListResponse{}, errors.Errorf("error listing volumes")
    31  			},
    32  			expectedError: "error listing volumes",
    33  		},
    34  	}
    35  	for _, tc := range testCases {
    36  		cmd := newListCommand(
    37  			test.NewFakeCli(&fakeClient{
    38  				volumeListFunc: tc.volumeListFunc,
    39  			}),
    40  		)
    41  		cmd.SetArgs(tc.args)
    42  		for key, value := range tc.flags {
    43  			assert.Check(t, cmd.Flags().Set(key, value))
    44  		}
    45  		cmd.SetOut(io.Discard)
    46  		cmd.SetErr(io.Discard)
    47  		assert.ErrorContains(t, cmd.Execute(), tc.expectedError)
    48  	}
    49  }
    50  
    51  func TestVolumeListWithoutFormat(t *testing.T) {
    52  	cli := test.NewFakeCli(&fakeClient{
    53  		volumeListFunc: func(filter filters.Args) (volume.ListResponse, error) {
    54  			return volume.ListResponse{
    55  				Volumes: []*volume.Volume{
    56  					builders.Volume(),
    57  					builders.Volume(builders.VolumeName("foo"), builders.VolumeDriver("bar")),
    58  					builders.Volume(builders.VolumeName("baz"), builders.VolumeLabels(map[string]string{
    59  						"foo": "bar",
    60  					})),
    61  				},
    62  			}, nil
    63  		},
    64  	})
    65  	cmd := newListCommand(cli)
    66  	assert.NilError(t, cmd.Execute())
    67  	golden.Assert(t, cli.OutBuffer().String(), "volume-list-without-format.golden")
    68  }
    69  
    70  func TestVolumeListWithConfigFormat(t *testing.T) {
    71  	cli := test.NewFakeCli(&fakeClient{
    72  		volumeListFunc: func(filter filters.Args) (volume.ListResponse, error) {
    73  			return volume.ListResponse{
    74  				Volumes: []*volume.Volume{
    75  					builders.Volume(),
    76  					builders.Volume(builders.VolumeName("foo"), builders.VolumeDriver("bar")),
    77  					builders.Volume(builders.VolumeName("baz"), builders.VolumeLabels(map[string]string{
    78  						"foo": "bar",
    79  					})),
    80  				},
    81  			}, nil
    82  		},
    83  	})
    84  	cli.SetConfigFile(&configfile.ConfigFile{
    85  		VolumesFormat: "{{ .Name }} {{ .Driver }} {{ .Labels }}",
    86  	})
    87  	cmd := newListCommand(cli)
    88  	assert.NilError(t, cmd.Execute())
    89  	golden.Assert(t, cli.OutBuffer().String(), "volume-list-with-config-format.golden")
    90  }
    91  
    92  func TestVolumeListWithFormat(t *testing.T) {
    93  	cli := test.NewFakeCli(&fakeClient{
    94  		volumeListFunc: func(filter filters.Args) (volume.ListResponse, error) {
    95  			return volume.ListResponse{
    96  				Volumes: []*volume.Volume{
    97  					builders.Volume(),
    98  					builders.Volume(builders.VolumeName("foo"), builders.VolumeDriver("bar")),
    99  					builders.Volume(builders.VolumeName("baz"), builders.VolumeLabels(map[string]string{
   100  						"foo": "bar",
   101  					})),
   102  				},
   103  			}, nil
   104  		},
   105  	})
   106  	cmd := newListCommand(cli)
   107  	assert.Check(t, cmd.Flags().Set("format", "{{ .Name }} {{ .Driver }} {{ .Labels }}"))
   108  	assert.NilError(t, cmd.Execute())
   109  	golden.Assert(t, cli.OutBuffer().String(), "volume-list-with-format.golden")
   110  }
   111  
   112  func TestVolumeListSortOrder(t *testing.T) {
   113  	cli := test.NewFakeCli(&fakeClient{
   114  		volumeListFunc: func(filter filters.Args) (volume.ListResponse, error) {
   115  			return volume.ListResponse{
   116  				Volumes: []*volume.Volume{
   117  					builders.Volume(builders.VolumeName("volume-2-foo")),
   118  					builders.Volume(builders.VolumeName("volume-10-foo")),
   119  					builders.Volume(builders.VolumeName("volume-1-foo")),
   120  				},
   121  			}, nil
   122  		},
   123  	})
   124  	cmd := newListCommand(cli)
   125  	assert.Check(t, cmd.Flags().Set("format", "{{ .Name }}"))
   126  	assert.NilError(t, cmd.Execute())
   127  	golden.Assert(t, cli.OutBuffer().String(), "volume-list-sort.golden")
   128  }
   129  
   130  func TestClusterVolumeList(t *testing.T) {
   131  	cli := test.NewFakeCli(&fakeClient{
   132  		volumeListFunc: func(filter filters.Args) (volume.ListResponse, error) {
   133  			return volume.ListResponse{
   134  				Volumes: []*volume.Volume{
   135  					{
   136  						Name:   "volume1",
   137  						Scope:  "global",
   138  						Driver: "driver1",
   139  						ClusterVolume: &volume.ClusterVolume{
   140  							Spec: volume.ClusterVolumeSpec{
   141  								Group: "group1",
   142  								AccessMode: &volume.AccessMode{
   143  									Scope:       volume.ScopeSingleNode,
   144  									Sharing:     volume.SharingOneWriter,
   145  									MountVolume: &volume.TypeMount{},
   146  								},
   147  								Availability: volume.AvailabilityActive,
   148  							},
   149  						},
   150  					},
   151  					{
   152  						Name:   "volume2",
   153  						Scope:  "global",
   154  						Driver: "driver1",
   155  						ClusterVolume: &volume.ClusterVolume{
   156  							Spec: volume.ClusterVolumeSpec{
   157  								Group: "group1",
   158  								AccessMode: &volume.AccessMode{
   159  									Scope:       volume.ScopeSingleNode,
   160  									Sharing:     volume.SharingOneWriter,
   161  									MountVolume: &volume.TypeMount{},
   162  								},
   163  								Availability: volume.AvailabilityPause,
   164  							},
   165  							Info: &volume.Info{
   166  								CapacityBytes: 100000000,
   167  								VolumeID:      "driver1vol2",
   168  							},
   169  						},
   170  					},
   171  					{
   172  						Name:   "volume3",
   173  						Scope:  "global",
   174  						Driver: "driver2",
   175  						ClusterVolume: &volume.ClusterVolume{
   176  							Spec: volume.ClusterVolumeSpec{
   177  								Group: "group2",
   178  								AccessMode: &volume.AccessMode{
   179  									Scope:       volume.ScopeMultiNode,
   180  									Sharing:     volume.SharingAll,
   181  									MountVolume: &volume.TypeMount{},
   182  								},
   183  								Availability: volume.AvailabilityActive,
   184  							},
   185  							PublishStatus: []*volume.PublishStatus{
   186  								{
   187  									NodeID: "nodeid1",
   188  									State:  volume.StatePublished,
   189  								},
   190  							},
   191  							Info: &volume.Info{
   192  								CapacityBytes: 100000000,
   193  								VolumeID:      "driver1vol3",
   194  							},
   195  						},
   196  					},
   197  					{
   198  						Name:   "volume4",
   199  						Scope:  "global",
   200  						Driver: "driver2",
   201  						ClusterVolume: &volume.ClusterVolume{
   202  							Spec: volume.ClusterVolumeSpec{
   203  								Group: "group2",
   204  								AccessMode: &volume.AccessMode{
   205  									Scope:       volume.ScopeMultiNode,
   206  									Sharing:     volume.SharingAll,
   207  									MountVolume: &volume.TypeMount{},
   208  								},
   209  								Availability: volume.AvailabilityActive,
   210  							},
   211  							PublishStatus: []*volume.PublishStatus{
   212  								{
   213  									NodeID: "nodeid1",
   214  									State:  volume.StatePublished,
   215  								}, {
   216  									NodeID: "nodeid2",
   217  									State:  volume.StatePublished,
   218  								},
   219  							},
   220  							Info: &volume.Info{
   221  								CapacityBytes: 100000000,
   222  								VolumeID:      "driver1vol4",
   223  							},
   224  						},
   225  					},
   226  					builders.Volume(builders.VolumeName("volume-local-1")),
   227  				},
   228  			}, nil
   229  		},
   230  	})
   231  
   232  	cmd := newListCommand(cli)
   233  	assert.Check(t, cmd.Flags().Set("cluster", "true"))
   234  	assert.NilError(t, cmd.Execute())
   235  	golden.Assert(t, cli.OutBuffer().String(), "volume-cluster-volume-list.golden")
   236  }