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 }