@@ -15,10 +15,23 @@ import (
15
15
"github.com/coder/coder/v2/coderd/database/dbgen"
16
16
"github.com/coder/coder/v2/coderd/database/dbtime"
17
17
"github.com/coder/coder/v2/coderd/provisionerdserver"
18
+ "github.com/coder/coder/v2/coderd/rbac"
18
19
"github.com/coder/coder/v2/coderd/telemetry"
20
+ "github.com/coder/coder/v2/provisionersdk/proto"
19
21
sdkproto "github.com/coder/coder/v2/provisionersdk/proto"
20
22
)
21
23
24
+ // All methods take in a 'seed' object. Any provided fields in the seed will be
25
+ // maintained. Any fields omitted will have sensible defaults generated.
26
+
27
+ // genCtx is to give all generator functions permission if the db is a dbauthz db.
28
+ var genCtx = dbauthz .As (context .Background (), rbac.Subject {
29
+ ID : "owner" ,
30
+ Roles : rbac .Roles (must (rbac.RoleNames {rbac .RoleOwner ()}.Expand ())),
31
+ Groups : []string {},
32
+ Scope : rbac .ExpandableScope (rbac .ScopeAll ),
33
+ })
34
+
22
35
// Workspace inserts a workspace into the database.
23
36
func Workspace (t testing.TB , db database.Store , seed database.Workspace ) database.Workspace {
24
37
t .Helper ()
@@ -37,6 +50,64 @@ func Workspace(t testing.TB, db database.Store, seed database.Workspace) databas
37
50
return dbgen .Workspace (t , db , seed )
38
51
}
39
52
53
+ func TemplateWithVersion (t testing.TB , db database.Store , tpl database.Template , tv database.TemplateVersion , resources ... * proto.Resource ) (database.Template , database.TemplateVersion ) {
54
+ t .Helper ()
55
+
56
+ template := dbgen .Template (t , db , tpl )
57
+
58
+ tv .TemplateID = takeFirst (tv .TemplateID , uuid.NullUUID {UUID : template .ID , Valid : true })
59
+ tv .OrganizationID = takeFirst (tv .OrganizationID , template .OrganizationID )
60
+ tv .CreatedBy = takeFirst (tv .CreatedBy , template .CreatedBy )
61
+ version := TemplateVersion (t , db , tv , database.ProvisionerJob {}, resources ... )
62
+
63
+ err := db .UpdateTemplateActiveVersionByID (genCtx , database.UpdateTemplateActiveVersionByIDParams {
64
+ ID : template .ID ,
65
+ ActiveVersionID : version .ID ,
66
+ UpdatedAt : dbtime .Now (),
67
+ })
68
+ require .NoError (t , err )
69
+
70
+ return template , version
71
+ }
72
+
73
+ func TemplateVersion (t testing.TB , db database.Store , tv database.TemplateVersion , job database.ProvisionerJob , resources ... * proto.Resource ) database.TemplateVersion {
74
+ templateVersion := dbgen .TemplateVersion (t , db , tv )
75
+ payload , err := json .Marshal (provisionerdserver.TemplateVersionImportJob {
76
+ TemplateVersionID : templateVersion .ID ,
77
+ })
78
+ require .NoError (t , err )
79
+
80
+ job .ID = takeFirst (job .ID , templateVersion .JobID )
81
+ job .OrganizationID = takeFirst (job .OrganizationID , templateVersion .OrganizationID )
82
+ job .Input = takeFirstSlice (job .Input , payload )
83
+ job .Type = takeFirst (job .Type , database .ProvisionerJobTypeTemplateVersionImport )
84
+ job .CompletedAt = takeFirst (job .CompletedAt , sql.NullTime {
85
+ Time : dbtime .Now (),
86
+ Valid : true ,
87
+ })
88
+
89
+ job = dbgen .ProvisionerJob (t , db , nil , job )
90
+ ProvisionerJobResources (t , db , job .ID , "" , resources ... )
91
+ return templateVersion
92
+ }
93
+
94
+ func TemplateVersionWithParams (t testing.TB , db database.Store , tv database.TemplateVersion , params []database.TemplateVersionParameter ) (database.TemplateVersion , []database.TemplateVersionParameter ) {
95
+ t .Helper ()
96
+
97
+ version := TemplateVersion (t , db , tv , database.ProvisionerJob {})
98
+ tvps := make ([]database.TemplateVersionParameter , 0 , len (params ))
99
+
100
+ for _ , param := range params {
101
+ if param .TemplateVersionID == uuid .Nil {
102
+ param .TemplateVersionID = version .ID
103
+ }
104
+ tvp := dbgen .TemplateVersionParameter (t , db , param )
105
+ tvps = append (tvps , tvp )
106
+ }
107
+
108
+ return version , tvps
109
+ }
110
+
40
111
// WorkspaceWithAgent is a helper that generates a workspace with a single resource
41
112
// that has an agent attached to it. The agent token is returned.
42
113
func WorkspaceWithAgent (t testing.TB , db database.Store , seed database.Workspace ) (database.Workspace , string ) {
@@ -56,6 +127,19 @@ func WorkspaceWithAgent(t testing.TB, db database.Store, seed database.Workspace
56
127
return ws , authToken
57
128
}
58
129
130
+ func WorkspaceBuildWithParameters (t testing.TB , db database.Store , ws database.Workspace , build database.WorkspaceBuild , params []database.WorkspaceBuildParameter , resources ... * sdkproto.Resource ) (database.WorkspaceBuild , []database.WorkspaceBuildParameter ) {
131
+ t .Helper ()
132
+
133
+ b := WorkspaceBuild (t , db , ws , build , resources ... )
134
+
135
+ for i , param := range params {
136
+ if param .WorkspaceBuildID == uuid .Nil {
137
+ params [i ].WorkspaceBuildID = b .ID
138
+ }
139
+ }
140
+ return b , dbgen .WorkspaceBuildParameters (t , db , params )
141
+ }
142
+
59
143
// WorkspaceBuild inserts a build and a successful job into the database.
60
144
func WorkspaceBuild (t testing.TB , db database.Store , ws database.Workspace , seed database.WorkspaceBuild , resources ... * sdkproto.Resource ) database.WorkspaceBuild {
61
145
t .Helper ()
@@ -69,9 +153,7 @@ func WorkspaceBuild(t testing.TB, db database.Store, ws database.Workspace, seed
69
153
WorkspaceBuildID : seed .ID ,
70
154
})
71
155
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 {
156
+ job , err := db .InsertProvisionerJob (genCtx , database.InsertProvisionerJobParams {
75
157
ID : jobID ,
76
158
CreatedAt : dbtime .Now (),
77
159
UpdatedAt : dbtime .Now (),
@@ -86,7 +168,7 @@ func WorkspaceBuild(t testing.TB, db database.Store, ws database.Workspace, seed
86
168
TraceMetadata : pqtype.NullRawMessage {},
87
169
})
88
170
require .NoError (t , err , "insert job" )
89
- err = db .UpdateProvisionerJobWithCompleteByID (ctx , database.UpdateProvisionerJobWithCompleteByIDParams {
171
+ err = db .UpdateProvisionerJobWithCompleteByID (genCtx , database.UpdateProvisionerJobWithCompleteByIDParams {
90
172
ID : job .ID ,
91
173
UpdatedAt : dbtime .Now (),
92
174
Error : sql.NullString {},
@@ -101,30 +183,14 @@ func WorkspaceBuild(t testing.TB, db database.Store, ws database.Workspace, seed
101
183
// This intentionally fulfills the minimum requirements of the schema.
102
184
// Tests can provide a custom version ID if necessary.
103
185
if seed .TemplateVersionID == uuid .Nil {
104
- jobID := uuid .New ()
105
- templateVersion := dbgen .TemplateVersion (t , db , database.TemplateVersion {
106
- JobID : jobID ,
186
+ templateVersion := TemplateVersion (t , db , database.TemplateVersion {
107
187
OrganizationID : ws .OrganizationID ,
108
188
CreatedBy : ws .OwnerID ,
109
189
TemplateID : uuid.NullUUID {
110
190
UUID : ws .TemplateID ,
111
191
Valid : true ,
112
192
},
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 ... )
193
+ }, database.ProvisionerJob {})
128
194
seed .TemplateVersionID = templateVersion .ID
129
195
}
130
196
build := dbgen .WorkspaceBuild (t , db , seed )
@@ -145,3 +211,41 @@ func ProvisionerJobResources(t testing.TB, db database.Store, job uuid.UUID, tra
145
211
require .NoError (t , err )
146
212
}
147
213
}
214
+
215
+ func must [V any ](v V , err error ) V {
216
+ if err != nil {
217
+ panic (err )
218
+ }
219
+ return v
220
+ }
221
+
222
+ // takeFirstF takes the first value that returns true
223
+ func takeFirstF [Value any ](values []Value , take func (v Value ) bool ) Value {
224
+ for _ , v := range values {
225
+ if take (v ) {
226
+ return v
227
+ }
228
+ }
229
+ // If all empty, return the last element
230
+ if len (values ) > 0 {
231
+ return values [len (values )- 1 ]
232
+ }
233
+ var empty Value
234
+ return empty
235
+ }
236
+
237
+ // takeFirst will take the first non-empty value.
238
+ func takeFirst [Value comparable ](values ... Value ) Value {
239
+ var empty Value
240
+ return takeFirstF (values , func (v Value ) bool {
241
+ return v != empty
242
+ })
243
+ }
244
+
245
+ // takeFirstSlice implements takeFirst for []any.
246
+ // []any is not a comparable type.
247
+ func takeFirstSlice [T any ](values ... []T ) []T {
248
+ return takeFirstF (values , func (v []T ) bool {
249
+ return len (v ) != 0
250
+ })
251
+ }
0 commit comments