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