Skip to content

refactor: prebuilds tests #19161

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 3 additions & 25 deletions cli/delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (
"testing"
"time"

"github.com/coder/coder/v2/coderd/database/dbfake"

"github.com/google/uuid"

"github.com/coder/coder/v2/coderd/database"
Expand Down Expand Up @@ -246,7 +248,7 @@ func TestDelete(t *testing.T) {
// Given a template version with a preset and a template
version := coderdtest.CreateTemplateVersion(t, client, orgID, nil)
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
preset := setupTestDBPreset(t, db, version.ID)
preset := dbfake.NewPreset(t, db, version.ID).WithDesiredInstances(1).Do()
template := coderdtest.CreateTemplate(t, client, orgID, version.ID)

cases := []struct {
Expand Down Expand Up @@ -378,30 +380,6 @@ func TestDelete(t *testing.T) {
})
}

func setupTestDBPreset(
t *testing.T,
db database.Store,
templateVersionID uuid.UUID,
) database.TemplateVersionPreset {
t.Helper()

preset := dbgen.Preset(t, db, database.InsertPresetParams{
TemplateVersionID: templateVersionID,
Name: "preset-test",
DesiredInstances: sql.NullInt32{
Valid: true,
Int32: 1,
},
})
dbgen.PresetParameter(t, db, database.InsertPresetParametersParams{
TemplateVersionPresetID: preset.ID,
Names: []string{"test"},
Values: []string{"test"},
})

return preset
}

func setupTestDBWorkspace(
t *testing.T,
clock quartz.Clock,
Expand Down
31 changes: 4 additions & 27 deletions coderd/autobuild/lifecycle_executor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"testing"
"time"

"github.com/coder/coder/v2/coderd/database/dbfake"

"github.com/coder/coder/v2/coderd/database/dbgen"
"github.com/coder/coder/v2/coderd/database/pubsub"
"github.com/coder/coder/v2/coderd/rbac"
Expand Down Expand Up @@ -1231,7 +1233,7 @@ func TestExecutorPrebuilds(t *testing.T) {
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID)

// Database setup of a preset with a prebuild instance
preset := setupTestDBPreset(t, db, version.ID, int32(1))
preset := dbfake.NewPreset(t, db, version.ID).WithDesiredInstances(1).Do()

// Given: a running prebuilt workspace with a deadline and ready to be claimed
dbPrebuild := setupTestDBPrebuiltWorkspace(
Expand Down Expand Up @@ -1307,7 +1309,7 @@ func TestExecutorPrebuilds(t *testing.T) {
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID)

// Database setup of a preset with a prebuild instance
preset := setupTestDBPreset(t, db, version.ID, int32(1))
preset := dbfake.NewPreset(t, db, version.ID).WithDesiredInstances(1).Do()

// Given: prebuilt workspace is stopped and set to autostart daily at midnight
sched := mustSchedule(t, "CRON_TZ=UTC 0 0 * * *")
Expand Down Expand Up @@ -1384,31 +1386,6 @@ func TestExecutorPrebuilds(t *testing.T) {
})
}

func setupTestDBPreset(
t *testing.T,
db database.Store,
templateVersionID uuid.UUID,
desiredInstances int32,
) database.TemplateVersionPreset {
t.Helper()

preset := dbgen.Preset(t, db, database.InsertPresetParams{
TemplateVersionID: templateVersionID,
Name: "preset-test",
DesiredInstances: sql.NullInt32{
Valid: true,
Int32: desiredInstances,
},
})
dbgen.PresetParameter(t, db, database.InsertPresetParametersParams{
TemplateVersionPresetID: preset.ID,
Names: []string{"test-name"},
Values: []string{"test-value"},
})

return preset
}

type SetupPrebuiltOptions struct {
AutostartSchedule sql.NullString
IsStopped bool
Expand Down
66 changes: 66 additions & 0 deletions coderd/database/dbfake/dbfake.go
Original file line number Diff line number Diff line change
Expand Up @@ -563,6 +563,72 @@ func (b JobCompleteBuilder) Do() JobCompleteResponse {
return r
}

type PresetBuilder struct {
t *testing.T
db database.Store
presetName string
templateVersionID uuid.UUID
desiredInstances int32
// Optional parameters
ttl *int32
}

func NewPreset(t *testing.T, db database.Store, templateVersionID uuid.UUID) PresetBuilder {
return PresetBuilder{
t: t,
db: db,
presetName: uuid.New().String(),
templateVersionID: templateVersionID,
desiredInstances: 0, // Default to 0 prebuild instances
}
}

func (b PresetBuilder) WithPresetName(name string) PresetBuilder {
b.presetName = name
return b
}

func (b PresetBuilder) WithDesiredInstances(instances int32) PresetBuilder {
b.desiredInstances = instances
return b
}

func (b PresetBuilder) WithTTL(ttl int32) PresetBuilder {
b.ttl = &ttl
return b
}

func (b PresetBuilder) Do() database.TemplateVersionPreset {
// Using only required fields for testing; other fields will use DB defaults.
//nolint:exhaustruct
insertPresetParams := database.InsertPresetParams{
TemplateVersionID: b.templateVersionID,
Name: b.presetName,
DesiredInstances: sql.NullInt32{
Valid: true,
Int32: b.desiredInstances,
},
}

// Handle optional TTL
if b.ttl != nil {
insertPresetParams.InvalidateAfterSecs = sql.NullInt32{
Valid: true,
Int32: *b.ttl,
}
}

preset := dbgen.Preset(b.t, b.db, insertPresetParams)

dbgen.PresetParameter(b.t, b.db, database.InsertPresetParametersParams{
TemplateVersionPresetID: preset.ID,
Names: []string{"test-name"},
Values: []string{"test-value"},
})

return preset
}

func must[V any](v V, err error) V {
if err != nil {
panic(err)
Expand Down
6 changes: 4 additions & 2 deletions enterprise/coderd/prebuilds/metricscollector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"slices"
"testing"

"github.com/coder/coder/v2/coderd/database/dbfake"

"github.com/google/uuid"
"github.com/stretchr/testify/require"
"tailscale.com/types/ptr"
Expand Down Expand Up @@ -222,7 +224,7 @@ func TestMetricsCollector(t *testing.T) {
for i := 0; i < numTemplates; i++ {
org, template := setupTestDBTemplate(t, db, ownerID, templateDeleted)
templateVersionID := setupTestDBTemplateVersion(ctx, t, clock, db, pubsub, org.ID, ownerID, template.ID)
preset := setupTestDBPreset(t, db, templateVersionID, 1, uuid.New().String())
preset := dbfake.NewPreset(t, db, templateVersionID).WithDesiredInstances(1).Do()
workspace, _ := setupTestDBWorkspace(
t, clock, db, pubsub,
transition, jobStatus, org.ID, preset, template.ID, templateVersionID, initiatorID, ownerID,
Expand Down Expand Up @@ -350,7 +352,7 @@ func TestMetricsCollector_DuplicateTemplateNames(t *testing.T) {
setupTemplateWithDeps := func() database.Template {
template := setupTestDBTemplateWithinOrg(t, db, test.ownerID, false, "default-template", defaultOrg)
templateVersionID := setupTestDBTemplateVersion(ctx, t, clock, db, pubsub, defaultOrg.ID, test.ownerID, template.ID)
preset := setupTestDBPreset(t, db, templateVersionID, 1, "default-preset")
preset := dbfake.NewPreset(t, db, templateVersionID).WithPresetName(presetName).WithDesiredInstances(1).Do()
workspace, _ := setupTestDBWorkspace(
t, clock, db, pubsub,
test.transition, test.jobStatus, defaultOrg.ID, preset, template.ID, templateVersionID, test.initiatorID, test.ownerID,
Expand Down
Loading
Loading