create_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package volume
  2. import (
  3. "bytes"
  4. "io/ioutil"
  5. "strings"
  6. "testing"
  7. "github.com/docker/docker/api/types"
  8. volumetypes "github.com/docker/docker/api/types/volume"
  9. "github.com/docker/docker/cli/internal/test"
  10. "github.com/docker/docker/pkg/testutil/assert"
  11. "github.com/pkg/errors"
  12. )
  13. func TestVolumeCreateErrors(t *testing.T) {
  14. testCases := []struct {
  15. args []string
  16. flags map[string]string
  17. volumeCreateFunc func(volumetypes.VolumesCreateBody) (types.Volume, error)
  18. expectedError string
  19. }{
  20. {
  21. args: []string{"volumeName"},
  22. flags: map[string]string{
  23. "name": "volumeName",
  24. },
  25. expectedError: "Conflicting options: either specify --name or provide positional arg, not both",
  26. },
  27. {
  28. args: []string{"too", "many"},
  29. expectedError: "requires at most 1 argument(s)",
  30. },
  31. {
  32. volumeCreateFunc: func(createBody volumetypes.VolumesCreateBody) (types.Volume, error) {
  33. return types.Volume{}, errors.Errorf("error creating volume")
  34. },
  35. expectedError: "error creating volume",
  36. },
  37. }
  38. for _, tc := range testCases {
  39. buf := new(bytes.Buffer)
  40. cmd := newCreateCommand(
  41. test.NewFakeCli(&fakeClient{
  42. volumeCreateFunc: tc.volumeCreateFunc,
  43. }, buf),
  44. )
  45. cmd.SetArgs(tc.args)
  46. for key, value := range tc.flags {
  47. cmd.Flags().Set(key, value)
  48. }
  49. cmd.SetOutput(ioutil.Discard)
  50. assert.Error(t, cmd.Execute(), tc.expectedError)
  51. }
  52. }
  53. func TestVolumeCreateWithName(t *testing.T) {
  54. name := "foo"
  55. buf := new(bytes.Buffer)
  56. cli := test.NewFakeCli(&fakeClient{
  57. volumeCreateFunc: func(body volumetypes.VolumesCreateBody) (types.Volume, error) {
  58. if body.Name != name {
  59. return types.Volume{}, errors.Errorf("expected name %q, got %q", name, body.Name)
  60. }
  61. return types.Volume{
  62. Name: body.Name,
  63. }, nil
  64. },
  65. }, buf)
  66. // Test by flags
  67. cmd := newCreateCommand(cli)
  68. cmd.Flags().Set("name", name)
  69. assert.NilError(t, cmd.Execute())
  70. assert.Equal(t, strings.TrimSpace(buf.String()), name)
  71. // Then by args
  72. buf.Reset()
  73. cmd = newCreateCommand(cli)
  74. cmd.SetArgs([]string{name})
  75. assert.NilError(t, cmd.Execute())
  76. assert.Equal(t, strings.TrimSpace(buf.String()), name)
  77. }
  78. func TestVolumeCreateWithFlags(t *testing.T) {
  79. expectedDriver := "foo"
  80. expectedOpts := map[string]string{
  81. "bar": "1",
  82. "baz": "baz",
  83. }
  84. expectedLabels := map[string]string{
  85. "lbl1": "v1",
  86. "lbl2": "v2",
  87. }
  88. name := "banana"
  89. buf := new(bytes.Buffer)
  90. cli := test.NewFakeCli(&fakeClient{
  91. volumeCreateFunc: func(body volumetypes.VolumesCreateBody) (types.Volume, error) {
  92. if body.Name != "" {
  93. return types.Volume{}, errors.Errorf("expected empty name, got %q", body.Name)
  94. }
  95. if body.Driver != expectedDriver {
  96. return types.Volume{}, errors.Errorf("expected driver %q, got %q", expectedDriver, body.Driver)
  97. }
  98. if !compareMap(body.DriverOpts, expectedOpts) {
  99. return types.Volume{}, errors.Errorf("expected drivers opts %v, got %v", expectedOpts, body.DriverOpts)
  100. }
  101. if !compareMap(body.Labels, expectedLabels) {
  102. return types.Volume{}, errors.Errorf("expected labels %v, got %v", expectedLabels, body.Labels)
  103. }
  104. return types.Volume{
  105. Name: name,
  106. }, nil
  107. },
  108. }, buf)
  109. cmd := newCreateCommand(cli)
  110. cmd.Flags().Set("driver", "foo")
  111. cmd.Flags().Set("opt", "bar=1")
  112. cmd.Flags().Set("opt", "baz=baz")
  113. cmd.Flags().Set("label", "lbl1=v1")
  114. cmd.Flags().Set("label", "lbl2=v2")
  115. assert.NilError(t, cmd.Execute())
  116. assert.Equal(t, strings.TrimSpace(buf.String()), name)
  117. }
  118. func compareMap(actual map[string]string, expected map[string]string) bool {
  119. if len(actual) != len(expected) {
  120. return false
  121. }
  122. for key, value := range actual {
  123. if expectedValue, ok := expected[key]; ok {
  124. if expectedValue != value {
  125. return false
  126. }
  127. } else {
  128. return false
  129. }
  130. }
  131. return true
  132. }