create_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package secret
  2. import (
  3. "bytes"
  4. "io/ioutil"
  5. "path/filepath"
  6. "strings"
  7. "testing"
  8. "github.com/docker/docker/api/types"
  9. "github.com/docker/docker/api/types/swarm"
  10. "github.com/docker/docker/cli/internal/test"
  11. "github.com/docker/docker/pkg/testutil"
  12. "github.com/docker/docker/pkg/testutil/golden"
  13. "github.com/pkg/errors"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. const secretDataFile = "secret-create-with-name.golden"
  17. func TestSecretCreateErrors(t *testing.T) {
  18. testCases := []struct {
  19. args []string
  20. secretCreateFunc func(swarm.SecretSpec) (types.SecretCreateResponse, error)
  21. expectedError string
  22. }{
  23. {
  24. args: []string{"too_few"},
  25. expectedError: "requires exactly 2 argument(s)",
  26. },
  27. {args: []string{"too", "many", "arguments"},
  28. expectedError: "requires exactly 2 argument(s)",
  29. },
  30. {
  31. args: []string{"name", filepath.Join("testdata", secretDataFile)},
  32. secretCreateFunc: func(secretSpec swarm.SecretSpec) (types.SecretCreateResponse, error) {
  33. return types.SecretCreateResponse{}, errors.Errorf("error creating secret")
  34. },
  35. expectedError: "error creating secret",
  36. },
  37. }
  38. for _, tc := range testCases {
  39. buf := new(bytes.Buffer)
  40. cmd := newSecretCreateCommand(
  41. test.NewFakeCli(&fakeClient{
  42. secretCreateFunc: tc.secretCreateFunc,
  43. }, buf),
  44. )
  45. cmd.SetArgs(tc.args)
  46. cmd.SetOutput(ioutil.Discard)
  47. testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
  48. }
  49. }
  50. func TestSecretCreateWithName(t *testing.T) {
  51. name := "foo"
  52. buf := new(bytes.Buffer)
  53. var actual []byte
  54. cli := test.NewFakeCli(&fakeClient{
  55. secretCreateFunc: func(spec swarm.SecretSpec) (types.SecretCreateResponse, error) {
  56. if spec.Name != name {
  57. return types.SecretCreateResponse{}, errors.Errorf("expected name %q, got %q", name, spec.Name)
  58. }
  59. actual = spec.Data
  60. return types.SecretCreateResponse{
  61. ID: "ID-" + spec.Name,
  62. }, nil
  63. },
  64. }, buf)
  65. cmd := newSecretCreateCommand(cli)
  66. cmd.SetArgs([]string{name, filepath.Join("testdata", secretDataFile)})
  67. assert.NoError(t, cmd.Execute())
  68. expected := golden.Get(t, actual, secretDataFile)
  69. assert.Equal(t, expected, actual)
  70. assert.Equal(t, "ID-"+name, strings.TrimSpace(buf.String()))
  71. }
  72. func TestSecretCreateWithLabels(t *testing.T) {
  73. expectedLabels := map[string]string{
  74. "lbl1": "Label-foo",
  75. "lbl2": "Label-bar",
  76. }
  77. name := "foo"
  78. buf := new(bytes.Buffer)
  79. cli := test.NewFakeCli(&fakeClient{
  80. secretCreateFunc: func(spec swarm.SecretSpec) (types.SecretCreateResponse, error) {
  81. if spec.Name != name {
  82. return types.SecretCreateResponse{}, errors.Errorf("expected name %q, got %q", name, spec.Name)
  83. }
  84. if !compareMap(spec.Labels, expectedLabels) {
  85. return types.SecretCreateResponse{}, errors.Errorf("expected labels %v, got %v", expectedLabels, spec.Labels)
  86. }
  87. return types.SecretCreateResponse{
  88. ID: "ID-" + spec.Name,
  89. }, nil
  90. },
  91. }, buf)
  92. cmd := newSecretCreateCommand(cli)
  93. cmd.SetArgs([]string{name, filepath.Join("testdata", secretDataFile)})
  94. cmd.Flags().Set("label", "lbl1=Label-foo")
  95. cmd.Flags().Set("label", "lbl2=Label-bar")
  96. assert.NoError(t, cmd.Execute())
  97. assert.Equal(t, "ID-"+name, strings.TrimSpace(buf.String()))
  98. }
  99. func compareMap(actual map[string]string, expected map[string]string) bool {
  100. if len(actual) != len(expected) {
  101. return false
  102. }
  103. for key, value := range actual {
  104. if expectedValue, ok := expected[key]; ok {
  105. if expectedValue != value {
  106. return false
  107. }
  108. } else {
  109. return false
  110. }
  111. }
  112. return true
  113. }