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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy