github.com/ali-iotechsys/cli@v20.10.0+incompatible/cli/command/manifest/create_test.go (about) 1 package manifest 2 3 import ( 4 "context" 5 "io/ioutil" 6 "testing" 7 8 manifesttypes "github.com/docker/cli/cli/manifest/types" 9 "github.com/docker/cli/internal/test" 10 "github.com/docker/distribution/reference" 11 "github.com/pkg/errors" 12 "gotest.tools/v3/assert" 13 is "gotest.tools/v3/assert/cmp" 14 "gotest.tools/v3/golden" 15 ) 16 17 func TestManifestCreateErrors(t *testing.T) { 18 testCases := []struct { 19 args []string 20 expectedError string 21 }{ 22 { 23 args: []string{"too-few-arguments"}, 24 expectedError: "requires at least 2 arguments", 25 }, 26 { 27 args: []string{"th!si'sa/fa!ke/li$t/name", "example.com/alpine:3.0"}, 28 expectedError: "error parsing name for manifest list", 29 }, 30 } 31 32 for _, tc := range testCases { 33 cli := test.NewFakeCli(nil) 34 cmd := newCreateListCommand(cli) 35 cmd.SetArgs(tc.args) 36 cmd.SetOut(ioutil.Discard) 37 assert.ErrorContains(t, cmd.Execute(), tc.expectedError) 38 } 39 } 40 41 // create a manifest list, then overwrite it, and inspect to see if the old one is still there 42 func TestManifestCreateAmend(t *testing.T) { 43 store, cleanup := newTempManifestStore(t) 44 defer cleanup() 45 46 cli := test.NewFakeCli(nil) 47 cli.SetManifestStore(store) 48 49 namedRef := ref(t, "alpine:3.0") 50 imageManifest := fullImageManifest(t, namedRef) 51 err := store.Save(ref(t, "list:v1"), namedRef, imageManifest) 52 assert.NilError(t, err) 53 namedRef = ref(t, "alpine:3.1") 54 imageManifest = fullImageManifest(t, namedRef) 55 err = store.Save(ref(t, "list:v1"), namedRef, imageManifest) 56 assert.NilError(t, err) 57 58 cmd := newCreateListCommand(cli) 59 cmd.SetArgs([]string{"example.com/list:v1", "example.com/alpine:3.1"}) 60 cmd.Flags().Set("amend", "true") 61 cmd.SetOut(ioutil.Discard) 62 err = cmd.Execute() 63 assert.NilError(t, err) 64 65 // make a new cli to clear the buffers 66 cli = test.NewFakeCli(nil) 67 cli.SetManifestStore(store) 68 inspectCmd := newInspectCommand(cli) 69 inspectCmd.SetArgs([]string{"example.com/list:v1"}) 70 assert.NilError(t, inspectCmd.Execute()) 71 actual := cli.OutBuffer() 72 expected := golden.Get(t, "inspect-manifest-list.golden") 73 assert.Check(t, is.Equal(string(expected), actual.String())) 74 } 75 76 // attempt to overwrite a saved manifest and get refused 77 func TestManifestCreateRefuseAmend(t *testing.T) { 78 store, cleanup := newTempManifestStore(t) 79 defer cleanup() 80 81 cli := test.NewFakeCli(nil) 82 cli.SetManifestStore(store) 83 namedRef := ref(t, "alpine:3.0") 84 imageManifest := fullImageManifest(t, namedRef) 85 err := store.Save(ref(t, "list:v1"), namedRef, imageManifest) 86 assert.NilError(t, err) 87 88 cmd := newCreateListCommand(cli) 89 cmd.SetArgs([]string{"example.com/list:v1", "example.com/alpine:3.0"}) 90 cmd.SetOut(ioutil.Discard) 91 err = cmd.Execute() 92 assert.Error(t, err, "refusing to amend an existing manifest list with no --amend flag") 93 } 94 95 // attempt to make a manifest list without valid images 96 func TestManifestCreateNoManifest(t *testing.T) { 97 store, cleanup := newTempManifestStore(t) 98 defer cleanup() 99 100 cli := test.NewFakeCli(nil) 101 cli.SetManifestStore(store) 102 cli.SetRegistryClient(&fakeRegistryClient{ 103 getManifestFunc: func(_ context.Context, ref reference.Named) (manifesttypes.ImageManifest, error) { 104 return manifesttypes.ImageManifest{}, errors.Errorf("No such image: %v", ref) 105 }, 106 getManifestListFunc: func(ctx context.Context, ref reference.Named) ([]manifesttypes.ImageManifest, error) { 107 return nil, errors.Errorf("No such manifest: %s", ref) 108 }, 109 }) 110 111 cmd := newCreateListCommand(cli) 112 cmd.SetArgs([]string{"example.com/list:v1", "example.com/alpine:3.0"}) 113 cmd.SetOut(ioutil.Discard) 114 err := cmd.Execute() 115 assert.Error(t, err, "No such image: example.com/alpine:3.0") 116 }