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  }