Skip to content

Commit 50cba39

Browse files
committed
Refactor provsionerdserver tests
1 parent 387c1bd commit 50cba39

File tree

2 files changed

+121
-116
lines changed

2 files changed

+121
-116
lines changed

coderd/database/databasefake/generator.go

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"crypto/sha256"
66
"database/sql"
7+
"encoding/hex"
78
"fmt"
89
"testing"
910
"time"
@@ -92,6 +93,10 @@ func (g *Generator) APIKey(ctx context.Context, seed database.APIKey) (key datab
9293
return key, fmt.Sprintf("%s-%s", key.ID, secret)
9394
}
9495

96+
func (g *Generator) File(ctx context.Context, seed database.File) database.File {
97+
return populate(ctx, g, "", seed)
98+
}
99+
95100
func (g *Generator) UserLink(ctx context.Context, seed database.UserLink) database.UserLink {
96101
return populate(ctx, g, "", seed)
97102
}
@@ -164,7 +169,7 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
164169
seed[name+"_secret"] = secret
165170
case database.Template:
166171
template, err := db.InsertTemplate(ctx, database.InsertTemplateParams{
167-
ID: g.Lookup(name),
172+
ID: takeFirst(orig.ID, g.Lookup(name)),
168173
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
169174
UpdatedAt: takeFirstTime(orig.UpdatedAt, time.Now()),
170175
OrganizationID: takeFirst(orig.OrganizationID, g.PrimaryOrg(ctx).ID),
@@ -182,10 +187,30 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
182187
})
183188
require.NoError(t, err, "insert template")
184189

