Skip to content

Commit 722194b

Browse files
committed
Add resources and jobS
1 parent 50ea251 commit 722194b

File tree

3 files changed

+105
-34
lines changed

3 files changed

+105
-34
lines changed

coderd/database/databasefake/generator.go

Lines changed: 89 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package databasefake
22

33
import (
44
"context"
5+
"database/sql"
56
"testing"
67
"time"
78

@@ -57,6 +58,14 @@ func populate[DBType any](ctx context.Context, g *Generator, name string, seed D
5758
return out[name].(DBType)
5859
}
5960

61+
func (g *Generator) WorkspaceResource(ctx context.Context, name string, seed database.WorkspaceResource) database.WorkspaceResource {
62+
return populate(ctx, g, name, seed)
63+
}
64+
65+
func (g *Generator) Job(ctx context.Context, name string, seed database.ProvisionerJob) database.ProvisionerJob {
66+
return populate(ctx, g, name, seed)
67+
}
68+
6069
func (g *Generator) Group(ctx context.Context, name string, seed database.Group) database.Group {
6170
return populate(ctx, g, name, seed)
6271
}
@@ -94,8 +103,8 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
94103
case database.Template:
95104
template, err := db.InsertTemplate(ctx, database.InsertTemplateParams{
96105
ID: g.Lookup(name),
97-
CreatedAt: time.Now(),
98-
UpdatedAt: time.Now(),
106+
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
107+
UpdatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
99108
OrganizationID: takeFirst(orig.OrganizationID, g.PrimaryOrg(ctx).ID),
100109
Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)),
101110
Provisioner: takeFirst(orig.Provisioner, database.ProvisionerTypeEcho),
@@ -115,8 +124,8 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
115124
case database.Workspace:
116125
workspace, err := db.InsertWorkspace(ctx, database.InsertWorkspaceParams{
117126
ID: g.Lookup(name),
118-
CreatedAt: time.Now(),
119-
UpdatedAt: time.Now(),
127+
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
128+
UpdatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
120129
OrganizationID: takeFirst(orig.OrganizationID, g.PrimaryOrg(ctx).ID),
121130
TemplateID: takeFirst(orig.TemplateID, uuid.New()),
122131
Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)),
@@ -129,16 +138,16 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
129138
case database.WorkspaceBuild:
130139
build, err := db.InsertWorkspaceBuild(ctx, database.InsertWorkspaceBuildParams{
131140
ID: g.Lookup(name),
132-
CreatedAt: time.Now(),
133-
UpdatedAt: time.Now(),
141+
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
142+
UpdatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
134143
WorkspaceID: takeFirst(orig.WorkspaceID, uuid.New()),
135144
TemplateVersionID: takeFirst(orig.TemplateVersionID, uuid.New()),
136145
BuildNumber: takeFirst(orig.BuildNumber, 0),
137146
Transition: takeFirst(orig.Transition, database.WorkspaceTransitionStart),
138147
InitiatorID: takeFirst(orig.InitiatorID, uuid.New()),
139-
JobID: takeFirst(orig.InitiatorID, uuid.New()),
140-
ProvisionerState: []byte{},
141-
Deadline: time.Now(),
148+
JobID: takeFirst(orig.JobID, uuid.New()),
149+
ProvisionerState: takeFirstBytes(orig.ProvisionerState, []byte{}),
150+
Deadline: takeFirstTime(orig.CreatedAt, time.Now().Add(time.Hour)),
142151
Reason: takeFirst(orig.Reason, database.BuildReasonInitiator),
143152
})
144153
require.NoError(t, err, "insert workspace build")
@@ -149,9 +158,9 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
149158
ID: g.Lookup(name),
150159
Email: takeFirst(orig.Email, namesgenerator.GetRandomName(1)),
151160
Username: takeFirst(orig.Username, namesgenerator.GetRandomName(1)),
152-
HashedPassword: []byte{},
153-
CreatedAt: time.Now(),
154-
UpdatedAt: time.Now(),
161+
HashedPassword: takeFirstBytes(orig.HashedPassword, []byte{}),
162+
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
163+
UpdatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
155164
RBACRoles: []string{},
156165
LoginType: takeFirst(orig.LoginType, database.LoginTypePassword),
157166
})
@@ -164,8 +173,8 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
164173
ID: g.Lookup(name),
165174
Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)),
166175
Description: takeFirst(orig.Name, namesgenerator.GetRandomName(1)),
167-
CreatedAt: time.Now(),
168-
UpdatedAt: time.Now(),
176+
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
177+
UpdatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
169178
})
170179
require.NoError(t, err, "insert organization")
171180

