github.com/panekj/cli@v0.0.0-20230304125325-467dd2f3797e/cli/command/image/pull_test.go (about) 1 package image 2 3 import ( 4 "fmt" 5 "io" 6 "strings" 7 "testing" 8 9 "github.com/docker/cli/internal/test" 10 "github.com/docker/cli/internal/test/notary" 11 "github.com/docker/docker/api/types" 12 "gotest.tools/v3/assert" 13 is "gotest.tools/v3/assert/cmp" 14 "gotest.tools/v3/golden" 15 ) 16 17 func TestNewPullCommandErrors(t *testing.T) { 18 testCases := []struct { 19 name string 20 args []string 21 expectedError string 22 }{ 23 { 24 name: "wrong-args", 25 expectedError: "requires exactly 1 argument.", 26 args: []string{}, 27 }, 28 { 29 name: "invalid-name", 30 expectedError: "invalid reference format: repository name must be lowercase", 31 args: []string{"UPPERCASE_REPO"}, 32 }, 33 { 34 name: "all-tags-with-tag", 35 expectedError: "tag can't be used with --all-tags/-a", 36 args: []string{"--all-tags", "image:tag"}, 37 }, 38 } 39 for _, tc := range testCases { 40 cli := test.NewFakeCli(&fakeClient{}) 41 cmd := NewPullCommand(cli) 42 cmd.SetOut(io.Discard) 43 cmd.SetArgs(tc.args) 44 assert.ErrorContains(t, cmd.Execute(), tc.expectedError) 45 } 46 } 47 48 func TestNewPullCommandSuccess(t *testing.T) { 49 testCases := []struct { 50 name string 51 args []string 52 expectedTag string 53 }{ 54 { 55 name: "simple", 56 args: []string{"image:tag"}, 57 expectedTag: "image:tag", 58 }, 59 { 60 name: "simple-no-tag", 61 args: []string{"image"}, 62 expectedTag: "image:latest", 63 }, 64 { 65 name: "simple-quiet", 66 args: []string{"--quiet", "image"}, 67 expectedTag: "image:latest", 68 }, 69 } 70 for _, tc := range testCases { 71 cli := test.NewFakeCli(&fakeClient{ 72 imagePullFunc: func(ref string, options types.ImagePullOptions) (io.ReadCloser, error) { 73 assert.Check(t, is.Equal(tc.expectedTag, ref), tc.name) 74 return io.NopCloser(strings.NewReader("")), nil 75 }, 76 }) 77 cmd := NewPullCommand(cli) 78 cmd.SetOut(io.Discard) 79 cmd.SetArgs(tc.args) 80 err := cmd.Execute() 81 assert.NilError(t, err) 82 golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("pull-command-success.%s.golden", tc.name)) 83 } 84 } 85 86 func TestNewPullCommandWithContentTrustErrors(t *testing.T) { 87 testCases := []struct { 88 name string 89 args []string 90 expectedError string 91 notaryFunc test.NotaryClientFuncType 92 }{ 93 { 94 name: "offline-notary-server", 95 notaryFunc: notary.GetOfflineNotaryRepository, 96 expectedError: "client is offline", 97 args: []string{"image:tag"}, 98 }, 99 { 100 name: "uninitialized-notary-server", 101 notaryFunc: notary.GetUninitializedNotaryRepository, 102 expectedError: "remote trust data does not exist", 103 args: []string{"image:tag"}, 104 }, 105 { 106 name: "empty-notary-server", 107 notaryFunc: notary.GetEmptyTargetsNotaryRepository, 108 expectedError: "No valid trust data for tag", 109 args: []string{"image:tag"}, 110 }, 111 } 112 for _, tc := range testCases { 113 cli := test.NewFakeCli(&fakeClient{ 114 imagePullFunc: func(ref string, options types.ImagePullOptions) (io.ReadCloser, error) { 115 return io.NopCloser(strings.NewReader("")), fmt.Errorf("shouldn't try to pull image") 116 }, 117 }, test.EnableContentTrust) 118 cli.SetNotaryClient(tc.notaryFunc) 119 cmd := NewPullCommand(cli) 120 cmd.SetOut(io.Discard) 121 cmd.SetArgs(tc.args) 122 err := cmd.Execute() 123 assert.ErrorContains(t, err, tc.expectedError) 124 } 125 }