plugin_test.go 4.5 KB

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