@@ -2,6 +2,7 @@ package databasefake
2
2
3
3
import (
4
4
"context"
5
+ "database/sql"
5
6
"testing"
6
7
"time"
7
8
@@ -57,6 +58,14 @@ func populate[DBType any](ctx context.Context, g *Generator, name string, seed D
57
58
return out [name ].(DBType )
58
59
}
59
60
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
+
60
69
func (g * Generator ) Group (ctx context.Context , name string , seed database.Group ) database.Group {
61
70
return populate (ctx , g , name , seed )
62
71
}
@@ -94,8 +103,8 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
94
103
case database.Template :
95
104
template , err := db .InsertTemplate (ctx , database.InsertTemplateParams {
96
105
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 () ),
99
108
OrganizationID : takeFirst (orig .OrganizationID , g .PrimaryOrg (ctx ).ID ),
100
109
Name : takeFirst (orig .Name , namesgenerator .GetRandomName (1 )),
101
110
Provisioner : takeFirst (orig .Provisioner , database .ProvisionerTypeEcho ),
@@ -115,8 +124,8 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
115
124
case database.Workspace :
116
125
workspace , err := db .InsertWorkspace (ctx , database.InsertWorkspaceParams {
117
126
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 () ),
120
129
OrganizationID : takeFirst (orig .OrganizationID , g .PrimaryOrg (ctx ).ID ),
121
130
TemplateID : takeFirst (orig .TemplateID , uuid .New ()),
122
131
Name : takeFirst (orig .Name , namesgenerator .GetRandomName (1 )),
@@ -129,16 +138,16 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
129
138
case database.WorkspaceBuild :
130
139
build , err := db .InsertWorkspaceBuild (ctx , database.InsertWorkspaceBuildParams {
131
140
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 () ),
134
143
WorkspaceID : takeFirst (orig .WorkspaceID , uuid .New ()),
135
144
TemplateVersionID : takeFirst (orig .TemplateVersionID , uuid .New ()),
136
145
BuildNumber : takeFirst (orig .BuildNumber , 0 ),
137
146
Transition : takeFirst (orig .Transition , database .WorkspaceTransitionStart ),
138
147
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 ) ),
142
151
Reason : takeFirst (orig .Reason , database .BuildReasonInitiator ),
143
152
})
144
153
require .NoError (t , err , "insert workspace build" )
@@ -149,9 +158,9 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
149
158
ID : g .Lookup (name ),
150
159
Email : takeFirst (orig .Email , namesgenerator .GetRandomName (1 )),
151
160
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 () ),
155
164
RBACRoles : []string {},
156
165
LoginType : takeFirst (orig .LoginType , database .LoginTypePassword ),
157
166
})
@@ -164,8 +173,8 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
164
173
ID : g .Lookup (name ),
165
174
Name : takeFirst (orig .Name , namesgenerator .GetRandomName (1 )),
166
175
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 () ),
169
178
})
170
179
require .NoError (t , err , "insert organization" )
171
180
@@ -182,12 +191,55 @@ func (g *Generator) Populate(ctx context.Context, seed map[string]interface{}) m
182
191
require .NoError (t , err , "insert organization" )
183
192
184
193
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
185
233
}
186
234
}
187
235
return seed
188
236
}
189
237
190
238
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
+ }
191
243
if tc .names == nil {
192
244
tc .names = make (map [string ]uuid.UUID )
193
245
}
@@ -199,14 +251,34 @@ func (tc *Generator) Lookup(name string) uuid.UUID {
199
251
return id
200
252
}
201
253
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 {
204
268
var empty Value
205
269
for _ , v := range values {
206
- if v != empty {
270
+ if take ( v ) {
207
271
return v
208
272
}
209
273
}
210
274
// If all empty, return empty
211
275
return empty
212
276
}
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
+ }
0 commit comments