Skip to content

Commit 2cb3ece

Browse files
committed
Write unit test for workspace status
1 parent 50b2873 commit 2cb3ece

File tree

2 files changed

+82
-6
lines changed

2 files changed

+82
-6
lines changed

coderd/database/dbgen/generator.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"testing"
1212
"time"
1313

14+
"github.com/coder/coder/coderd/database/dbtype"
15+
1416
"github.com/coder/coder/coderd/database/dbauthz"
1517
"github.com/coder/coder/coderd/rbac"
1618

@@ -26,6 +28,7 @@ import (
2628
// All methods take in a 'seed' object. Any provided fields in the seed will be
2729
// maintained. Any fields omitted will have sensible defaults generated.
2830

31+
// genCtx is to give all generator functions permission if the db is a dbauthz db.
2932
var genCtx = dbauthz.As(context.Background(), rbac.Subject{
3033
ID: "owner",
3134
Roles: rbac.Roles(must(rbac.RoleNames{rbac.RoleOwner()}.Expand())),
@@ -271,7 +274,17 @@ func GroupMember(t testing.TB, db database.Store, orig database.GroupMember) dat
271274
return member
272275
}
273276

277+
// ProvisionerJob might not have all the correct values like CompletedAt and CancelledAt. This is because
278+
// the workspaceBuild is required to fetch those,
274279
func ProvisionerJob(t testing.TB, db database.Store, orig database.ProvisionerJob) database.ProvisionerJob {
280+
id := takeFirst(orig.ID, uuid.New())
281+
if !orig.StartedAt.Time.IsZero() {
282+
if orig.Tags == nil {
283+
orig.Tags = make(dbtype.StringMap)
284+
}
285+
// Make sure when we acquire the job, we only get this one.
286+
orig.Tags[id.String()] = "true"
287+
}
275288
job, err := db.InsertProvisionerJob(genCtx, database.InsertProvisionerJobParams{
276289
ID: takeFirst(orig.ID, uuid.New()),
277290
CreatedAt: takeFirst(orig.CreatedAt, database.Now()),
@@ -286,6 +299,34 @@ func ProvisionerJob(t testing.TB, db database.Store, orig database.ProvisionerJo
286299
Tags: orig.Tags,
287300
})
288301
require.NoError(t, err, "insert job")
302+
303+
if !orig.CompletedAt.Time.IsZero() || orig.Error.String != "" {
304+
err := db.UpdateProvisionerJobWithCompleteByID(genCtx, database.UpdateProvisionerJobWithCompleteByIDParams{
305+
ID: job.ID,
306+
UpdatedAt: orig.UpdatedAt,
307+
CompletedAt: orig.CompletedAt,
308+
Error: orig.Error,
309+
ErrorCode: orig.ErrorCode,
310+
})
311+
require.NoError(t, err)
312+
}
313+
if !orig.CanceledAt.Time.IsZero() {
314+
err := db.UpdateProvisionerJobWithCancelByID(genCtx, database.UpdateProvisionerJobWithCancelByIDParams{
315+
ID: job.ID,
316+
CanceledAt: orig.CanceledAt,
317+
CompletedAt: orig.CompletedAt,
318+
})
319+
require.NoError(t, err)
320+
}
321+
if !orig.StartedAt.Time.IsZero() {
322+
job, err = db.AcquireProvisionerJob(genCtx, database.AcquireProvisionerJobParams{
323+
StartedAt: orig.StartedAt,
324+
Types: []database.ProvisionerType{database.ProvisionerTypeEcho},
325+
Tags: must(json.Marshal(orig.Tags)),
326+
})
327+
require.NoError(t, err)
328+
}
329+
289330
return job
290331
}
291332

coderd/workspaces_test.go

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ package coderd_test
22

33
import (
44
"context"
5+
"database/sql"
56
"fmt"
67
"net/http"
78
"strings"
89
"testing"
910
"time"
1011

12+
"github.com/coder/coder/coderd/database/dbauthz"
13+
1114
"github.com/coder/coder/coderd/database/dbgen"
1215

1316
"github.com/google/uuid"
@@ -558,6 +561,7 @@ func TestWorkspaceByOwnerAndName(t *testing.T) {
558561
}
559562

560563
func TestWorkspaceFilterAllStatus(t *testing.T) {
564+
ctx := dbauthz.AsSystemRestricted(context.Background())
561565
client, _, api := coderdtest.NewWithAPI(t, &coderdtest.Options{})
562566

563567
owner := coderdtest.CreateFirstUser(t, client)
@@ -582,17 +586,48 @@ func TestWorkspaceFilterAllStatus(t *testing.T) {
582586
CreatedBy: owner.UserID,
583587
})
584588

585-
makeWorkspace := func(workspace database.Workspace) database.Workspace {
589+
makeWorkspace := func(workspace database.Workspace, job database.ProvisionerJob, transition database.WorkspaceTransition) (database.Workspace, database.WorkspaceBuild, database.ProvisionerJob) {
590+
db := api.Database
591+
586592
workspace.OwnerID = owner.UserID
587593
workspace.OrganizationID = owner.OrganizationID
588594
workspace.TemplateID = template.ID
589-
workspace = dbgen.Workspace(t, api.Database, workspace)
595+
workspace = dbgen.Workspace(t, db, workspace)
596+
597+
job.Type = database.ProvisionerJobTypeWorkspaceBuild
598+
job.OrganizationID = owner.OrganizationID
599+
job = dbgen.ProvisionerJob(t, db, job)
600+
601+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{
602+
WorkspaceID: workspace.ID,
603+
TemplateVersionID: version.ID,
604+
BuildNumber: 1,
605+
Transition: transition,
606+
InitiatorID: owner.UserID,
607+
JobID: job.ID,
608+
})
609+
610+
var err error
611+
job, err = db.GetProvisionerJobByID(ctx, job.IDtus
612+
)
613+
require.NoError(t, err)
614+
615+
return workspace, build, job
616+
}
617+
618+
_, _, _ = makeWorkspace(database.Workspace{
619+
Name: string(database.WorkspaceStatusRunning),
620+
}, database.ProvisionerJob{
621+
CompletedAt: sql.NullTime{Time: time.Now(), Valid: true},
622+
StartedAt: sql.NullTime{Time: time.Now().Add(time.Second * -2), Valid: true},
623+
}, database.WorkspaceTransitionStart)
624+
625+
workspaces, err := client.Workspaces(context.Background(), codersdk.WorkspaceFilter{})
626+
require.NoError(t, err)
590627

591-
return workspace
628+
for _, apiWorkspace := range workspaces.Workspaces {
629+
require.Equal(t, apiWorkspace.Name, string(apiWorkspace.LatestBuild.Status))
592630
}
593-
var _ = makeWorkspace
594-
//makeWorkspace(database.Workspace{
595-
//})
596631

597632
// pending
598633
// starting

0 commit comments

Comments
 (0)