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

Skip to content

Commit 1713431

Browse files
committed
RED: add failing unit tests
1 parent 2b12bee commit 1713431

File tree

6 files changed

+153
-8
lines changed

6 files changed

+153
-8
lines changed

cli/autostart_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"os"
88
"testing"
9+
"time"
910

1011
"github.com/stretchr/testify/require"
1112

@@ -158,4 +159,32 @@ func TestAutostart(t *testing.T) {
158159
require.NoError(t, err, "fetch updated workspace")
159160
require.Equal(t, expectedSchedule, *updated.AutostartSchedule, "expected default autostart schedule")
160161
})
162+
163+
t.Run("BelowTemplateConstraint", func(t *testing.T) {
164+
t.Parallel()
165+
166+
var (
167+
ctx = context.Background()
168+
client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
169+
user = coderdtest.CreateFirstUser(t, client)
170+
version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
171+
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
172+
project = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
173+
ctr.MinAutostartIntervalMillis = ptr.Ref(time.Hour.Milliseconds())
174+
})
175+
workspace = coderdtest.CreateWorkspace(t, client, user.OrganizationID, project.ID)
176+
cmdArgs = []string{"autostart", "enable", workspace.Name, "--minute", "*", "--hour", "*"}
177+
)
178+
179+
cmd, root := clitest.New(t, cmdArgs...)
180+
clitest.SetupConfig(t, client, root)
181+
182+
err := cmd.Execute()
183+
require.NoError(t, err, "unexpected error")
184+
185+
// Ensure nothing happened
186+
updated, err := client.Workspace(ctx, workspace.ID)
187+
require.NoError(t, err, "fetch updated workspace")
188+
require.Equal(t, *workspace.AutostartSchedule, *updated.AutostartSchedule, "expected previous autostart schedule")
189+
})
161190
}

cli/create_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/coder/coder/cli/clitest"
1515
"github.com/coder/coder/coderd/coderdtest"
1616
"github.com/coder/coder/coderd/database"
17+
"github.com/coder/coder/coderd/util/ptr"
1718
"github.com/coder/coder/codersdk"
1819
"github.com/coder/coder/provisioner/echo"
1920
"github.com/coder/coder/provisionersdk/proto"
@@ -62,6 +63,63 @@ func TestCreate(t *testing.T) {
6263
<-doneChan
6364
})
6465

66+
t.Run("AboveTemplateMaxTTL", func(t *testing.T) {
67+
t.Parallel()
68+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
69+
user := coderdtest.CreateFirstUser(t, client)
70+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
71+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
72+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
73+
ctr.MaxTTLMillis = ptr.Ref((12 * time.Hour).Milliseconds())
74+
})
75+
args := []string{
76+
"create",
77+
"my-workspace",
78+
"--template", template.Name,
79+
"--ttl", "24h",
80+
}
81+
cmd, root := clitest.New(t, args...)
82+
clitest.SetupConfig(t, client, root)
83+
errCh := make(chan error)
84+
pty := ptytest.New(t)
85+
cmd.SetIn(pty.Input())
86+
cmd.SetOut(pty.Output())
87+
go func() {
88+
defer close(errCh)
89+
errCh <- cmd.Execute()
90+
}()
91+
require.EqualError(t, <-errCh, "TODO what is the error")
92+
})
93+
94+
t.Run("BelowTemplateMinAutostartInterval", func(t *testing.T) {
95+
t.Parallel()
96+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
97+
user := coderdtest.CreateFirstUser(t, client)
98+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
99+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
100+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
101+
ctr.MinAutostartIntervalMillis = ptr.Ref(time.Hour.Milliseconds())
102+
})
103+
args := []string{
104+
"create",
105+
"my-workspace",
106+
"--template", template.Name,
107+
"--autostart-minute", "*", // Every minute
108+
"--autostart-hour", "*", // Every hour
109+
}
110+
cmd, root := clitest.New(t, args...)
111+
clitest.SetupConfig(t, client, root)
112+
errCh := make(chan error)
113+
pty := ptytest.New(t)
114+
cmd.SetIn(pty.Input())
115+
cmd.SetOut(pty.Output())
116+
go func() {
117+
defer close(errCh)
118+
errCh <- cmd.Execute()
119+
}()
120+
require.EqualError(t, <-errCh, "TODO what is the error")
121+
})
122+
65123
t.Run("CreateErrInvalidTz", func(t *testing.T) {
66124
t.Parallel()
67125
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})

cli/ttl_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,37 @@ func TestTTL(t *testing.T) {
168168
err := cmd.Execute()
169169
require.ErrorContains(t, err, "status code 403: forbidden", "unexpected error")
170170
})
171+
172+
t.Run("TemplateMaxTTL", func(t *testing.T) {
173+
t.Parallel()
174+
175+
var (
176+
ctx = context.Background()
177+
client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
178+
user = coderdtest.CreateFirstUser(t, client)
179+
version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
180+
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
181+
project = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
182+
ctr.MaxTTLMillis = ptr.Ref((8 * time.Hour).Milliseconds())
183+
})
184+
workspace = coderdtest.CreateWorkspace(t, client, user.OrganizationID, project.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
185+
cwr.TTLMillis = ptr.Ref((8 * time.Hour).Milliseconds())
186+
})
187+
cmdArgs = []string{"ttl", "set", workspace.Name, "24h"}
188+
stdoutBuf = &bytes.Buffer{}
189+
)
190+
191+
cmd, root := clitest.New(t, cmdArgs...)
192+
clitest.SetupConfig(t, client, root)
193+
cmd.SetOut(stdoutBuf)
194+
195+
err := cmd.Execute()
196+
require.EqualError(t, err, "TODO what is the error")
197+
198+
// Ensure ttl not updated
199+
updated, err := client.Workspace(ctx, workspace.ID)
200+
require.NoError(t, err, "fetch updated workspace")
201+
require.NotNil(t, updated.TTLMillis)
202+
require.Equal(t, (8 * time.Hour).Milliseconds, *updated.TTLMillis)
203+
})
171204
}

