|
1 | 1 | package cli_test
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "bytes" |
| 5 | + "encoding/json" |
4 | 6 | "fmt"
|
5 | 7 | "testing"
|
6 | 8 |
|
7 | 9 | "github.com/stretchr/testify/require"
|
8 | 10 |
|
| 11 | + "github.com/coder/coder/v2/cli" |
9 | 12 | "github.com/coder/coder/v2/cli/clitest"
|
10 | 13 | "github.com/coder/coder/v2/coderd/coderdtest"
|
11 | 14 | "github.com/coder/coder/v2/codersdk"
|
@@ -84,8 +87,9 @@ func TestTemplatePresets(t *testing.T) {
|
84 | 87 | },
|
85 | 88 | },
|
86 | 89 | {
|
87 |
| - Name: "preset-prebuilds", |
88 |
| - Parameters: []*proto.PresetParameter{}, |
| 90 | + Name: "preset-prebuilds", |
| 91 | + Description: "Preset without parameters and 2 prebuild instances.", |
| 92 | + Parameters: []*proto.PresetParameter{}, |
89 | 93 | Prebuild: &proto.Prebuild{
|
90 | 94 | Instances: 2,
|
91 | 95 | },
|
@@ -117,7 +121,7 @@ func TestTemplatePresets(t *testing.T) {
|
117 | 121 | pty.ExpectRegexMatch(`preset-default\s+k1=v2\s+true\s+0`)
|
118 | 122 | // The parameter order is not guaranteed in the output, so we match both possible orders
|
119 | 123 | pty.ExpectRegexMatch(`preset-multiple-params\s+(k1=v1,k2=v2)|(k2=v2,k1=v1)\s+false\s+-`)
|
120 |
| - pty.ExpectRegexMatch(`preset-prebuilds\s+\s+false\s+2`) |
| 124 | + pty.ExpectRegexMatch(`preset-prebuilds\s+Preset without parameters and 2 prebuild instances.\s+\s+false\s+2`) |
121 | 125 | })
|
122 | 126 |
|
123 | 127 | t.Run("ListsPresetsForSpecifiedTemplateVersion", func(t *testing.T) {
|
@@ -158,8 +162,9 @@ func TestTemplatePresets(t *testing.T) {
|
158 | 162 | },
|
159 | 163 | },
|
160 | 164 | {
|
161 |
| - Name: "preset-prebuilds", |
162 |
| - Parameters: []*proto.PresetParameter{}, |
| 165 | + Name: "preset-prebuilds", |
| 166 | + Description: "Preset without parameters and 2 prebuild instances.", |
| 167 | + Parameters: []*proto.PresetParameter{}, |
163 | 168 | Prebuild: &proto.Prebuild{
|
164 | 169 | Instances: 2,
|
165 | 170 | },
|
@@ -208,7 +213,69 @@ func TestTemplatePresets(t *testing.T) {
|
208 | 213 | pty.ExpectRegexMatch(`preset-default\s+k1=v2\s+true\s+0`)
|
209 | 214 | // The parameter order is not guaranteed in the output, so we match both possible orders
|
210 | 215 | pty.ExpectRegexMatch(`preset-multiple-params\s+(k1=v1,k2=v2)|(k2=v2,k1=v1)\s+false\s+-`)
|
211 |
| - pty.ExpectRegexMatch(`preset-prebuilds\s+\s+false\s+2`) |
| 216 | + pty.ExpectRegexMatch(`preset-prebuilds\s+Preset without parameters and 2 prebuild instances.\s+\s+false\s+2`) |
| 217 | + }) |
| 218 | + |
| 219 | + t.Run("ListsPresetsJSON", func(t *testing.T) { |
| 220 | + t.Parallel() |
| 221 | + |
| 222 | + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) |
| 223 | + owner := coderdtest.CreateFirstUser(t, client) |
| 224 | + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) |
| 225 | + |
| 226 | + // Given: an active template version that includes presets |
| 227 | + preset := proto.Preset{ |
| 228 | + Name: "preset-default", |
| 229 | + Description: "Preset with parameters and 2 prebuild instances.", |
| 230 | + Icon: "/emojis/1f60e.png", |
| 231 | + Default: true, |
| 232 | + Parameters: []*proto.PresetParameter{ |
| 233 | + { |
| 234 | + Name: "k1", |
| 235 | + Value: "v2", |
| 236 | + }, |
| 237 | + }, |
| 238 | + Prebuild: &proto.Prebuild{ |
| 239 | + Instances: 2, |
| 240 | + }, |
| 241 | + } |
| 242 | + |
| 243 | + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, templateWithPresets([]*proto.Preset{&preset})) |
| 244 | + _ = coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) |
| 245 | + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) |
| 246 | + require.Equal(t, version.ID, template.ActiveVersionID) |
| 247 | + |
| 248 | + // When: listing presets for that template |
| 249 | + inv, root := clitest.New(t, "templates", "presets", "list", template.Name, "-o", "json") |
| 250 | + clitest.SetupConfig(t, member, root) |
| 251 | + |
| 252 | + buf := bytes.NewBuffer(nil) |
| 253 | + inv.Stdout = buf |
| 254 | + doneChan := make(chan struct{}) |
| 255 | + var runErr error |
| 256 | + go func() { |
| 257 | + defer close(doneChan) |
| 258 | + runErr = inv.Run() |
| 259 | + }() |
| 260 | + |
| 261 | + <-doneChan |
| 262 | + require.NoError(t, runErr) |
| 263 | + |
| 264 | + // Should: return the active version's preset |
| 265 | + var jsonPresets []cli.TemplatePresetRow |
| 266 | + err := json.Unmarshal(buf.Bytes(), &jsonPresets) |
| 267 | + require.NoError(t, err, "unmarshal JSON output") |
| 268 | + require.Len(t, jsonPresets, 1) |
| 269 | + |
| 270 | + jsonPreset := jsonPresets[0].TemplatePreset |
| 271 | + require.Equal(t, preset.Name, jsonPreset.Name) |
| 272 | + require.Equal(t, preset.Description, jsonPreset.Description) |
| 273 | + require.Equal(t, preset.Icon, jsonPreset.Icon) |
| 274 | + require.Equal(t, preset.Default, jsonPreset.Default) |
| 275 | + require.Equal(t, len(preset.Parameters), len(jsonPreset.Parameters)) |
| 276 | + require.Equal(t, preset.Parameters[0].Name, jsonPreset.Parameters[0].Name) |
| 277 | + require.Equal(t, preset.Parameters[0].Value, jsonPreset.Parameters[0].Value) |
| 278 | + require.Equal(t, int(preset.Prebuild.Instances), *jsonPreset.DesiredPrebuildInstances) |
212 | 279 | })
|
213 | 280 | }
|
214 | 281 |
|
|
0 commit comments