diff --git a/enterprise/coderd/workspaces_test.go b/enterprise/coderd/workspaces_test.go index 9b937d1480aa0..6d40d77bc218b 100644 --- a/enterprise/coderd/workspaces_test.go +++ b/enterprise/coderd/workspaces_test.go @@ -2,7 +2,6 @@ package coderd_test import ( "context" - "encoding/json" "net/http" "sync/atomic" "testing" @@ -250,70 +249,57 @@ func TestWorkspaceAutobuild(t *testing.T) { auditRecorder = audit.NewMock() ) - client, user := coderdenttest.New(t, &coderdenttest.Options{ + client, db, user := coderdenttest.NewWithDatabase(t, &coderdenttest.Options{ Options: &coderdtest.Options{ - AutobuildTicker: ticker, - IncludeProvisionerDaemon: true, - AutobuildStats: statCh, - TemplateScheduleStore: schedule.NewEnterpriseTemplateScheduleStore(agplUserQuietHoursScheduleStore()), - Auditor: auditRecorder, + AutobuildTicker: ticker, + AutobuildStats: statCh, + TemplateScheduleStore: schedule.NewEnterpriseTemplateScheduleStore(agplUserQuietHoursScheduleStore()), + Auditor: auditRecorder, }, LicenseOptions: &coderdenttest.LicenseOptions{ Features: license.Features{codersdk.FeatureAdvancedTemplateScheduling: 1}, }, }) - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: echo.ApplyComplete, - }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) { - ctr.TimeTilDormantMillis = ptr.Ref[int64](inactiveTTL.Milliseconds()) - }) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + tpl := dbfake.TemplateVersion(t, db).Seed(database.TemplateVersion{ + OrganizationID: user.OrganizationID, + CreatedBy: user.UserID, + }).Do().Template - ws := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) + template := coderdtest.UpdateTemplateMeta(t, client, tpl.ID, codersdk.UpdateTemplateMeta{ + TimeTilDormantMillis: inactiveTTL.Milliseconds(), + }) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) + resp := dbfake.WorkspaceBuild(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, + TemplateID: template.ID, + }).Seed(database.WorkspaceBuild{ + Transition: database.WorkspaceTransitionStart, + }).Do() + require.Equal(t, database.WorkspaceTransitionStart, resp.Build.Transition) + workspace := resp.Workspace - // Reset the audit log so we can verify a log is generated. auditRecorder.ResetLogs() // Simulate being inactive. - ticker <- ws.LastUsedAt.Add(inactiveTTL * 2) + ticker <- workspace.LastUsedAt.Add(inactiveTTL * 2) stats := <-statCh // Expect workspace to transition to stopped state for breaching // failure TTL. require.Len(t, stats.Transitions, 1) - require.Equal(t, stats.Transitions[ws.ID], database.WorkspaceTransitionStop) + require.Equal(t, stats.Transitions[workspace.ID], database.WorkspaceTransitionStop) - ws = coderdtest.MustWorkspace(t, client, ws.ID) + ws := coderdtest.MustWorkspace(t, client, workspace.ID) + // Should be dormant now. require.NotNil(t, ws.DormantAt) - - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) - // We should get 2 audit logs, one for stopping the workspace, and one for - // making it dormant. - alogs := auditRecorder.AuditLogs() - require.Len(t, alogs, 2) - - for _, alog := range alogs { - require.Equal(t, int32(http.StatusOK), alog.StatusCode) - - switch alog.Action { - case database.AuditActionWrite: - require.Equal(t, database.ResourceTypeWorkspace, alog.ResourceType) - case database.AuditActionStop: - var fields audit.AdditionalFields - err := json.Unmarshal(alog.AdditionalFields, &fields) - require.NoError(t, err) - require.Equal(t, ws.Name, fields.WorkspaceName) - require.Equal(t, database.BuildReasonDormancy, fields.BuildReason) - - default: - t.Fatalf("unexpected audit log (%+v)", alog) - } - } + // Should be transitioned to stop. + require.Equal(t, codersdk.WorkspaceTransitionStop, ws.LatestBuild.Transition) + require.Len(t, auditRecorder.AuditLogs(), 1) + alog := auditRecorder.AuditLogs()[0] + require.Equal(t, int32(http.StatusOK), alog.StatusCode) + require.Equal(t, database.AuditActionWrite, alog.Action) + require.Equal(t, workspace.Name, alog.ResourceTarget) dormantLastUsedAt := ws.LastUsedAt // nolint:gocritic // this test is not testing RBAC.