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  }