@@ -20,6 +20,7 @@ import (
20
20
"github.com/coder/coder/codersdk"
21
21
"github.com/coder/coder/codersdk/agentsdk"
22
22
"github.com/coder/coder/provisioner/echo"
23
+ "github.com/coder/coder/provisionersdk/proto"
23
24
"github.com/coder/coder/testutil"
24
25
)
25
26
@@ -231,6 +232,32 @@ func TestUserLatencyInsights_BadRequest(t *testing.T) {
231
232
func TestTemplateInsights (t * testing.T ) {
232
233
t .Parallel ()
233
234
235
+ const (
236
+ firstParameterName = "first_parameter"
237
+ firstParameterDisplayName = "First PARAMETER"
238
+ firstParameterType = "string"
239
+ firstParameterDescription = "This is first parameter"
240
+ firstParameterValue = "abc"
241
+
242
+ secondParameterName = "second_parameter"
243
+ secondParameterDisplayName = "Second PARAMETER"
244
+ secondParameterType = "number"
245
+ secondParameterDescription = "This is second parameter"
246
+ secondParameterValue = "123"
247
+
248
+ thirdParameterName = "third_parameter"
249
+ thirdParameterDisplayName = "Third PARAMETER"
250
+ thirdParameterType = "string"
251
+ thirdParameterDescription = "This is third parameter"
252
+ thirdParameterValue = "bbb"
253
+ thirdParameterOptionName1 = "This is AAA"
254
+ thirdParameterOptionValue1 = "aaa"
255
+ thirdParameterOptionName2 = "This is BBB"
256
+ thirdParameterOptionValue2 = "bbb"
257
+ thirdParameterOptionName3 = "This is CCC"
258
+ thirdParameterOptionValue3 = "ccc"
259
+ )
260
+
234
261
logger := slogtest .Make (t , nil )
235
262
opts := & coderdtest.Options {
236
263
IncludeProvisionerDaemon : true ,
@@ -241,15 +268,39 @@ func TestTemplateInsights(t *testing.T) {
241
268
user := coderdtest .CreateFirstUser (t , client )
242
269
authToken := uuid .NewString ()
243
270
version := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
244
- Parse : echo .ParseComplete ,
245
- ProvisionPlan : echo .ProvisionComplete ,
271
+ Parse : echo .ParseComplete ,
272
+ ProvisionPlan : []* proto.Provision_Response {
273
+ {
274
+ Type : & proto.Provision_Response_Complete {
275
+ Complete : & proto.Provision_Complete {
276
+ Parameters : []* proto.RichParameter {
277
+ {Name : firstParameterName , DisplayName : firstParameterDisplayName , Type : firstParameterType , Description : firstParameterDescription , Required : true },
278
+ {Name : secondParameterName , DisplayName : secondParameterDisplayName , Type : secondParameterType , Description : secondParameterDescription , Required : true },
279
+ {Name : thirdParameterName , DisplayName : thirdParameterDisplayName , Type : thirdParameterType , Description : thirdParameterDescription , Required : true , Options : []* proto.RichParameterOption {
280
+ {Name : thirdParameterOptionName1 , Value : thirdParameterOptionValue1 },
281
+ {Name : thirdParameterOptionName2 , Value : thirdParameterOptionValue2 },
282
+ {Name : thirdParameterOptionName3 , Value : thirdParameterOptionValue3 },
283
+ }},
284
+ },
285
+ },
286
+ },
287
+ },
288
+ },
246
289
ProvisionApply : echo .ProvisionApplyWithAgent (authToken ),
247
290
})
248
291
template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version .ID )
249
292
require .Empty (t , template .BuildTimeStats [codersdk .WorkspaceTransitionStart ])
250
-
251
293
coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
252
- workspace := coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID )
294
+
295
+ buildParameters := []codersdk.WorkspaceBuildParameter {
296
+ {Name : firstParameterName , Value : firstParameterValue },
297
+ {Name : secondParameterName , Value : secondParameterValue },
298
+ {Name : thirdParameterName , Value : thirdParameterValue },
299
+ }
300
+
301
+ workspace := coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID , func (cwr * codersdk.CreateWorkspaceRequest ) {
302
+ cwr .RichParameterValues = buildParameters
303
+ })
253
304
coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
254
305
255
306
// Start an agent so that we can generate stats.
@@ -346,12 +397,43 @@ func TestTemplateInsights(t *testing.T) {
346
397
}
347
398
}
348
399
// The full timeframe is <= 24h, so the interval matches exactly.
349
- assert .Len (t , resp .IntervalReports , 1 , "want one interval report" )
400
+ require .Len (t , resp .IntervalReports , 1 , "want one interval report" )
350
401
assert .WithinDuration (t , req .StartTime , resp .IntervalReports [0 ].StartTime , 0 )
351
402
assert .WithinDuration (t , req .EndTime , resp .IntervalReports [0 ].EndTime , 0 )
352
403
assert .Equal (t , resp .IntervalReports [0 ].ActiveUsers , int64 (1 ), "want one active user in the interval report" )
353
404
354
- // TODO(mafredri): Verify template parameter insights (first we need to generate them).
405
+ // The workspace uses 3 parameters
406
+ require .Len (t , resp .Report .ParametersUsage , 3 )
407
+ assert .Equal (t , firstParameterName , resp .Report .ParametersUsage [0 ].Name )
408
+ assert .Equal (t , firstParameterDisplayName , resp .Report .ParametersUsage [0 ].DisplayName )
409
+ assert .Contains (t , resp .Report .ParametersUsage [0 ].Values , codersdk.TemplateParameterValue {
410
+ Value : firstParameterValue ,
411
+ Count : 1 ,
412
+ })
413
+ assert .Contains (t , resp .Report .ParametersUsage [0 ].TemplateIDs , template .ID )
414
+ assert .Empty (t , resp .Report .ParametersUsage [0 ].Options )
415
+
416
+ assert .Equal (t , secondParameterName , resp .Report .ParametersUsage [1 ].Name )
417
+ assert .Equal (t , secondParameterDisplayName , resp .Report .ParametersUsage [1 ].DisplayName )
418
+ assert .Contains (t , resp .Report .ParametersUsage [1 ].Values , codersdk.TemplateParameterValue {
419
+ Value : secondParameterValue ,
420
+ Count : 1 ,
421
+ })
422
+ assert .Contains (t , resp .Report .ParametersUsage [1 ].TemplateIDs , template .ID )
423
+ assert .Empty (t , resp .Report .ParametersUsage [1 ].Options )
424
+
425
+ assert .Equal (t , thirdParameterName , resp .Report .ParametersUsage [2 ].Name )
426
+ assert .Equal (t , thirdParameterDisplayName , resp .Report .ParametersUsage [2 ].DisplayName )
427
+ assert .Contains (t , resp .Report .ParametersUsage [2 ].Values , codersdk.TemplateParameterValue {
428
+ Value : thirdParameterValue ,
429
+ Count : 1 ,
430
+ })
431
+ assert .Contains (t , resp .Report .ParametersUsage [2 ].TemplateIDs , template .ID )
432
+ assert .Equal (t , []codersdk.TemplateVersionParameterOption {
433
+ {Name : thirdParameterOptionName1 , Value : thirdParameterOptionValue1 },
434
+ {Name : thirdParameterOptionName2 , Value : thirdParameterOptionValue2 },
435
+ {Name : thirdParameterOptionName3 , Value : thirdParameterOptionValue3 },
436
+ }, resp .Report .ParametersUsage [2 ].Options )
355
437
}
356
438
357
439
func TestTemplateInsights_BadRequest (t * testing.T ) {
0 commit comments