github.com/xeptore/docker-cli@v20.10.14+incompatible/cli/command/secret/create_test.go (about)

     1  package secret
     2  
     3  import (
     4  	"io/ioutil"
     5  	"path/filepath"
     6  	"reflect"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/docker/cli/internal/test"
    11  	"github.com/docker/docker/api/types"
    12  	"github.com/docker/docker/api/types/swarm"
    13  	"github.com/pkg/errors"
    14  	"gotest.tools/v3/assert"
    15  	is "gotest.tools/v3/assert/cmp"
    16  )
    17  
    18  const secretDataFile = "secret-create-with-name.golden"
    19  
    20  func TestSecretCreateErrors(t *testing.T) {
    21  	testCases := []struct {
    22  		args             []string
    23  		secretCreateFunc func(swarm.SecretSpec) (types.SecretCreateResponse, error)
    24  		expectedError    string
    25  	}{
    26  		{args: []string{"too", "many", "arguments"},
    27  			expectedError: "requires at least 1 and at most 2 arguments",
    28  		},
    29  		{args: []string{"create", "--driver", "driver", "-"},
    30  			expectedError: "secret data must be empty",
    31  		},
    32  		{
    33  			args: []string{"name", filepath.Join("testdata", secretDataFile)},
    34  			secretCreateFunc: func(secretSpec swarm.SecretSpec) (types.SecretCreateResponse, error) {
    35  				return types.SecretCreateResponse{}, errors.Errorf("error creating secret")
    36  			},
    37  			expectedError: "error creating secret",
    38  		},
    39  	}
    40  	for _, tc := range testCases {
    41  		cmd := newSecretCreateCommand(
    42  			test.NewFakeCli(&fakeClient{
    43  				secretCreateFunc: tc.secretCreateFunc,
    44  			}),
    45  		)
    46  		cmd.SetArgs(tc.args)
    47  		cmd.SetOut(ioutil.Discard)
    48  		assert.ErrorContains(t, cmd.Execute(), tc.expectedError)
    49  	}
    50  }
    51  
    52  func TestSecretCreateWithName(t *testing.T) {
    53  	name := "foo"
    54  	data, err := ioutil.ReadFile(filepath.Join("testdata", secretDataFile))
    55  	assert.NilError(t, err)
    56  
    57  	expected := swarm.SecretSpec{
    58  		Annotations: swarm.Annotations{
    59  			Name:   name,
    60  			Labels: make(map[string]string),
    61  		},
    62  		Data: data,
    63  	}
    64  
    65  	cli := test.NewFakeCli(&fakeClient{
    66  		secretCreateFunc: func(spec swarm.SecretSpec) (types.SecretCreateResponse, error) {
    67  			if !reflect.DeepEqual(spec, expected) {
    68  				return types.SecretCreateResponse{}, errors.Errorf("expected %+v, got %+v", expected, spec)
    69  			}
    70  			return types.SecretCreateResponse{
    71  				ID: "ID-" + spec.Name,
    72  			}, nil
    73  		},
    74  	})
    75  
    76  	cmd := newSecretCreateCommand(cli)
    77  	cmd.SetArgs([]string{name, filepath.Join("testdata", secretDataFile)})
    78  	assert.NilError(t, cmd.Execute())
    79  	assert.Check(t, is.Equal("ID-"+name, strings.TrimSpace(cli.OutBuffer().String())))
    80  }
    81  
    82  func TestSecretCreateWithDriver(t *testing.T) {
    83  	expectedDriver := &swarm.Driver{
    84  		Name: "secret-driver",
    85  	}
    86  	name := "foo"
    87  
    88  	cli := test.NewFakeCli(&fakeClient{
    89  		secretCreateFunc: func(spec swarm.SecretSpec) (types.SecretCreateResponse, error) {
    90  			if spec.Name != name {
    91  				return types.SecretCreateResponse{}, errors.Errorf("expected name %q, got %q", name, spec.Name)
    92  			}
    93  
    94  			if spec.Driver.Name != expectedDriver.Name {
    95  				return types.SecretCreateResponse{}, errors.Errorf("expected driver %v, got %v", expectedDriver, spec.Labels)
    96  			}
    97  
    98  			return types.SecretCreateResponse{
    99  				ID: "ID-" + spec.Name,
   100  			}, nil
   101  		},
   102  	})
   103  
   104  	cmd := newSecretCreateCommand(cli)
   105  	cmd.SetArgs([]string{name})
   106  	cmd.Flags().Set("driver", expectedDriver.Name)
   107  	assert.NilError(t, cmd.Execute())
   108  	assert.Check(t, is.Equal("ID-"+name, strings.TrimSpace(cli.OutBuffer().String())))
   109  }
   110  
   111  func TestSecretCreateWithTemplatingDriver(t *testing.T) {
   112  	expectedDriver := &swarm.Driver{
   113  		Name: "template-driver",
   114  	}
   115  	name := "foo"
   116  
   117  	cli := test.NewFakeCli(&fakeClient{
   118  		secretCreateFunc: func(spec swarm.SecretSpec) (types.SecretCreateResponse, error) {
   119  			if spec.Name != name {
   120  				return types.SecretCreateResponse{}, errors.Errorf("expected name %q, got %q", name, spec.Name)
   121  			}
   122  
   123  			if spec.Templating.Name != expectedDriver.Name {
   124  				return types.SecretCreateResponse{}, errors.Errorf("expected driver %v, got %v", expectedDriver, spec.Labels)
   125  			}
   126  
   127  			return types.SecretCreateResponse{
   128  				ID: "ID-" + spec.Name,
   129  			}, nil
   130  		},
   131  	})
   132  
   133  	cmd := newSecretCreateCommand(cli)
   134  	cmd.SetArgs([]string{name})
   135  	cmd.Flags().Set("template-driver", expectedDriver.Name)
   136  	assert.NilError(t, cmd.Execute())
   137  	assert.Check(t, is.Equal("ID-"+name, strings.TrimSpace(cli.OutBuffer().String())))
   138  }
   139  
   140  func TestSecretCreateWithLabels(t *testing.T) {
   141  	expectedLabels := map[string]string{
   142  		"lbl1": "Label-foo",
   143  		"lbl2": "Label-bar",
   144  	}
   145  	name := "foo"
   146  
   147  	cli := test.NewFakeCli(&fakeClient{
   148  		secretCreateFunc: func(spec swarm.SecretSpec) (types.SecretCreateResponse, error) {
   149  			if spec.Name != name {
   150  				return types.SecretCreateResponse{}, errors.Errorf("expected name %q, got %q", name, spec.Name)
   151  			}
   152  
   153  			if !reflect.DeepEqual(spec.Labels, expectedLabels) {
   154  				return types.SecretCreateResponse{}, errors.Errorf("expected labels %v, got %v", expectedLabels, spec.Labels)
   155  			}
   156  
   157  			return types.SecretCreateResponse{
   158  				ID: "ID-" + spec.Name,
   159  			}, nil
   160  		},
   161  	})
   162  
   163  	cmd := newSecretCreateCommand(cli)
   164  	cmd.SetArgs([]string{name, filepath.Join("testdata", secretDataFile)})
   165  	cmd.Flags().Set("label", "lbl1=Label-foo")
   166  	cmd.Flags().Set("label", "lbl2=Label-bar")
   167  	assert.NilError(t, cmd.Execute())
   168  	assert.Check(t, is.Equal("ID-"+name, strings.TrimSpace(cli.OutBuffer().String())))
   169  }