@@ -182,12 +191,55 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
182191
require.NoError(t, err, "insert organization")
183192

184193
seed[name] = org
194+
195+
case database.ProvisionerJob:
196+
job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{
197+
ID: g.Lookup(name),
198+
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
199+
UpdatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
200+
OrganizationID: takeFirst(orig.OrganizationID, g.PrimaryOrg(ctx).ID),
201+
InitiatorID: takeFirst(orig.InitiatorID, uuid.New()),
202+
Provisioner: takeFirst(orig.Provisioner, database.ProvisionerTypeEcho),
203+
StorageMethod: takeFirst(orig.StorageMethod, database.ProvisionerStorageMethodFile),
204+
FileID: takeFirst(orig.FileID, uuid.New()),
205+
Type: takeFirst(orig.Type, database.ProvisionerJobTypeWorkspaceBuild),
206+
Input: takeFirstBytes(orig.Input, []byte("{}")),
207+
Tags: orig.Tags,
208+
})
209+
require.NoError(t, err, "insert job")
210+
211+
seed[name] = job
212+
213+
case database.WorkspaceResource:
214+
resource, err := db.InsertWorkspaceResource(ctx, database.InsertWorkspaceResourceParams{
215+
ID: g.Lookup(name),
216+
CreatedAt: takeFirstTime(orig.CreatedAt, time.Now()),
217+
JobID: takeFirst(orig.JobID, uuid.New()),
218+
Transition: takeFirst(orig.Transition, database.WorkspaceTransitionStart),
219+
// TODO: What type to put here?
220+
Type: takeFirst(orig.Type, ""),
221+
Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)),
222+
Hide: takeFirst(orig.Hide, false),
223+
Icon: takeFirst(orig.Name, ""),
224+
InstanceType: sql.NullString{
225+
String: takeFirst(orig.InstanceType.String, ""),
226+
Valid: takeFirst(orig.InstanceType.Valid, false),
227+
},
228+
DailyCost: takeFirst(orig.DailyCost, 0),
229+
})
230+
require.NoError(t, err, "insert resource")
231+
232+
seed[name] = resource
185233
}
186234
}
187235
return seed
188236
}
189237

