github.com/justincormack/cli@v0.0.0-20201215022714-831ebeae9675/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  }