Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 2fa1ef3

Browse files
committedNov 9, 2023
chore: refactor ResolveAutostart tests to use dbfake
1 parent e23873f commit 2fa1ef3

File tree

6 files changed

+541
-399
lines changed

6 files changed

+541
-399
lines changed
 

‎coderd/database/dbfake/dbfake.go

Lines changed: 98 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/coder/coder/v2/coderd/database/dbtime"
1717
"github.com/coder/coder/v2/coderd/provisionerdserver"
1818
"github.com/coder/coder/v2/coderd/telemetry"
19+
"github.com/coder/coder/v2/provisionersdk/proto"
1920
sdkproto "github.com/coder/coder/v2/provisionersdk/proto"
2021
)
2122

@@ -37,6 +38,64 @@ func Workspace(t testing.TB, db database.Store, seed database.Workspace) databas
3738
return dbgen.Workspace(t, db, seed)
3839
}
3940

41+
func TemplateWithVersion(t testing.TB, db database.Store, tpl database.Template, tv database.TemplateVersion, job database.ProvisionerJob, resources ...*proto.Resource) (database.Template, database.TemplateVersion) {
42+
t.Helper()
43+
44+
template := dbgen.Template(t, db, tpl)
45+
46+
tv.TemplateID = dbgen.TakeFirst(tv.TemplateID, uuid.NullUUID{UUID: template.ID, Valid: true})
47+
tv.OrganizationID = dbgen.TakeFirst(tv.OrganizationID, template.OrganizationID)
48+
tv.CreatedBy = dbgen.TakeFirst(tv.CreatedBy, template.CreatedBy)
49+
version := TemplateVersion(t, db, tv, job, resources...)
50+
51+
err := db.UpdateTemplateActiveVersionByID(dbgen.Ctx, database.UpdateTemplateActiveVersionByIDParams{
52+
ID: template.ID,
53+
ActiveVersionID: version.ID,
54+
UpdatedAt: dbtime.Now(),
55+
})
56+
require.NoError(t, err)
57+
58+
return template, version
59+
}
60+
61+
func TemplateVersion(t testing.TB, db database.Store, tv database.TemplateVersion, job database.ProvisionerJob, resources ...*proto.Resource) database.TemplateVersion {
62+
templateVersion := dbgen.TemplateVersion(t, db, tv)
63+
payload, err := json.Marshal(provisionerdserver.TemplateVersionImportJob{
64+
TemplateVersionID: templateVersion.ID,
65+
})
66+
require.NoError(t, err)
67+
68+
job.ID = dbgen.TakeFirst(job.ID, templateVersion.JobID)
69+
job.OrganizationID = dbgen.TakeFirst(job.OrganizationID, templateVersion.OrganizationID)
70+
job.Input = dbgen.TakeFirstSlice(job.Input, payload)
71+
job.Type = dbgen.TakeFirst(job.Type, database.ProvisionerJobTypeTemplateVersionImport)
72+
job.CompletedAt = dbgen.TakeFirst(job.CompletedAt, sql.NullTime{
73+
Time: dbtime.Now(),
74+
Valid: true,
75+
})
76+
77+
job = dbgen.ProvisionerJob(t, db, nil, job)
78+
ProvisionerJobResources(t, db, job.ID, "", resources...)
79+
return templateVersion
80+
}
81+
82+
func TemplateVersionWithParams(t testing.TB, db database.Store, tv database.TemplateVersion, job database.ProvisionerJob, params []database.TemplateVersionParameter) (database.TemplateVersion, []database.TemplateVersionParameter) {
83+
t.Helper()
84+
85+
version := TemplateVersion(t, db, tv, job)
86+
tvps := make([]database.TemplateVersionParameter, 0, len(params))
87+
88+
for _, param := range params {
89+
if param.TemplateVersionID == uuid.Nil {
90+
param.TemplateVersionID = version.ID
91+
}
92+
tvp := dbgen.TemplateVersionParameter(t, db, param)
93+
tvps = append(tvps, tvp)
94+
}
95+
96+
return version, tvps
97+
}
98+
4099
// WorkspaceWithAgent is a helper that generates a workspace with a single resource
41100
// that has an agent attached to it. The agent token is returned.
42101
func WorkspaceWithAgent(t testing.TB, db database.Store, seed database.Workspace) (database.Workspace, string) {
@@ -56,6 +115,19 @@ func WorkspaceWithAgent(t testing.TB, db database.Store, seed database.Workspace
56115
return ws, authToken
57116
}
58117

118+
func WorkspaceBuildWithParameters(t testing.TB, db database.Store, ws database.Workspace, build database.WorkspaceBuild, params []database.WorkspaceBuildParameter, resources ...*sdkproto.Resource) (database.WorkspaceBuild, []database.WorkspaceBuildParameter) {
119+
t.Helper()
120+
121+
b := WorkspaceBuild(t, db, ws, build, resources...)
122+
123+
for i, param := range params {
124+
if param.WorkspaceBuildID == uuid.Nil {
125+
params[i].WorkspaceBuildID = b.ID
126+
}
127+
}
128+
return b, dbgen.WorkspaceBuildParameters(t, db, params)
129+
}
130+
59131
// WorkspaceBuild inserts a build and a successful job into the database.
60132
func WorkspaceBuild(t testing.TB, db database.Store, ws database.Workspace, seed database.WorkspaceBuild, resources ...*sdkproto.Resource) database.WorkspaceBuild {
61133
t.Helper()
@@ -69,9 +141,7 @@ func WorkspaceBuild(t testing.TB, db database.Store, ws database.Workspace, seed
69141
WorkspaceBuildID: seed.ID,
70142
})
71143
require.NoError(t, err)
72-
//nolint:gocritic // This is only used by tests.
73-
ctx := dbauthz.AsSystemRestricted(context.Background())
74-
job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{
144+
job, err := db.InsertProvisionerJob(dbgen.Ctx, database.InsertProvisionerJobParams{
75145
ID: jobID,
76146
CreatedAt: dbtime.Now(),
77147
UpdatedAt: dbtime.Now(),
@@ -86,7 +156,7 @@ func WorkspaceBuild(t testing.TB, db database.Store, ws database.Workspace, seed
86156
TraceMetadata: pqtype.NullRawMessage{},
87157
})
88158
require.NoError(t, err, "insert job")
89-
err = db.UpdateProvisionerJobWithCompleteByID(ctx, database.UpdateProvisionerJobWithCompleteByIDParams{
159+
err = db.UpdateProvisionerJobWithCompleteByID(dbgen.Ctx, database.UpdateProvisionerJobWithCompleteByIDParams{
90160
ID: job.ID,
91161
UpdatedAt: dbtime.Now(),
92162
Error: sql.NullString{},
@@ -101,30 +171,14 @@ func WorkspaceBuild(t testing.TB, db database.Store, ws database.Workspace, seed
101171
// This intentionally fulfills the minimum requirements of the schema.
102172
// Tests can provide a custom version ID if necessary.
103173
if seed.TemplateVersionID == uuid.Nil {
104-
jobID := uuid.New()
105-
templateVersion := dbgen.TemplateVersion(t, db, database.TemplateVersion{
106-
JobID: jobID,
174+
templateVersion := TemplateVersion(t, db, database.TemplateVersion{
107175
OrganizationID: ws.OrganizationID,
108176
CreatedBy: ws.OwnerID,
109177
TemplateID: uuid.NullUUID{
110178
UUID: ws.TemplateID,
111179
Valid: true,
112180
},
113-
})
114-
payload, _ := json.Marshal(provisionerdserver.TemplateVersionImportJob{
115-
TemplateVersionID: templateVersion.ID,
116-
})
117-
dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{
118-
ID: jobID,
119-
OrganizationID: ws.OrganizationID,
120-
Input: payload,
121-
Type: database.ProvisionerJobTypeTemplateVersionImport,
122-
CompletedAt: sql.NullTime{
123-
Time: dbtime.Now(),
124-
Valid: true,
125-
},
126-
})
127-
ProvisionerJobResources(t, db, jobID, seed.Transition, resources...)
181+
}, database.ProvisionerJob{})
128182
seed.TemplateVersionID = templateVersion.ID
129183
}
130184
build := dbgen.WorkspaceBuild(t, db, seed)
@@ -145,3 +199,25 @@ func ProvisionerJobResources(t testing.TB, db database.Store, job uuid.UUID, tra
145199
require.NoError(t, err)
146200
}
147201
}
202+
203+
func must[V any](v V, err error) V {
204+
if err != nil {
205+
panic(err)
206+
}
207+
return v
208+
}
209+
210+
// takeFirstF takes the first value that returns true
211+
func takeFirstF[Value any](values []Value, take func(v Value) bool) Value {
212+
for _, v := range values {
213+
if take(v) {
214+
return v
215+
}
216+
}
217+
// If all empty, return the last element
218+
if len(values) > 0 {
219+
return values[len(values)-1]
220+
}
221+
var empty Value
222+
return empty
223+
}
There was a problem loading the remainder of the diff.

0 commit comments

Comments
 (0)
Failed to load comments.