@@ -426,47 +426,257 @@ func TestWorkspace(t *testing.T) {
426
426
427
427
t .Run ("TemplateVersionPreset" , func (t * testing.T ) {
428
428
t .Parallel ()
429
- client , _ , api := coderdtest .NewWithAPI (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
430
- user := coderdtest .CreateFirstUser (t , client )
431
- authz := coderdtest .AssertRBAC (t , api , client )
432
- version := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
433
- Parse : echo .ParseComplete ,
434
- ProvisionPlan : []* proto.Response {{
435
- Type : & proto.Response_Plan {
436
- Plan : & proto.PlanComplete {
437
- Presets : []* proto.Preset {{
438
- Name : "test" ,
439
- }},
429
+
430
+ testCases := []struct {
431
+ name string
432
+ presets []* proto.Preset
433
+ expectedCount int
434
+ selectedPresetIndex int // Index of the preset to use, or -1 if no preset should be used
435
+ }{
436
+ {
437
+ name : "No Presets" ,
438
+ presets : []* proto.Preset {},
439
+ expectedCount : 0 ,
440
+ selectedPresetIndex : - 1 ,
441
+ },
442
+ {
443
+ name : "Single Preset - No Parameters" ,
444
+ presets : []* proto.Preset {{
445
+ Name : "test" ,
446
+ Parameters : []* proto.PresetParameter {
447
+ {Name : "param1" , Value : "value1" },
448
+ {Name : "param2" , Value : "value2" },
449
+ },
450
+ }},
451
+ expectedCount : 1 ,
452
+ selectedPresetIndex : 0 ,
453
+ },
454
+ {
455
+ name : "Single Preset - With Parameters" ,
456
+ presets : []* proto.Preset {{
457
+ Name : "test" ,
458
+ Parameters : []* proto.PresetParameter {
459
+ {Name : "param1" , Value : "value1" },
460
+ {Name : "param2" , Value : "value2" },
440
461
},
462
+ }},
463
+ expectedCount : 1 ,
464
+ selectedPresetIndex : 0 ,
465
+ },
466
+ {
467
+ name : "Multiple Presets - No Parameters" ,
468
+ presets : []* proto.Preset {
469
+ {Name : "test1" },
470
+ {Name : "test2" },
471
+ {Name : "test3" },
441
472
},
442
- }},
443
- ProvisionApply : echo .ApplyComplete ,
444
- })
445
- coderdtest .AwaitTemplateVersionJobCompleted (t , client , version .ID )
446
- template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version .ID )
473
+ expectedCount : 3 ,
474
+ selectedPresetIndex : 0 ,
475
+ },
476
+ {
477
+ name : "Multiple Presets - First Has Parameters" ,
478
+ presets : []* proto.Preset {
479
+ {
480
+ Name : "test1" ,
481
+ Parameters : []* proto.PresetParameter {
482
+ {Name : "param1" , Value : "value1" },
483
+ {Name : "param2" , Value : "value2" },
484
+ },
485
+ },
486
+ {Name : "test2" },
487
+ {Name : "test3" },
488
+ },
489
+ expectedCount : 3 ,
490
+ selectedPresetIndex : 0 ,
491
+ },
492
+ {
493
+ name : "Multiple Presets - Middle Has Parameters" ,
494
+ presets : []* proto.Preset {
495
+ {Name : "test1" },
496
+ {
497
+ Name : "test2" ,
498
+ Parameters : []* proto.PresetParameter {
499
+ {Name : "param1" , Value : "value1" },
500
+ {Name : "param2" , Value : "value2" },
501
+ },
502
+ },
503
+ {Name : "test3" },
504
+ },
505
+ expectedCount : 3 ,
506
+ selectedPresetIndex : 1 ,
507
+ },
508
+ {
509
+ name : "Multiple Presets - Last Has Parameters" ,
510
+ presets : []* proto.Preset {
511
+ {Name : "test1" },
512
+ {Name : "test2" },
513
+ {
514
+ Name : "test3" ,
515
+ Parameters : []* proto.PresetParameter {
516
+ {Name : "param1" , Value : "value1" },
517
+ {Name : "param2" , Value : "value2" },
518
+ },
519
+ },
520
+ },
521
+ expectedCount : 3 ,
522
+ selectedPresetIndex : 2 ,
523
+ },
524
+ {
525
+ name : "Multiple Presets - All Have Parameters" ,
526
+ presets : []* proto.Preset {
527
+ {
528
+ Name : "test1" ,
529
+ Parameters : []* proto.PresetParameter {
530
+ {Name : "param1" , Value : "value1" },
531
+ },
532
+ },
533
+ {
534
+ Name : "test2" ,
535
+ Parameters : []* proto.PresetParameter {
536
+ {Name : "param2" , Value : "value2" },
537
+ },
538
+ },
539
+ {
540
+ Name : "test3" ,
541
+ Parameters : []* proto.PresetParameter {
542
+ {Name : "param3" , Value : "value3" },
543
+ },
544
+ },
545
+ },
546
+ expectedCount : 3 ,
547
+ selectedPresetIndex : 1 ,
548
+ },
549
+ {
550
+ name : "Multiple Presets - With Parameters But Not Used" ,
551
+ presets : []* proto.Preset {
552
+ {
553
+ Name : "test1" ,
554
+ Parameters : []* proto.PresetParameter {
555
+ {Name : "param1" , Value : "value1" },
556
+ },
557
+ },
558
+ {
559
+ Name : "test2" ,
560
+ Parameters : []* proto.PresetParameter {
561
+ {Name : "param2" , Value : "value2" },
562
+ },
563
+ },
564
+ },
565
+ expectedCount : 2 ,
566
+ selectedPresetIndex : - 1 ,
567
+ },
568
+ }
447
569
448
- ctx := testutil .Context (t , testutil .WaitLong )
570
+ for _ , tc := range testCases {
571
+ tc := tc // Capture range variable
572
+ t .Run (tc .name , func (t * testing.T ) {
573
+ t .Parallel ()
449
574
450
- presets , err := client .TemplateVersionPresets (ctx , version .ID )
451
- require .NoError (t , err )
452
- require .Equal (t , 1 , len (presets ))
453
- require .Equal (t , "test" , presets [0 ].Name )
575
+ client , _ , api := coderdtest .NewWithAPI (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
576
+ user := coderdtest .CreateFirstUser (t , client )
577
+ authz := coderdtest .AssertRBAC (t , api , client )
454
578
455
- workspace := coderdtest .CreateWorkspace (t , client , template .ID , func (request * codersdk.CreateWorkspaceRequest ) {
456
- request .TemplateVersionPresetID = presets [0 ].ID
457
- })
579
+ // Create a plan response with the specified presets
580
+ planResponse := & proto.Response {
581
+ Type : & proto.Response_Plan {
582
+ Plan : & proto.PlanComplete {
583
+ Presets : tc .presets ,
584
+ },
585
+ },
586
+ }
458
587
459
- authz . Reset () // Reset all previous checks done in setup.
460
- ws , err := client . Workspace ( ctx , workspace . ID )
461
- authz . AssertChecked ( t , policy . ActionRead , ws )
462
- require . NoError ( t , err )
463
- require . Equal ( t , user . UserID , ws . LatestBuild . InitiatorID )
464
- require . Equal (t , codersdk . BuildReasonInitiator , ws . LatestBuild . Reason )
465
- require . Equal (t , presets [ 0 ]. ID , * ws . LatestBuild . TemplateVersionPresetID )
588
+ version := coderdtest . CreateTemplateVersion ( t , client , user . OrganizationID , & echo. Responses {
589
+ Parse : echo . ParseComplete ,
590
+ ProvisionPlan : [] * proto. Response { planResponse },
591
+ ProvisionApply : echo . ApplyComplete ,
592
+ } )
593
+ coderdtest . AwaitTemplateVersionJobCompleted (t , client , version . ID )
594
+ template := coderdtest . CreateTemplate (t , client , user . OrganizationID , version . ID )
466
595
467
- org , err := client .Organization (ctx , ws .OrganizationID )
468
- require .NoError (t , err )
469
- require .Equal (t , ws .OrganizationName , org .Name )
596
+ ctx := testutil .Context (t , testutil .WaitLong )
597
+
598
+ // Check presets
599
+ presets , err := client .TemplateVersionPresets (ctx , version .ID )
600
+ require .NoError (t , err )
601
+ require .Equal (t , tc .expectedCount , len (presets ))
602
+
603
+ if tc .expectedCount > 0 {
604
+ // Verify preset names and parameters
605
+ for i , preset := range presets {
606
+ require .Equal (t , tc .presets [i ].Name , preset .Name )
607
+
608
+ // Check if the preset should have parameters
609
+ if tc .presets [i ].Parameters != nil {
610
+ // Verify that the preset has the expected parameters
611
+ for _ , param := range tc .presets [i ].Parameters {
612
+ found := false
613
+ for _ , presetParam := range preset .Parameters {
614
+ if param .Name == presetParam .Name {
615
+ require .Equal (t , param .Value , presetParam .Value ,
616
+ "Parameter %s should have value %s" , param .Name , param .Value )
617
+ found = true
618
+ break
619
+ }
620
+ }
621
+ require .True (t , found , "Parameter %s should be present in preset" , param .Name )
622
+ }
623
+ }
624
+ }
625
+ }
626
+
627
+ // Create workspace with or without preset
628
+ var workspace codersdk.Workspace
629
+ if tc .selectedPresetIndex >= 0 && tc .expectedCount > 0 {
630
+ // Use the selected preset
631
+ selectedIndex := tc .selectedPresetIndex
632
+ if selectedIndex >= len (presets ) {
633
+ selectedIndex = 0 // Fallback to first preset if index is out of bounds
634
+ }
635
+
636
+ workspace = coderdtest .CreateWorkspace (t , client , template .ID , func (request * codersdk.CreateWorkspaceRequest ) {
637
+ request .TemplateVersionPresetID = presets [selectedIndex ].ID
638
+ })
639
+ } else {
640
+ workspace = coderdtest .CreateWorkspace (t , client , template .ID )
641
+ }
642
+
643
+ // Verify workspace details
644
+ authz .Reset () // Reset all previous checks done in setup.
645
+ ws , err := client .Workspace (ctx , workspace .ID )
646
+ authz .AssertChecked (t , policy .ActionRead , ws )
647
+ require .NoError (t , err )
648
+ require .Equal (t , user .UserID , ws .LatestBuild .InitiatorID )
649
+ require .Equal (t , codersdk .BuildReasonInitiator , ws .LatestBuild .Reason )
650
+
651
+ // Check preset ID if expected
652
+ if tc .selectedPresetIndex >= 0 && tc .expectedCount > 0 {
653
+ require .NotNil (t , ws .LatestBuild .TemplateVersionPresetID )
654
+
655
+ // Use the selected preset index
656
+ selectedIndex := tc .selectedPresetIndex
657
+ if selectedIndex >= len (presets ) {
658
+ selectedIndex = 0 // Fallback to first preset if index is out of bounds
659
+ }
660
+
661
+ require .Equal (t , presets [selectedIndex ].ID , * ws .LatestBuild .TemplateVersionPresetID )
662
+
663
+ // If the selected preset has parameters, verify they were applied
664
+ if tc .presets [selectedIndex ].Parameters != nil {
665
+ // This would require additional verification based on how parameters
666
+ // are stored in the workspace. For now, we'll just log that we checked.
667
+ t .Logf ("Selected preset %s has parameters that should be applied to the workspace" ,
668
+ tc .presets [selectedIndex ].Name )
669
+ }
670
+ } else {
671
+ require .Nil (t , ws .LatestBuild .TemplateVersionPresetID )
672
+ }
673
+
674
+ // Verify organization
675
+ org , err := client .Organization (ctx , ws .OrganizationID )
676
+ require .NoError (t , err )
677
+ require .Equal (t , ws .OrganizationName , org .Name )
678
+ })
679
+ }
470
680
})
471
681
}
472
682
0 commit comments