plugin_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package formatter
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "strings"
  6. "testing"
  7. "github.com/docker/docker/api/types"
  8. "github.com/docker/docker/pkg/stringid"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestPluginContext(t *testing.T) {
  12. pluginID := stringid.GenerateRandomID()
  13. var ctx pluginContext
  14. cases := []struct {
  15. pluginCtx pluginContext
  16. expValue string
  17. call func() string
  18. }{
  19. {pluginContext{
  20. p: types.Plugin{ID: pluginID},
  21. trunc: false,
  22. }, pluginID, ctx.ID},
  23. {pluginContext{
  24. p: types.Plugin{ID: pluginID},
  25. trunc: true,
  26. }, stringid.TruncateID(pluginID), ctx.ID},
  27. {pluginContext{
  28. p: types.Plugin{Name: "plugin_name"},
  29. }, "plugin_name", ctx.Name},
  30. {pluginContext{
  31. p: types.Plugin{Config: types.PluginConfig{Description: "plugin_description"}},
  32. }, "plugin_description", ctx.Description},
  33. }
  34. for _, c := range cases {
  35. ctx = c.pluginCtx
  36. v := c.call()
  37. if strings.Contains(v, ",") {
  38. compareMultipleValues(t, v, c.expValue)
  39. } else if v != c.expValue {
  40. t.Fatalf("Expected %s, was %s\n", c.expValue, v)
  41. }
  42. }
  43. }
  44. func TestPluginContextWrite(t *testing.T) {
  45. cases := []struct {
  46. context Context
  47. expected string
  48. }{
  49. // Errors
  50. {
  51. Context{Format: "{{InvalidFunction}}"},
  52. `Template parsing error: template: :1: function "InvalidFunction" not defined
  53. `,
  54. },
  55. {
  56. Context{Format: "{{nil}}"},
  57. `Template parsing error: template: :1:2: executing "" at <nil>: nil is not a command
  58. `,
  59. },
  60. // Table format
  61. {
  62. Context{Format: NewPluginFormat("table", false)},
  63. `ID NAME DESCRIPTION ENABLED
  64. pluginID1 foobar_baz description 1 true
  65. pluginID2 foobar_bar description 2 false
  66. `,
  67. },
  68. {
  69. Context{Format: NewPluginFormat("table", true)},
  70. `pluginID1
  71. pluginID2
  72. `,
  73. },
  74. {
  75. Context{Format: NewPluginFormat("table {{.Name}}", false)},
  76. `NAME
  77. foobar_baz
  78. foobar_bar
  79. `,
  80. },
  81. {
  82. Context{Format: NewPluginFormat("table {{.Name}}", true)},
  83. `NAME
  84. foobar_baz
  85. foobar_bar
  86. `,
  87. },
  88. // Raw Format
  89. {
  90. Context{Format: NewPluginFormat("raw", false)},
  91. `plugin_id: pluginID1
  92. name: foobar_baz
  93. description: description 1
  94. enabled: true
  95. plugin_id: pluginID2
  96. name: foobar_bar
  97. description: description 2
  98. enabled: false
  99. `,
  100. },
  101. {
  102. Context{Format: NewPluginFormat("raw", true)},
  103. `plugin_id: pluginID1
  104. plugin_id: pluginID2
  105. `,
  106. },
  107. // Custom Format
  108. {
  109. Context{Format: NewPluginFormat("{{.Name}}", false)},
  110. `foobar_baz
  111. foobar_bar
  112. `,
  113. },
  114. }
  115. for _, testcase := range cases {
  116. plugins := []*types.Plugin{
  117. {ID: "pluginID1", Name: "foobar_baz", Config: types.PluginConfig{Description: "description 1"}, Enabled: true},
  118. {ID: "pluginID2", Name: "foobar_bar", Config: types.PluginConfig{Description: "description 2"}, Enabled: false},
  119. }
  120. out := bytes.NewBufferString("")
  121. testcase.context.Output = out
  122. err := PluginWrite(testcase.context, plugins)
  123. if err != nil {
  124. assert.EqualError(t, err, testcase.expected)
  125. } else {
  126. assert.Equal(t, testcase.expected, out.String())
  127. }
  128. }
  129. }
  130. func TestPluginContextWriteJSON(t *testing.T) {
  131. plugins := []*types.Plugin{
  132. {ID: "pluginID1", Name: "foobar_baz"},
  133. {ID: "pluginID2", Name: "foobar_bar"},
  134. }
  135. expectedJSONs := []map[string]interface{}{
  136. {"Description": "", "Enabled": false, "ID": "pluginID1", "Name": "foobar_baz", "PluginReference": ""},
  137. {"Description": "", "Enabled": false, "ID": "pluginID2", "Name": "foobar_bar", "PluginReference": ""},
  138. }
  139. out := bytes.NewBufferString("")
  140. err := PluginWrite(Context{Format: "{{json .}}", Output: out}, plugins)
  141. if err != nil {
  142. t.Fatal(err)
  143. }
  144. for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") {
  145. var m map[string]interface{}
  146. if err := json.Unmarshal([]byte(line), &m); err != nil {
  147. t.Fatal(err)
  148. }
  149. assert.Equal(t, expectedJSONs[i], m)
  150. }
  151. }
  152. func TestPluginContextWriteJSONField(t *testing.T) {
  153. plugins := []*types.Plugin{
  154. {ID: "pluginID1", Name: "foobar_baz"},
  155. {ID: "pluginID2", Name: "foobar_bar"},
  156. }
  157. out := bytes.NewBufferString("")
  158. err := PluginWrite(Context{Format: "{{json .ID}}", Output: out}, plugins)
  159. if err != nil {
  160. t.Fatal(err)
  161. }
  162. for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") {
  163. var s string
  164. if err := json.Unmarshal([]byte(line), &s); err != nil {
  165. t.Fatal(err)
  166. }
  167. assert.Equal(t, plugins[i].ID, s)
  168. }
  169. }