github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/secret/create_test.go (about)

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