Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c43aedc

Browse files
committed
Unit test param prompting
1 parent bcca07a commit c43aedc

File tree

5 files changed

+189
-52
lines changed

5 files changed

+189
-52
lines changed

cli/parameterslist.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ func parameterList() *cobra.Command {
4545
return xerrors.Errorf("get workspace template: %w", err)
4646
}
4747
scopeID = template.ID
48-
4948
case codersdk.ParameterImportJob, "template_version":
5049
scope = string(codersdk.ParameterImportJob)
5150
scopeID, err = uuid.Parse(name)

cli/templateupdate_test.go

Lines changed: 142 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"testing"
66

7+
"github.com/google/uuid"
78
"github.com/stretchr/testify/assert"
89
"github.com/stretchr/testify/require"
910

@@ -17,47 +18,150 @@ import (
1718

1819
func TestTemplateUpdate(t *testing.T) {
1920
t.Parallel()
21+
// NewParameter will:
22+
// 1. Create a template version with 0 params
23+
// 2. Create a new version with 1 param
24+
// 2a. Expects 1 param prompt, fills in value
25+
// 3. Assert 1 param value in new version
26+
// 4. Creates a new version with same param
27+
// 4a. Expects 0 prompts as the param value is carried over
28+
// 5. Assert 1 param value in new version
29+
// 6. Creates a new version with 0 params
30+
// 7. Asset 0 params in new version
31+
t.Run("NewParameter", func(t *testing.T) {
32+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
33+
user := coderdtest.CreateFirstUser(t, client)
34+
// Create initial template version to update
35+
lastActiveVersion := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
36+
_ = coderdtest.AwaitTemplateVersionJob(t, client, lastActiveVersion.ID)
37+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, lastActiveVersion.ID)
2038

21-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
22-
user := coderdtest.CreateFirstUser(t, client)
23-
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
24-
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
25-
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
39+
// Create new template version with a new parameter
40+
source := clitest.CreateTemplateVersionSource(t, &echo.Responses{
41+
Parse: createTestParseResponse(),
42+
Provision: echo.ProvisionComplete,
43+
})
44+
cmd, root := clitest.New(t, "templates", "update", template.Name, "-y", "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho))
45+
clitest.SetupConfig(t, client, root)
46+
pty := ptytest.New(t)
47+
cmd.SetIn(pty.Input())
48+
cmd.SetOut(pty.Output())
2649

27-
// Test the cli command.
28-
source := clitest.CreateTemplateVersionSource(t, &echo.Responses{
29-
Parse: echo.ParseComplete,
30-
Provision: echo.ProvisionComplete,
50+
execDone := make(chan error)
51+
go func() {
52+
execDone <- cmd.Execute()
53+
}()
54+
55+
matches := []struct {
56+
match string
57+
write string
58+
}{
59+
// Expect to be prompted for the new param
60+
{match: "Enter a value:", write: "peter-pan"},
61+
}
62+
for _, m := range matches {
63+
pty.ExpectMatch(m.match)
64+
pty.WriteLine(m.write)
65+
}
66+
67+
require.NoError(t, <-execDone)
68+
69+
// Assert template version changed and we have the new param
70+
latestTV, latestParams := latestTemplateVersion(t, client, template.ID)
71+
assert.NotEqual(t, lastActiveVersion.ID, latestTV.ID)
72+
require.Len(t, latestParams, 1, "expect 1 param")
73+
lastActiveVersion = latestTV
74+
75+
// Second update of the same source requires no prompt since the params
76+
// are carried over.
77+
cmd, root = clitest.New(t, "templates", "update", template.Name, "-y", "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho))
78+
clitest.SetupConfig(t, client, root)
79+
go func() {
80+
execDone <- cmd.Execute()
81+
}()
82+
require.NoError(t, <-execDone)
83+
84+
// Assert template version changed and we have the carried over param
85+
latestTV, latestParams = latestTemplateVersion(t, client, template.ID)
86+
assert.NotEqual(t, lastActiveVersion.ID, latestTV.ID)
87+
require.Len(t, latestParams, 1, "expect 1 param")
88+
lastActiveVersion = latestTV
89+
90+
// Remove the param
91+
source = clitest.CreateTemplateVersionSource(t, &echo.Responses{
92+
Parse: echo.ParseComplete,
93+
Provision: echo.ProvisionComplete,
94+
})
95+
96+
cmd, root = clitest.New(t, "templates", "update", template.Name, "-y", "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho))
97+
clitest.SetupConfig(t, client, root)
98+
go func() {
99+
execDone <- cmd.Execute()
100+
}()
101+
require.NoError(t, <-execDone)
102+
// Assert template version changed and the param was removed
103+
latestTV, latestParams = latestTemplateVersion(t, client, template.ID)
104+
assert.NotEqual(t, lastActiveVersion.ID, latestTV.ID)
105+
require.Len(t, latestParams, 0, "expect 0 param")
106+
lastActiveVersion = latestTV
31107
})
32-
cmd, root := clitest.New(t, "templates", "update", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho))
33-
clitest.SetupConfig(t, client, root)
34-
pty := ptytest.New(t)
35-
cmd.SetIn(pty.Input())
36-
cmd.SetOut(pty.Output())
37-
38-
execDone := make(chan error)
39-
go func() {
40-
execDone <- cmd.Execute()
41-
}()
42-
43-
matches := []struct {
44-
match string
45-
write string
46-
}{
47-
{match: "Upload", write: "yes"},
48-
}
49-
for _, m := range matches {
50-
pty.ExpectMatch(m.match)
51-
pty.WriteLine(m.write)
52-
}
53-
54-
require.NoError(t, <-execDone)
55-
56-
// Assert that the template version changed.
57-
templateVersions, err := client.TemplateVersionsByTemplate(context.Background(), codersdk.TemplateVersionsByTemplateRequest{
58-
TemplateID: template.ID,
108+
109+
t.Run("OK", func(t *testing.T) {
110+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
111+
user := coderdtest.CreateFirstUser(t, client)
112+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
113+
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
114+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
115+
116+
// Test the cli command.
117+
source := clitest.CreateTemplateVersionSource(t, &echo.Responses{
118+
Parse: echo.ParseComplete,
119+
Provision: echo.ProvisionComplete,
120+
})
121+
cmd, root := clitest.New(t, "templates", "update", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho))
122+
clitest.SetupConfig(t, client, root)
123+
pty := ptytest.New(t)
124+
cmd.SetIn(pty.Input())
125+
cmd.SetOut(pty.Output())
126+
127+
execDone := make(chan error)
128+
go func() {
129+
execDone <- cmd.Execute()
130+
}()
131+
132+
matches := []struct {
133+
match string
134+
write string
135+
}{
136+
{match: "Upload", write: "yes"},
137+
}
138+
for _, m := range matches {
139+
pty.ExpectMatch(m.match)
140+
pty.WriteLine(m.write)
141+
}
142+
143+
require.NoError(t, <-execDone)
144+
145+
// Assert that the template version changed.
146+
templateVersions, err := client.TemplateVersionsByTemplate(context.Background(), codersdk.TemplateVersionsByTemplateRequest{
147+
TemplateID: template.ID,
148+
})
149+
require.NoError(t, err)
150+
assert.Len(t, templateVersions, 2)
151+
assert.NotEqual(t, template.ActiveVersionID, templateVersions[1].ID)
59152
})
153+
}
154+
155+
func latestTemplateVersion(t *testing.T, client *codersdk.Client, templateID uuid.UUID) (codersdk.TemplateVersion, []codersdk.Parameter) {
156+
t.Helper()
157+
158+
ctx := context.Background()
159+
newTemplate, err := client.Template(ctx, templateID)
160+
require.NoError(t, err)
161+
tv, err := client.TemplateVersion(ctx, newTemplate.ActiveVersionID)
60162
require.NoError(t, err)
61-
assert.Len(t, templateVersions, 2)
62-
assert.NotEqual(t, template.ActiveVersionID, templateVersions[1].ID)
163+
params, err := client.Parameters(ctx, codersdk.ParameterImportJob, tv.Job.ID)
164+
require.NoError(t, err)
165+
166+
return tv, params
63167
}

coderd/database/databasefake/databasefake.go

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"sync"
99
"time"
1010

11+
"github.com/coder/coder/coderd/util/slice"
12+
1113
"github.com/google/uuid"
1214
"golang.org/x/exp/slices"
1315

@@ -66,6 +68,8 @@ type fakeQuerier struct {
6668
workspaceBuilds []database.WorkspaceBuild
6769
workspaceApps []database.WorkspaceApp
6870
workspaces []database.Workspace
71+
72+
deploymentID string
6973
}
7074

7175
// InTx doesn't rollback data properly for in-memory yet.
@@ -762,18 +766,18 @@ func (q *fakeQuerier) ParameterValues(_ context.Context, arg database.ParameterV
762766
parameterValues := make([]database.ParameterValue, 0)
763767
for _, parameterValue := range q.parameterValues {
764768
if len(arg.Scopes) > 0 {
765-
if !contains(arg.Scopes, parameterValue.Scope) {
769+
if !slice.Contains(arg.Scopes, parameterValue.Scope) {
766770
continue
767771
}
768772
}
769773
if len(arg.ScopeIds) > 0 {
770-
if !contains(arg.ScopeIds, parameterValue.ScopeID) {
774+
if !slice.Contains(arg.ScopeIds, parameterValue.ScopeID) {
771775
continue
772776
}
773777
}
774778

775779
if len(arg.Ids) > 0 {
776-
if !contains(arg.Ids, parameterValue.ID) {
780+
if !slice.Contains(arg.Ids, parameterValue.ID) {
777781
continue
778782
}
779783
}
@@ -2115,13 +2119,3 @@ func (q *fakeQuerier) GetDeploymentID(_ context.Context) (string, error) {
21152119

21162120
return q.deploymentID, nil
21172121
}
2118-
2119-
2120-
func contains[T comparable](haystack []T, needle T) bool {
2121-
for _, hay := range haystack {
2122-
if needle == hay {
2123-
return true
2124-
}
2125-
}
2126-
return false
2127-
}

coderd/util/slice/slice.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package slice
2+
3+
func Contains[T comparable](haystack []T, needle T) bool {
4+
for _, hay := range haystack {
5+
if needle == hay {
6+
return true
7+
}
8+
}
9+
return false
10+
}

coderd/util/slice/slice_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package slice_test
2+
3+
import (
4+
"github.com/coder/coder/coderd/util/slice"
5+
"github.com/google/uuid"
6+
"github.com/stretchr/testify/require"
7+
"testing"
8+
)
9+
10+
func TestContains(t *testing.T) {
11+
testContains(t, []int{1, 2, 3, 4, 5}, []int{1, 2, 3, 4, 5}, []int{0, 6, -1, -2, 100})
12+
testContains(t, []string{"hello", "world", "foo", "bar", "baz"}, []string{"hello", "world", "baz"}, []string{"not", "words", "in", "set"})
13+
testContains(t,
14+
[]uuid.UUID{uuid.New(), uuid.MustParse("c7c6686d-a93c-4df2-bef9-5f837e9a33d5"), uuid.MustParse("8f3b3e0b-2c3f-46a5-a365-fd5b62bd8818")},
15+
[]uuid.UUID{uuid.MustParse("c7c6686d-a93c-4df2-bef9-5f837e9a33d5")},
16+
[]uuid.UUID{uuid.MustParse("1d00e27d-8de6-46f8-80d5-1da0ca83874a")},
17+
)
18+
}
19+
20+
func testContains[T comparable](t *testing.T, set []T, in []T, out []T) {
21+
for _, e := range set {
22+
require.True(t, slice.Contains(set, e), "elements in set should be in the set")
23+
}
24+
for _, e := range in {
25+
require.True(t, slice.Contains(set, e), "expect element in set")
26+
}
27+
for _, e := range out {
28+
require.False(t, slice.Contains(set, e), "expect element in set")
29+
}
30+
}

0 commit comments

Comments
 (0)