190238
func (tc *Generator) Lookup(name string) uuid.UUID {
239+
if name == "" {
240+
// No name means the caller doesn't care about the ID.
241+
return uuid.New()
242+
}
191243
if tc.names == nil {
192244
tc.names = make(map[string]uuid.UUID)
193245
}
@@ -199,14 +251,34 @@ func (tc *Generator) Lookup(name string) uuid.UUID {
199251
return id
200252
}
201253

202-
// takeFirst will take the first non-empty value.
203-
func takeFirst[Value comparable](values ...Value) Value {
254+
func takeFirstTime(values ...time.Time) time.Time {
255+
return takeFirstF(values, func(v time.Time) bool {
256+
return !v.IsZero()
257+
})
258+
}
259+
260+
func takeFirstBytes(values ...[]byte) []byte {
261+
return takeFirstF(values, func(v []byte) bool {
262+
return len(v) != 0
263+
})
264+
}
265+
266+
// takeFirstF takes the first value that returns true
267+
func takeFirstF[Value any](values []Value, take func(v Value) bool) Value {
204268
var empty Value
205269
for _, v := range values {
206-
if v != empty {
270+
if take(v) {
207271
return v
208272
}
209273
}
210274
// If all empty, return empty
211275
return empty
212276
}
277+
278+
// takeFirst will take the first non-empty value.
279+
func takeFirst[Value comparable](values ...Value) Value {
280+
var empty Value
281+
return takeFirstF(values, func(v Value) bool {
282+
return v != empty
283+
})
284+
}

coderd/httpmw/groupparam_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ func TestGroupParam(t *testing.T) {
2525
ctx, _ := testutil.Context(t)
2626
db := databasefake.New()
2727
gen := databasefake.NewGenerator(t, db)
28+
2829
group := gen.Group(ctx, "group", database.Group{})
2930

3031
return db, group

coderd/httpmw/workspaceresourceparam_test.go

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,30 @@ import (
1818
func TestWorkspaceResourceParam(t *testing.T) {
1919
t.Parallel()
2020

21-
setup := func(db database.Store, jobType database.ProvisionerJobType) (*http.Request, database.WorkspaceResource) {
21+
setup := func(t *testing.T, db database.Store, jobType database.ProvisionerJobType) (*http.Request, database.WorkspaceResource) {
2222
r := httptest.NewRequest("GET", "/", nil)
23-
job, err := db.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{
24-
ID: uuid.New(),
23+
ctx := context.Background()
24+
gen := databasefake.NewGenerator(t, db)
25+
job := gen.Job(ctx, "", database.ProvisionerJob{
2526
Type: jobType,
2627
Provisioner: database.ProvisionerTypeEcho,
2728
StorageMethod: database.ProvisionerStorageMethodFile,
2829
})
29-
require.NoError(t, err)
30-
workspaceBuild, err := db.InsertWorkspaceBuild(context.Background(), database.InsertWorkspaceBuildParams{
31-
ID: uuid.New(),
30+
31+
build := gen.WorkspaceBuild(ctx, "", database.WorkspaceBuild{
3232
JobID: job.ID,
3333
Transition: database.WorkspaceTransitionStart,
3434
Reason: database.BuildReasonInitiator,
3535
})
36-
require.NoError(t, err)
37-
resource, err := db.InsertWorkspaceResource(context.Background(), database.InsertWorkspaceResourceParams{
38-
ID: uuid.New(),
36+
37+
resource := gen.WorkspaceResource(ctx, "", database.WorkspaceResource{
3938
JobID: job.ID,
4039
Transition: database.WorkspaceTransitionStart,
4140
})
42-
require.NoError(t, err)
4341

44-
ctx := chi.NewRouteContext()
45-
ctx.URLParams.Add("workspacebuild", workspaceBuild.ID.String())
46-
r = r.WithContext(context.WithValue(r.Context(), chi.RouteCtxKey, ctx))
42+
routeCtx := chi.NewRouteContext()
43+
routeCtx.URLParams.Add("workspacebuild", build.ID.String())
44+
r = r.WithContext(context.WithValue(r.Context(), chi.RouteCtxKey, routeCtx))
4745
return r, resource
4846
}
4947

@@ -53,7 +51,7 @@ func TestWorkspaceResourceParam(t *testing.T) {
5351
rtr := chi.NewRouter()
5452
rtr.Use(httpmw.ExtractWorkspaceResourceParam(db))
5553
rtr.Get("/", nil)
56-
r, _ := setup(db, database.ProvisionerJobTypeWorkspaceBuild)
54+
r, _ := setup(t, db, database.ProvisionerJobTypeWorkspaceBuild)
5755
rw := httptest.NewRecorder()
5856
rtr.ServeHTTP(rw, r)
5957

@@ -71,7 +69,7 @@ func TestWorkspaceResourceParam(t *testing.T) {
7169
)
7270
rtr.Get("/", nil)
7371

74-
r, _ := setup(db, database.ProvisionerJobTypeWorkspaceBuild)
72+
r, _ := setup(t, db, database.ProvisionerJobTypeWorkspaceBuild)
7573
chi.RouteContext(r.Context()).URLParams.Add("workspaceresource", uuid.NewString())
7674
rw := httptest.NewRecorder()
7775
rtr.ServeHTTP(rw, r)
@@ -93,7 +91,7 @@ func TestWorkspaceResourceParam(t *testing.T) {
9391
rw.WriteHeader(http.StatusOK)
9492
})
9593

96-
r, job := setup(db, database.ProvisionerJobTypeTemplateVersionImport)
94+
r, job := setup(t, db, database.ProvisionerJobTypeTemplateVersionImport)
9795
chi.RouteContext(r.Context()).URLParams.Add("workspaceresource", job.ID.String())
9896
rw := httptest.NewRecorder()
9997
rtr.ServeHTTP(rw, r)
@@ -115,7 +113,7 @@ func TestWorkspaceResourceParam(t *testing.T) {
115113
rw.WriteHeader(http.StatusOK)
116114
})
117115

118-
r, job := setup(db, database.ProvisionerJobTypeWorkspaceBuild)
116+
r, job := setup(t, db, database.ProvisionerJobTypeWorkspaceBuild)
119117
chi.RouteContext(r.Context()).URLParams.Add("workspaceresource", job.ID.String())
120118
rw := httptest.NewRecorder()
121119
rtr.ServeHTTP(rw, r)

0 commit comments

Comments
 (0)