Skip to content

Commit 5e49d8c

Browse files
authored
chore: reduce execution time of TestProvisionerJobs (#19475)
Note: this commit was partially authored by AI. - Replaces coderdtest.CreateTemplate/TemplateVersion() with direct dbgen calls. We do not need a fully functional template for these tests. - Removes provisioner daemon creation/cleanup. We do not need a running provisioner daemon here; this functionality is tested elsewhere. - Simplifies provisioner job creation test helpers. This reduces the test runtime by over 50%: Old: ``` time go test -count=100 ./cli -test.run=TestProvisionerJobs ok github.com/coder/coder/v2/cli 50.149s ``` New: ``` time go test -count=100 ./cli -test.run=TestProvisionerJobs ok github.com/coder/coder/v2/cli 21.898 ```
1 parent 4970da4 commit 5e49d8c

File tree

1 file changed

+52
-59
lines changed

1 file changed

+52
-59
lines changed

cli/provisionerjobs_test.go

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

11-
"github.com/aws/smithy-go/ptr"
1211
"github.com/google/uuid"
1312
"github.com/stretchr/testify/assert"
1413
"github.com/stretchr/testify/require"
@@ -20,6 +19,7 @@ import (
2019
"github.com/coder/coder/v2/coderd/database/dbtestutil"
2120
"github.com/coder/coder/v2/coderd/rbac"
2221
"github.com/coder/coder/v2/codersdk"
22+
"github.com/coder/coder/v2/provisionersdk"
2323
"github.com/coder/coder/v2/testutil"
2424
)
2525

@@ -36,67 +36,43 @@ func TestProvisionerJobs(t *testing.T) {
3636
templateAdminClient, templateAdmin := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.ScopedRoleOrgTemplateAdmin(owner.OrganizationID))
3737
memberClient, member := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
3838

39-
// Create initial resources with a running provisioner.
40-
firstProvisioner := coderdtest.NewTaggedProvisionerDaemon(t, coderdAPI, "default-provisioner", map[string]string{"owner": "", "scope": "organization"})
41-
t.Cleanup(func() { _ = firstProvisioner.Close() })
42-
version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, completeWithAgent())
43-
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
44-
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID, func(req *codersdk.CreateTemplateRequest) {
45-
req.AllowUserCancelWorkspaceJobs = ptr.Bool(true)
39+
// These CLI tests are related to provisioner job CRUD operations and as such
40+
// do not require the overhead of starting a provisioner. Other provisioner job
41+
// functionalities (acquisition etc.) are tested elsewhere.
42+
template := dbgen.Template(t, db, database.Template{
43+
OrganizationID: owner.OrganizationID,
44+
CreatedBy: owner.UserID,
45+
AllowUserCancelWorkspaceJobs: true,
46+
})
47+
version := dbgen.TemplateVersion(t, db, database.TemplateVersion{
48+
OrganizationID: owner.OrganizationID,
49+
CreatedBy: owner.UserID,
50+
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
4651
})
47-
48-
// Stop the provisioner so it doesn't grab any more jobs.
49-
firstProvisioner.Close()
5052

5153
t.Run("Cancel", func(t *testing.T) {
5254
t.Parallel()
5355

54-
// Set up test helpers.
55-
type jobInput struct {
56-
WorkspaceBuildID string `json:"workspace_build_id,omitempty"`
57-
TemplateVersionID string `json:"template_version_id,omitempty"`
58-
DryRun bool `json:"dry_run,omitempty"`
59-
}
60-
prepareJob := func(t *testing.T, input jobInput) database.ProvisionerJob {
56+
// Test helper to create a provisioner job of a given type with a given input.
57+
prepareJob := func(t *testing.T, jobType database.ProvisionerJobType, input json.RawMessage) database.ProvisionerJob {
6158
t.Helper()
62-
63-
inputBytes, err := json.Marshal(input)
64-
require.NoError(t, err)
65-
66-
var typ database.ProvisionerJobType
67-
switch {
68-
case input.WorkspaceBuildID != "":
69-
typ = database.ProvisionerJobTypeWorkspaceBuild
70-
case input.TemplateVersionID != "":
71-
if input.DryRun {
72-
typ = database.ProvisionerJobTypeTemplateVersionDryRun
73-
} else {
74-
typ = database.ProvisionerJobTypeTemplateVersionImport
75-
}
76-
default:
77-
t.Fatal("invalid input")
78-
}
79-
80-
var (
81-
tags = database.StringMap{"owner": "", "scope": "organization", "foo": uuid.New().String()}
82-
_ = dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{Tags: tags})
83-
job = dbgen.ProvisionerJob(t, db, coderdAPI.Pubsub, database.ProvisionerJob{
84-
InitiatorID: member.ID,
85-
Input: json.RawMessage(inputBytes),
86-
Type: typ,
87-
Tags: tags,
88-
StartedAt: sql.NullTime{Time: coderdAPI.Clock.Now().Add(-time.Minute), Valid: true},
89-
})
90-
)
91-
return job
59+
return dbgen.ProvisionerJob(t, db, coderdAPI.Pubsub, database.ProvisionerJob{
60+
InitiatorID: member.ID,
61+
Input: input,
62+
Type: jobType,
63+
StartedAt: sql.NullTime{Time: coderdAPI.Clock.Now().Add(-time.Minute), Valid: true},
64+
Tags: database.StringMap{provisionersdk.TagOwner: "", provisionersdk.TagScope: provisionersdk.ScopeOrganization, "foo": uuid.NewString()},
65+
})
9266
}
9367

68+
// Test helper to create a workspace build job with a predefined input.
9469
prepareWorkspaceBuildJob := func(t *testing.T) database.ProvisionerJob {
9570
t.Helper()
9671
var (
97-
wbID = uuid.New()
98-
job = prepareJob(t, jobInput{WorkspaceBuildID: wbID.String()})
99-
w = dbgen.Workspace(t, db, database.WorkspaceTable{
72+
wbID = uuid.New()
73+
input, _ = json.Marshal(map[string]string{"workspace_build_id": wbID.String()})
74+
job = prepareJob(t, database.ProvisionerJobTypeWorkspaceBuild, input)
75+
w = dbgen.Workspace(t, db, database.WorkspaceTable{
10076
OrganizationID: owner.OrganizationID,
10177
OwnerID: member.ID,
10278
TemplateID: template.ID,
@@ -112,12 +88,14 @@ func TestProvisionerJobs(t *testing.T) {
11288
return job
11389
}
11490

115-
prepareTemplateVersionImportJobBuilder := func(t *testing.T, dryRun bool) database.ProvisionerJob {
91+
// Test helper to create a template version import job with a predefined input.
92+
prepareTemplateVersionImportJob := func(t *testing.T) database.ProvisionerJob {
11693
t.Helper()
11794
var (
118-
tvID = uuid.New()
119-
job = prepareJob(t, jobInput{TemplateVersionID: tvID.String(), DryRun: dryRun})
120-
_ = dbgen.TemplateVersion(t, db, database.TemplateVersion{
95+
tvID = uuid.New()
96+
input, _ = json.Marshal(map[string]string{"template_version_id": tvID.String()})
97+
job = prepareJob(t, database.ProvisionerJobTypeTemplateVersionImport, input)
98+
_ = dbgen.TemplateVersion(t, db, database.TemplateVersion{
12199
OrganizationID: owner.OrganizationID,
122100
CreatedBy: templateAdmin.ID,
123101
ID: tvID,
@@ -127,11 +105,26 @@ func TestProvisionerJobs(t *testing.T) {
127105
)
128106
return job
129107
}
130-
prepareTemplateVersionImportJob := func(t *testing.T) database.ProvisionerJob {
131-
return prepareTemplateVersionImportJobBuilder(t, false)
132-
}
108+
109+
// Test helper to create a template version import dry run job with a predefined input.
133110
prepareTemplateVersionImportJobDryRun := func(t *testing.T) database.ProvisionerJob {
134-
return prepareTemplateVersionImportJobBuilder(t, true)
111+
t.Helper()
112+
var (
113+
tvID = uuid.New()
114+
input, _ = json.Marshal(map[string]interface{}{
115+
"template_version_id": tvID.String(),
116+
"dry_run": true,
117+
})
118+
job = prepareJob(t, database.ProvisionerJobTypeTemplateVersionDryRun, input)
119+
_ = dbgen.TemplateVersion(t, db, database.TemplateVersion{
120+
OrganizationID: owner.OrganizationID,
121+
CreatedBy: templateAdmin.ID,
122+
ID: tvID,
123+
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
124+
JobID: job.ID,
125+
})
126+
)
127+
return job
135128
}
136129

137130
// Run the cancellation test suite.

0 commit comments

Comments
 (0)