github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/manifest/create_test.go (about) 1 package manifest 2 3 import ( 4 "context" 5 "io" 6 "testing" 7 8 "github.com/distribution/reference" 9 "github.com/docker/cli/cli/manifest/store" 10 manifesttypes "github.com/docker/cli/cli/manifest/types" 11 "github.com/docker/cli/internal/test" 12 "github.com/pkg/errors" 13 "gotest.tools/v3/assert" 14 is "gotest.tools/v3/assert/cmp" 15 "gotest.tools/v3/golden" 16 ) 17 18 func TestManifestCreateErrors(t *testing.T) { 19 testCases := []struct { 20 args []string 21 expectedError string 22 }{ 23 { 24 args: []string{"too-few-arguments"}, 25 expectedError: "requires at least 2 arguments", 26 }, 27 { 28 args: []string{"th!si'sa/fa!ke/li$t/name", "example.com/alpine:3.0"}, 29 expectedError: "error parsing name for manifest list", 30 }, 31 } 32 33 for _, tc := range testCases { 34 cli := test.NewFakeCli(nil) 35 cmd := newCreateListCommand(cli) 36 cmd.SetArgs(tc.args) 37 cmd.SetOut(io.Discard) 38 assert.ErrorContains(t, cmd.Execute(), tc.expectedError) 39 } 40 } 41 42 // create a manifest list, then overwrite it, and inspect to see if the old one is still there 43 func TestManifestCreateAmend(t *testing.T) { 44 manifestStore := store.NewStore(t.TempDir()) 45 46 cli := test.NewFakeCli(nil) 47 cli.SetManifestStore(manifestStore) 48 49 namedRef := ref(t, "alpine:3.0") 50 imageManifest := fullImageManifest(t, namedRef) 51 err := manifestStore.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 = manifestStore.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(io.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(manifestStore) 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 manifestStore := store.NewStore(t.TempDir()) 79 80 cli := test.NewFakeCli(nil) 81 cli.SetManifestStore(manifestStore) 82 namedRef := ref(t, "alpine:3.0") 83 imageManifest := fullImageManifest(t, namedRef) 84 err := manifestStore.Save(ref(t, "list:v1"), namedRef, imageManifest) 85 assert.NilError(t, err) 86 87 cmd := newCreateListCommand(cli) 88 cmd.SetArgs([]string{"example.com/list:v1", "example.com/alpine:3.0"}) 89 cmd.SetOut(io.Discard) 90 err = cmd.Execute() 91 assert.Error(t, err, "refusing to amend an existing manifest list with no --amend flag") 92 } 93 94 // attempt to make a manifest list without valid images 95 func TestManifestCreateNoManifest(t *testing.T) { 96 manifestStore := store.NewStore(t.TempDir()) 97 98 cli := test.NewFakeCli(nil) 99 cli.SetManifestStore(manifestStore) 100 cli.SetRegistryClient(&fakeRegistryClient{ 101 getManifestFunc: func(_ context.Context, ref reference.Named) (manifesttypes.ImageManifest, error) { 102 return manifesttypes.ImageManifest{}, errors.Errorf("No such image: %v", ref) 103 }, 104 getManifestListFunc: func(ctx context.Context, ref reference.Named) ([]manifesttypes.ImageManifest, error) { 105 return nil, errors.Errorf("No such manifest: %s", ref) 106 }, 107 }) 108 109 cmd := newCreateListCommand(cli) 110 cmd.SetArgs([]string{"example.com/list:v1", "example.com/alpine:3.0"}) 111 cmd.SetOut(io.Discard) 112 err := cmd.Execute() 113 assert.Error(t, err, "No such image: example.com/alpine:3.0") 114 }