coderd/coderdtest/coderdtest.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -322,12 +322,16 @@ func CreateWorkspaceBuild(
322322

323323
// CreateTemplate creates a template with the "echo" provisioner for
324324
// compatibility with testing. The name assigned is randomly generated.
325-
func CreateTemplate(t *testing.T, client *codersdk.Client, organization uuid.UUID, version uuid.UUID) codersdk.Template {
326-
template, err := client.CreateTemplate(context.Background(), organization, codersdk.CreateTemplateRequest{
325+
func CreateTemplate(t *testing.T, client *codersdk.Client, organization uuid.UUID, version uuid.UUID, mutators ...func(*codersdk.CreateTemplateRequest)) codersdk.Template {
326+
req := codersdk.CreateTemplateRequest{
327327
Name: randomUsername(),
328328
Description: randomUsername(),
329329
VersionID: version,
330-
})
330+
}
331+
for _, mut := range mutators {
332+
mut(&req)
333+
}
334+
template, err := client.CreateTemplate(context.Background(), organization, req)
331335
require.NoError(t, err)
332336
return template
333337
}
@@ -400,7 +404,7 @@ func CreateWorkspace(t *testing.T, client *codersdk.Client, organization uuid.UU
400404
req := codersdk.CreateWorkspaceRequest{
401405
TemplateID: templateID,
402406
Name: randomUsername(),
403-
AutostartSchedule: ptr.Ref("CRON_TZ=US/Central * * * * *"),
407+
AutostartSchedule: ptr.Ref("CRON_TZ=US/Central 30 9 * * 1-5"),
404408
TTLMillis: ptr.Ref((8 * time.Hour).Milliseconds()),
405409
}
406410
for _, mutator := range mutators {

coderd/workspaces_test.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -588,9 +588,10 @@ func TestWorkspaceUpdateTTL(t *testing.T) {
588588
t.Parallel()
589589

590590
testCases := []struct {
591-
name string
592-
ttlMillis *int64
593-
expectedError string
591+
name string
592+
ttlMillis *int64
593+
expectedError string
594+
modifyTemplate func(*codersdk.CreateTemplateRequest)
594595
}{
595596
{
596597
name: "disable ttl",
@@ -617,19 +618,30 @@ func TestWorkspaceUpdateTTL(t *testing.T) {
617618
ttlMillis: ptr.Ref((24*7*time.Hour + time.Minute).Milliseconds()),
618619
expectedError: "ttl must be less than 7 days",
619620
},
621+
{
622+
name: "above template maximum ttl",
623+
ttlMillis: ptr.Ref((12*time.Hour + time.Minute).Milliseconds()),
624+
expectedError: "TODO what is the error",
625+
modifyTemplate: func(ctr *codersdk.CreateTemplateRequest) { ctr.MaxTTLMillis = ptr.Ref((8 * time.Hour).Milliseconds()) },
626+
},
620627
}
621628

622629
for _, testCase := range testCases {
623630
testCase := testCase
624631
t.Run(testCase.name, func(t *testing.T) {
625632
t.Parallel()
633+
634+
mutators := make([]func(*codersdk.CreateTemplateRequest), 0)
635+
if testCase.modifyTemplate != nil {
636+
mutators = append(mutators, testCase.modifyTemplate)
637+
}
626638
var (
627639
ctx = context.Background()
628640
client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
629641
user = coderdtest.CreateFirstUser(t, client)
630642
version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
631643
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
632-
project = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
644+
project = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, mutators...)
633645
workspace = coderdtest.CreateWorkspace(t, client, user.OrganizationID, project.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
634646
cwr.AutostartSchedule = nil
635647
cwr.TTLMillis = nil

codersdk/organizations.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ type CreateTemplateRequest struct {
6161
// templates, but it doesn't make sense for users.
6262
VersionID uuid.UUID `json:"template_version_id" validate:"required"`
6363
ParameterValues []CreateParameterRequest `json:"parameter_values,omitempty"`
64+
65+
// MaxTTLMillis allows optionally specifying the maximum allowable TTL
66+
// for all workspaces created from this template.
67+
MaxTTLMillis *int64 `json:"max_ttl_ms,omitempty"`
68+
69+
// MinAutostartIntervalMillis allows optionally specifying the minimum
70+
// allowable duration between autostarts for all workspaces created from
71+
// this template.
72+
MinAutostartIntervalMillis *int64 `json:"min_autostart_interval_ms,omitempty"`
6473
}
6574

6675
// CreateWorkspaceRequest provides options for creating a new workspace.

0 commit comments

Comments
 (0)