Skip to content

Commit 2c48c95

Browse files
committed
chore: add test to ensure correct functionality of GetRunningPrebuiltWorkspaces
1 parent 7d412c2 commit 2c48c95

File tree

1 file changed

+142
-0
lines changed

1 file changed

+142
-0
lines changed

coderd/database/querier_test.go

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5021,3 +5021,145 @@ func requireUsersMatch(t testing.TB, expected []database.User, found []database.
50215021
t.Helper()
50225022
require.ElementsMatch(t, expected, database.ConvertUserRows(found), msg)
50235023
}
5024+
5025+
// TestGetRunningPrebuiltWorkspaces ensures the correct behavior of the
5026+
// GetRunningPrebuiltWorkspaces query.
5027+
func TestGetRunningPrebuiltWorkspaces(t *testing.T) {
5028+
t.Parallel()
5029+
5030+
if !dbtestutil.WillUsePostgres() {
5031+
t.Skip("Test requires PostgreSQL for complex queries")
5032+
}
5033+
5034+
ctx := testutil.Context(t, testutil.WaitLong)
5035+
db, _ := dbtestutil.NewDB(t)
5036+
5037+
// Given: a prebuilt workspace with a successful start build and a stop build.
5038+
org := dbgen.Organization(t, db, database.Organization{})
5039+
user := dbgen.User(t, db, database.User{})
5040+
template := dbgen.Template(t, db, database.Template{
5041+
CreatedBy: user.ID,
5042+
OrganizationID: org.ID,
5043+
})
5044+
templateVersion := dbgen.TemplateVersion(t, db, database.TemplateVersion{
5045+
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
5046+
OrganizationID: org.ID,
5047+
CreatedBy: user.ID,
5048+
})
5049+
preset := dbgen.Preset(t, db, database.InsertPresetParams{
5050+
TemplateVersionID: templateVersion.ID,
5051+
DesiredInstances: sql.NullInt32{Int32: 1, Valid: true},
5052+
})
5053+
5054+
// Create a prebuild workspace (owned by system user)
5055+
prebuildSystemUser := uuid.MustParse("c42fdf75-3097-471c-8c33-fb52454d81c0")
5056+
stoppedPrebuild := dbgen.Workspace(t, db, database.WorkspaceTable{
5057+
OwnerID: prebuildSystemUser,
5058+
TemplateID: template.ID,
5059+
Name: "test-prebuild",
5060+
Deleted: false,
5061+
})
5062+
5063+
// Create a successful START build
5064+
stoppedPrebuildJob1 := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{
5065+
OrganizationID: org.ID,
5066+
InitiatorID: database.PrebuildsSystemUserID,
5067+
Provisioner: database.ProvisionerTypeEcho,
5068+
Type: database.ProvisionerJobTypeWorkspaceBuild,
5069+
StartedAt: sql.NullTime{Time: dbtime.Now().Add(-time.Minute), Valid: true},
5070+
CompletedAt: sql.NullTime{Time: dbtime.Now(), Valid: true},
5071+
Error: sql.NullString{},
5072+
ErrorCode: sql.NullString{},
5073+
})
5074+
stoppedPrebuiltWorkspaceBuild1 := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{
5075+
WorkspaceID: stoppedPrebuild.ID,
5076+
TemplateVersionID: templateVersion.ID,
5077+
TemplateVersionPresetID: uuid.NullUUID{UUID: preset.ID, Valid: true},
5078+
JobID: stoppedPrebuildJob1.ID,
5079+
BuildNumber: 1,
5080+
Transition: database.WorkspaceTransitionStart,
5081+
InitiatorID: database.PrebuildsSystemUserID,
5082+
Reason: database.BuildReasonInitiator,
5083+
})
5084+
5085+
// Create a STOP build (making this prebuild "not running")
5086+
stoppedPrebuildWorkspaceJob2 := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{
5087+
OrganizationID: org.ID,
5088+
InitiatorID: database.PrebuildsSystemUserID,
5089+
Provisioner: database.ProvisionerTypeEcho,
5090+
Type: database.ProvisionerJobTypeWorkspaceBuild,
5091+
StartedAt: sql.NullTime{Time: dbtime.Now().Add(-time.Minute), Valid: true},
5092+
CompletedAt: sql.NullTime{Time: dbtime.Now(), Valid: true},
5093+
Error: sql.NullString{},
5094+
ErrorCode: sql.NullString{},
5095+
})
5096+
stoppedPrebuiltWorkspaceBuild2 := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{
5097+
WorkspaceID: stoppedPrebuild.ID,
5098+
TemplateVersionID: templateVersion.ID,
5099+
TemplateVersionPresetID: uuid.NullUUID{UUID: preset.ID, Valid: true},
5100+
JobID: stoppedPrebuildWorkspaceJob2.ID,
5101+
BuildNumber: 2,
5102+
Transition: database.WorkspaceTransitionStop,
5103+
InitiatorID: database.PrebuildsSystemUserID,
5104+
Reason: database.BuildReasonInitiator,
5105+
})
5106+
5107+
// Create a second running prebuild workspace with a successful start build
5108+
// and no stop build.
5109+
runningPrebuild := dbgen.Workspace(t, db, database.WorkspaceTable{
5110+
OwnerID: prebuildSystemUser,
5111+
TemplateID: template.ID,
5112+
Name: "test-running-prebuild",
5113+
Deleted: false,
5114+
})
5115+
// Create a successful START build for the running prebuild workspace
5116+
runningPrebuildJob1 := dbgen.ProvisionerJob(t, db, nil,
5117+
database.ProvisionerJob{
5118+
OrganizationID: org.ID,
5119+
InitiatorID: user.ID,
5120+
Provisioner: database.ProvisionerTypeEcho,
5121+
Type: database.ProvisionerJobTypeWorkspaceBuild,
5122+
StartedAt: sql.NullTime{Time: dbtime.Now().Add(-time.Minute), Valid: true},
5123+
CompletedAt: sql.NullTime{Time: dbtime.Now(), Valid: true},
5124+
Error: sql.NullString{},
5125+
ErrorCode: sql.NullString{},
5126+
})
5127+
runningPrebuiltWorkspaceBuild1 := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{
5128+
WorkspaceID: runningPrebuild.ID,
5129+
TemplateVersionID: templateVersion.ID,
5130+
TemplateVersionPresetID: uuid.NullUUID{UUID: preset.ID, Valid: true},
5131+
JobID: runningPrebuildJob1.ID,
5132+
BuildNumber: 1,
5133+
Transition: database.WorkspaceTransitionStart,
5134+
InitiatorID: database.PrebuildsSystemUserID,
5135+
Reason: database.BuildReasonInitiator,
5136+
})
5137+
5138+
// Create a third running regular workspace (not a prebuild) with a successful
5139+
// start build.
5140+
_ = dbgen.Workspace(t, db, database.WorkspaceTable{
5141+
OwnerID: user.ID,
5142+
TemplateID: template.ID,
5143+
Name: "test-running-regular-workspace",
5144+
Deleted: false,
5145+
})
5146+
5147+
// Given: assert test invariants.
5148+
require.Equal(t, database.WorkspaceTransitionStart, stoppedPrebuiltWorkspaceBuild1.Transition)
5149+
require.Equal(t, int32(1), stoppedPrebuiltWorkspaceBuild1.BuildNumber)
5150+
require.Equal(t, database.ProvisionerJobStatusSucceeded, stoppedPrebuildJob1.JobStatus)
5151+
require.Equal(t, database.WorkspaceTransitionStop, stoppedPrebuiltWorkspaceBuild2.Transition)
5152+
require.Equal(t, int32(2), stoppedPrebuiltWorkspaceBuild2.BuildNumber)
5153+
require.Equal(t, database.ProvisionerJobStatusSucceeded, stoppedPrebuildWorkspaceJob2.JobStatus)
5154+
require.Equal(t, database.WorkspaceTransitionStart, runningPrebuiltWorkspaceBuild1.Transition)
5155+
require.Equal(t, int32(1), runningPrebuiltWorkspaceBuild1.BuildNumber)
5156+
require.Equal(t, database.ProvisionerJobStatusSucceeded, runningPrebuildJob1.JobStatus)
5157+
5158+
// When: we query for running prebuild workspaces
5159+
runningPrebuilds, err := db.GetRunningPrebuiltWorkspaces(ctx)
5160+
require.NoError(t, err)
5161+
5162+
// Then: the stopped prebuild workspace should not be returned.
5163+
require.Len(t, runningPrebuilds, 1, "expected only one running prebuilt workspace")
5164+
require.Equal(t, runningPrebuild.ID, runningPrebuilds[0].ID, "expected the running prebuilt workspace to be returned")
5165+
}

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