Skip to content

Commit c1885da

Browse files
authored
fix: NPE when no arg provided to 'coder update' (#3347)
- Add test suite for 'coder update'.
1 parent 8a28112 commit c1885da

File tree

2 files changed

+143
-1
lines changed

2 files changed

+143
-1
lines changed

cli/update.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ func update() *cobra.Command {
1818

1919
cmd := &cobra.Command{
2020
Annotations: workspaceCommand,
21-
Use: "update",
21+
Use: "update <workspace>",
22+
Args: cobra.ExactArgs(1),
2223
Short: "Update a workspace to the latest template version",
2324
RunE: func(cmd *cobra.Command, args []string) error {
2425
client, err := createClient(cmd)

cli/update_test.go

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package cli_test
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
11+
"github.com/coder/coder/cli/clitest"
12+
"github.com/coder/coder/coderd/coderdtest"
13+
"github.com/coder/coder/codersdk"
14+
"github.com/coder/coder/provisioner/echo"
15+
"github.com/coder/coder/pty/ptytest"
16+
)
17+
18+
func TestUpdate(t *testing.T) {
19+
t.Parallel()
20+
21+
// Test that the function does not panic on missing arg.
22+
t.Run("NoArgs", func(t *testing.T) {
23+
t.Parallel()
24+
25+
cmd, _ := clitest.New(t, "update")
26+
err := cmd.Execute()
27+
require.Error(t, err)
28+
})
29+
30+
t.Run("OK", func(t *testing.T) {
31+
t.Parallel()
32+
33+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
34+
user := coderdtest.CreateFirstUser(t, client)
35+
version1 := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
36+
37+
coderdtest.AwaitTemplateVersionJob(t, client, version1.ID)
38+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version1.ID)
39+
40+
cmd, root := clitest.New(t, "create",
41+
"my-workspace",
42+
"--template", template.Name,
43+
"-y",
44+
)
45+
clitest.SetupConfig(t, client, root)
46+
47+
err := cmd.Execute()
48+
require.NoError(t, err)
49+
50+
ws, err := client.WorkspaceByOwnerAndName(context.Background(), "testuser", "my-workspace", codersdk.WorkspaceOptions{})
51+
require.NoError(t, err)
52+
require.Equal(t, version1.ID.String(), ws.LatestBuild.TemplateVersionID.String())
53+
54+
version2 := coderdtest.UpdateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
55+
Parse: echo.ParseComplete,
56+
Provision: echo.ProvisionComplete,
57+
ProvisionDryRun: echo.ProvisionComplete,
58+
}, template.ID)
59+
_ = coderdtest.AwaitTemplateVersionJob(t, client, version2.ID)
60+
61+
err = client.UpdateActiveTemplateVersion(context.Background(), template.ID, codersdk.UpdateActiveTemplateVersion{
62+
ID: version2.ID,
63+
})
64+
require.NoError(t, err)
65+
66+
cmd, root = clitest.New(t, "update", ws.Name)
67+
clitest.SetupConfig(t, client, root)
68+
69+
err = cmd.Execute()
70+
require.NoError(t, err)
71+
72+
ws, err = client.WorkspaceByOwnerAndName(context.Background(), "testuser", "my-workspace", codersdk.WorkspaceOptions{})
73+
require.NoError(t, err)
74+
require.Equal(t, version2.ID.String(), ws.LatestBuild.TemplateVersionID.String())
75+
})
76+
77+
t.Run("WithParameter", func(t *testing.T) {
78+
t.Parallel()
79+
80+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
81+
user := coderdtest.CreateFirstUser(t, client)
82+
version1 := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
83+
84+
coderdtest.AwaitTemplateVersionJob(t, client, version1.ID)
85+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version1.ID)
86+
87+
cmd, root := clitest.New(t, "create",
88+
"my-workspace",
89+
"--template", template.Name,
90+
"-y",
91+
)
92+
clitest.SetupConfig(t, client, root)
93+
94+
err := cmd.Execute()
95+
require.NoError(t, err)
96+
97+
ws, err := client.WorkspaceByOwnerAndName(context.Background(), "testuser", "my-workspace", codersdk.WorkspaceOptions{})
98+
require.NoError(t, err)
99+
require.Equal(t, version1.ID.String(), ws.LatestBuild.TemplateVersionID.String())
100+
101+
defaultValue := "something"
102+
version2 := coderdtest.UpdateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
103+
Parse: createTestParseResponseWithDefault(defaultValue),
104+
Provision: echo.ProvisionComplete,
105+
ProvisionDryRun: echo.ProvisionComplete,
106+
}, template.ID)
107+
coderdtest.AwaitTemplateVersionJob(t, client, version2.ID)
108+
109+
err = client.UpdateActiveTemplateVersion(context.Background(), template.ID, codersdk.UpdateActiveTemplateVersion{
110+
ID: version2.ID,
111+
})
112+
require.NoError(t, err)
113+
114+
cmd, root = clitest.New(t, "update", ws.Name)
115+
clitest.SetupConfig(t, client, root)
116+
117+
pty := ptytest.New(t)
118+
cmd.SetIn(pty.Input())
119+
cmd.SetOut(pty.Output())
120+
121+
doneChan := make(chan struct{})
122+
go func() {
123+
defer close(doneChan)
124+
err := cmd.Execute()
125+
assert.NoError(t, err)
126+
}()
127+
128+
matches := []string{
129+
fmt.Sprintf("Enter a value (default: %q):", defaultValue), "bingo",
130+
"Enter a value:", "boingo",
131+
}
132+
for i := 0; i < len(matches); i += 2 {
133+
match := matches[i]
134+
value := matches[i+1]
135+
pty.ExpectMatch(match)
136+
pty.WriteLine(value)
137+
}
138+
139+
<-doneChan
140+
})
141+
}

0 commit comments

Comments
 (0)