190+
seed[name] = template
191+
192+
case database.TemplateVersion:
193+
template, err := db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{
194+
ID: takeFirst(orig.ID, g.Lookup(name)),
195+
TemplateID: uuid.NullUUID{
196+
UUID: takeFirst(orig.TemplateID.UUID, uuid.New()),
197+
Valid: takeFirst(orig.TemplateID.Valid, true),
198+
},
199+
OrganizationID: takeFirst(orig.OrganizationID, g.PrimaryOrg(ctx).ID),
200+
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
201+
UpdatedAt: takeFirstTime(orig.UpdatedAt, time.Now()),
202+
Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)),
203+
Readme: takeFirst(orig.Readme, namesgenerator.GetRandomName(1)),
204+
JobID: takeFirst(orig.JobID, uuid.New()),
205+
CreatedBy: takeFirst(orig.CreatedBy, uuid.New()),
206+
})
207+
require.NoError(t, err, "insert template")
208+
185209
seed[name] = template
186210
case database.Workspace:
187211
workspace, err := db.InsertWorkspace(ctx, database.InsertWorkspaceParams{
188-
ID: g.Lookup(name),
212+
ID: takeFirst(orig.ID, g.Lookup(name)),
213+
OwnerID: takeFirst(orig.OwnerID, uuid.New()),
189214
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
190215
UpdatedAt: takeFirstTime(orig.UpdatedAt, time.Now()),
191216
OrganizationID: takeFirst(orig.OrganizationID, g.PrimaryOrg(ctx).ID),
@@ -199,7 +224,7 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
199224
seed[name] = workspace
200225
case database.WorkspaceBuild:
201226
build, err := db.InsertWorkspaceBuild(ctx, database.InsertWorkspaceBuildParams{
202-
ID: g.Lookup(name),
227+
ID: takeFirst(orig.ID, g.Lookup(name)),
203228
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
204229
UpdatedAt: takeFirstTime(orig.UpdatedAt, time.Now()),
205230
WorkspaceID: takeFirst(orig.WorkspaceID, uuid.New()),
@@ -217,7 +242,7 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
217242
seed[name] = build
218243
case database.User:
219244
user, err := db.InsertUser(ctx, database.InsertUserParams{
220-
ID: g.Lookup(name),
245+
ID: takeFirst(orig.ID, g.Lookup(name)),
221246
Email: takeFirst(orig.Email, namesgenerator.GetRandomName(1)),
222247
Username: takeFirst(orig.Username, namesgenerator.GetRandomName(1)),
223248
HashedPassword: takeFirstBytes(orig.HashedPassword, []byte{}),
@@ -232,7 +257,7 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
232257

233258
case database.Organization:
234259
org, err := db.InsertOrganization(ctx, database.InsertOrganizationParams{
235-
ID: g.Lookup(name),
260+
ID: takeFirst(orig.ID, g.Lookup(name)),
236261
Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)),
237262
Description: takeFirst(orig.Description, namesgenerator.GetRandomName(1)),
238263
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
@@ -244,7 +269,7 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
244269

245270
case database.Group:
246271
org, err := db.InsertGroup(ctx, database.InsertGroupParams{
247-
ID: g.Lookup(name),
272+
ID: takeFirst(orig.ID, g.Lookup(name)),
248273
Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)),
249274
OrganizationID: takeFirst(orig.OrganizationID, g.PrimaryOrg(ctx).ID),
250275
AvatarURL: takeFirst(orig.AvatarURL, "https://logo.example.com"),
@@ -256,7 +281,7 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
256281

257282
case database.ProvisionerJob:
258283
job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{
259-
ID: g.Lookup(name),
284+
ID: takeFirst(orig.ID, g.Lookup(name)),
260285
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
261286
UpdatedAt: takeFirstTime(orig.UpdatedAt, time.Now()),
262287
OrganizationID: takeFirst(orig.OrganizationID, g.PrimaryOrg(ctx).ID),
@@ -274,7 +299,7 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
274299

275300
case database.WorkspaceResource:
276301
resource, err := db.InsertWorkspaceResource(ctx, database.InsertWorkspaceResourceParams{
277-
ID: g.Lookup(name),
302+
ID: takeFirst(orig.ID, g.Lookup(name)),
278303
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
279304
JobID: takeFirst(orig.JobID, uuid.New()),
280305
Transition: takeFirst(orig.Transition, database.WorkspaceTransitionStart),
@@ -293,6 +318,18 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
293318

294319
seed[name] = resource
295320

321+
case database.File:
322+
file, err := db.InsertFile(ctx, database.InsertFileParams{
323+
ID: takeFirst(orig.ID, g.Lookup(name)),
324+
Hash: takeFirst(orig.Hash, hex.EncodeToString(make([]byte, 32))),
325+
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
326+
CreatedBy: takeFirst(orig.CreatedBy, uuid.New()),
327+
Mimetype: takeFirst(orig.Mimetype, "application/x-tar"),
328+
Data: takeFirstBytes(orig.Data, []byte{}),
329+
})
330+
require.NoError(t, err, "insert file")
331+
332+
seed[name] = file
296333
case database.UserLink:
297334
link, err := db.InsertUserLink(ctx, database.InsertUserLinkParams{
298335
UserID: takeFirst(orig.UserID, uuid.New()),
@@ -306,6 +343,8 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
306343
require.NoError(t, err, "insert link")
307344

308345
seed[name] = link
346+
default:
347+
panic(fmt.Sprintf("unknown type %T", orig))
309348
}
310349
}
311350
return seed

coderd/provisionerdserver/provisionerdserver_test.go

Lines changed: 74 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -87,70 +87,57 @@ func TestAcquireJob(t *testing.T) {
8787
t.Parallel()
8888
srv := setup(t, false)
8989
ctx := context.Background()
90-
user, err := srv.Database.InsertUser(context.Background(), database.InsertUserParams{
91-
ID: uuid.New(),
92-
Username: "testing",
93-
LoginType: database.LoginTypePassword,
94-
})
95-
require.NoError(t, err)
96-
template, err := srv.Database.InsertTemplate(ctx, database.InsertTemplateParams{
97-
ID: uuid.New(),
90+
91+
gen := databasefake.NewGenerator(t, srv.Database)
92+
user := gen.User(ctx, database.User{})
93+
template := gen.Template(ctx, database.Template{
9894
Name: "template",
9995
Provisioner: database.ProvisionerTypeEcho,
10096
})
101-
require.NoError(t, err)
102-
version, err := srv.Database.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{
103-
ID: uuid.New(),
97+
file := gen.File(ctx, database.File{CreatedBy: user.ID})
98+
versionFile := gen.File(ctx, database.File{CreatedBy: user.ID})
99+
version := gen.TemplateVersion(ctx, database.TemplateVersion{
104100
TemplateID: uuid.NullUUID{
105101
UUID: template.ID,
106102
Valid: true,
107103
},
108104
JobID: uuid.New(),
109105
})
110-
require.NoError(t, err)
111-
workspace, err := srv.Database.InsertWorkspace(ctx, database.InsertWorkspaceParams{
112-
ID: uuid.New(),
113-
OwnerID: user.ID,
106+
// Import version job
107+
_ = gen.Job(ctx, database.ProvisionerJob{
108+
ID: version.JobID,
109+
InitiatorID: user.ID,
110+
FileID: versionFile.ID,
111+
Provisioner: database.ProvisionerTypeEcho,
112+
StorageMethod: database.ProvisionerStorageMethodFile,
113+
Type: database.ProvisionerJobTypeTemplateVersionImport,
114+
Input: must(json.Marshal(provisionerdserver.TemplateVersionImportJob{
115+
TemplateVersionID: version.ID,
116+
})),
117+
})
118+
workspace := gen.Workspace(ctx, database.Workspace{
114119
TemplateID: template.ID,
115-
Name: "workspace",
120+
OwnerID: user.ID,
116121
})
117-
require.NoError(t, err)
118-
build, err := srv.Database.InsertWorkspaceBuild(ctx, database.InsertWorkspaceBuildParams{
119-
ID: uuid.New(),
122+
build := gen.WorkspaceBuild(ctx, database.WorkspaceBuild{
120123
WorkspaceID: workspace.ID,
121124
BuildNumber: 1,
122125
JobID: uuid.New(),
123126
TemplateVersionID: version.ID,
124127
Transition: database.WorkspaceTransitionStart,
125128
Reason: database.BuildReasonInitiator,
126129
})
127-
require.NoError(t, err)
128-
129-
data, err := json.Marshal(provisionerdserver.WorkspaceProvisionJob{
130-
WorkspaceBuildID: build.ID,
131-
})
132-
require.NoError(t, err)
133-
134-
file, err := srv.Database.InsertFile(ctx, database.InsertFileParams{
135-
ID: uuid.New(),
136-
Hash: "something",
137-
Data: []byte{},
138-
})
139-
require.NoError(t, err)
140-
141-
_, err = srv.Database.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{
142-
ID: build.JobID,
143-
CreatedAt: database.Now(),
144-
UpdatedAt: database.Now(),
145-
OrganizationID: uuid.New(),
146-
InitiatorID: user.ID,
147-
Provisioner: database.ProvisionerTypeEcho,
148-
StorageMethod: database.ProvisionerStorageMethodFile,
149-
FileID: file.ID,
150-
Type: database.ProvisionerJobTypeWorkspaceBuild,
151-
Input: data,
130+
_ = gen.Job(ctx, database.ProvisionerJob{
131+
ID: build.ID,
132+
InitiatorID: user.ID,
133+
Provisioner: database.ProvisionerTypeEcho,
134+
StorageMethod: database.ProvisionerStorageMethodFile,
135+
FileID: file.ID,
136+
Type: database.ProvisionerJobTypeWorkspaceBuild,
137+
Input: must(json.Marshal(provisionerdserver.WorkspaceProvisionJob{
138+
WorkspaceBuildID: build.ID,
139+
})),
152140
})
153-
require.NoError(t, err)
154141

155142
published := make(chan struct{})
156143
closeSubscribe, err := srv.Pubsub.Subscribe(codersdk.WorkspaceNotifyChannel(workspace.ID), func(_ context.Context, _ []byte) {
@@ -159,8 +146,17 @@ func TestAcquireJob(t *testing.T) {
159146
require.NoError(t, err)
160147
defer closeSubscribe()
161148

162-
job, err := srv.AcquireJob(ctx, nil)
163-
require.NoError(t, err)
149+
var job *proto.AcquiredJob
150+
151+
for {
152+
// Grab jobs until we find the workspace build job. There is also
153+
// an import version job that we need to ignore.
154+
job, err = srv.AcquireJob(ctx, nil)
155+
require.NoError(t, err)
156+
if _, ok := job.Type.(*proto.AcquiredJob_WorkspaceBuild_); ok {
157+
break
158+
}
159+
}
164160

165161
<-published
166162

@@ -191,44 +187,23 @@ func TestAcquireJob(t *testing.T) {
191187
t.Parallel()
192188
srv := setup(t, false)
193189
ctx := context.Background()
194-
user, err := srv.Database.InsertUser(ctx, database.InsertUserParams{
195-
ID: uuid.New(),
196-
Username: "testing",
197-
LoginType: database.LoginTypePassword,
198-
})
199-
require.NoError(t, err)
200-
version, err := srv.Database.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{
201-
ID: uuid.New(),
202-
})
203-
require.NoError(t, err)
204190

205-
data, err := json.Marshal(provisionerdserver.TemplateVersionDryRunJob{
206-
TemplateVersionID: version.ID,
207-
WorkspaceName: "testing",
208-
ParameterValues: []database.ParameterValue{},
209-
})
210-
require.NoError(t, err)
211-
212-
file, err := srv.Database.InsertFile(ctx, database.InsertFileParams{
213-
ID: uuid.New(),
214-
Hash: "something",
215-
Data: []byte{},
216-
})
217-
require.NoError(t, err)
218-
219-
_, err = srv.Database.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{
220-
ID: uuid.New(),
221-
CreatedAt: database.Now(),
222-
UpdatedAt: database.Now(),
223-
OrganizationID: uuid.New(),
224-
InitiatorID: user.ID,
225-
Provisioner: database.ProvisionerTypeEcho,
226-
StorageMethod: database.ProvisionerStorageMethodFile,
227-
FileID: file.ID,
228-
Type: database.ProvisionerJobTypeTemplateVersionDryRun,
229-
Input: data,
191+
gen := databasefake.NewGenerator(t, srv.Database)
192+
user := gen.User(ctx, database.User{})
193+
version := gen.TemplateVersion(ctx, database.TemplateVersion{})
194+
file := gen.File(ctx, database.File{CreatedBy: user.ID})
195+
_ = gen.Job(ctx, database.ProvisionerJob{
196+
InitiatorID: user.ID,
197+
Provisioner: database.ProvisionerTypeEcho,
198+
StorageMethod: database.ProvisionerStorageMethodFile,
199+
FileID: file.ID,
200+
Type: database.ProvisionerJobTypeTemplateVersionDryRun,
201+
Input: must(json.Marshal(provisionerdserver.TemplateVersionDryRunJob{
202+
TemplateVersionID: version.ID,
203+
WorkspaceName: "testing",
204+
ParameterValues: []database.ParameterValue{},
205+
})),
230206
})
231-
require.NoError(t, err)
232207

233208
job, err := srv.AcquireJob(ctx, nil)
234209
require.NoError(t, err)
@@ -252,33 +227,17 @@ func TestAcquireJob(t *testing.T) {
252227
t.Parallel()
253228
srv := setup(t, false)
254229
ctx := context.Background()
255-
user, err := srv.Database.InsertUser(ctx, database.InsertUserParams{
256-
ID: uuid.New(),
257-
Username: "testing",
258-
LoginType: database.LoginTypePassword,
259-
})
260-
require.NoError(t, err)
261-
262-
file, err := srv.Database.InsertFile(ctx, database.InsertFileParams{
263-
ID: uuid.New(),
264-
Hash: "something",
265-
Data: []byte{},
266-
})
267-
require.NoError(t, err)
268230

269-
_, err = srv.Database.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{
270-
ID: uuid.New(),
271-
CreatedAt: database.Now(),
272-
UpdatedAt: database.Now(),
273-
OrganizationID: uuid.New(),
274-
InitiatorID: user.ID,
275-
Provisioner: database.ProvisionerTypeEcho,
276-
StorageMethod: database.ProvisionerStorageMethodFile,
277-
FileID: file.ID,
278-
Type: database.ProvisionerJobTypeTemplateVersionImport,
279-
Input: json.RawMessage{},
231+
gen := databasefake.NewGenerator(t, srv.Database)
232+
user := gen.User(ctx, database.User{})
233+
file := gen.File(ctx, database.File{CreatedBy: user.ID})
234+
_ = gen.Job(ctx, database.ProvisionerJob{
235+
FileID: file.ID,
236+
InitiatorID: user.ID,
237+
Provisioner: database.ProvisionerTypeEcho,
238+
StorageMethod: database.ProvisionerStorageMethodFile,
239+
Type: database.ProvisionerJobTypeTemplateVersionImport,
280240
})
281-
require.NoError(t, err)
282241

283242
job, err := srv.AcquireJob(ctx, nil)
284243
require.NoError(t, err)
@@ -855,3 +814,10 @@ func setup(t *testing.T, ignoreLogErrors bool) *provisionerdserver.Server {
855814
Auditor: mockAuditor(),
856815
}
857816
}
817+
818+
func must[T any](value T, err error) T {
819+
if err != nil {
820+
panic(err)
821+
}
822+
return value
823+
}

0 commit comments

Comments
 (0)