@@ -493,78 +493,77 @@ func TestAPI(t *testing.T) {
493
493
t .Run ("Recreate" ,func (t * testing.T ) {
494
494
t .Parallel ()
495
495
496
- validContainer := codersdk.WorkspaceAgentContainer {
497
- ID :"container-id" ,
498
- FriendlyName :"container-name" ,
496
+ devcontainerID1 := uuid .New ()
497
+ devcontainerID2 := uuid .New ()
498
+ workspaceFolder1 := "/workspace/test1"
499
+ workspaceFolder2 := "/workspace/test2"
500
+ configPath1 := "/workspace/test1/.devcontainer/devcontainer.json"
501
+ configPath2 := "/workspace/test2/.devcontainer/devcontainer.json"
502
+
503
+ // Create a container that represents an existing devcontainer
504
+ devContainer1 := codersdk.WorkspaceAgentContainer {
505
+ ID :"container-1" ,
506
+ FriendlyName :"test-container-1" ,
499
507
Running :true ,
500
508
Labels :map [string ]string {
501
- agentcontainers .DevcontainerLocalFolderLabel :"/workspaces" ,
502
- agentcontainers .DevcontainerConfigFileLabel :"/workspace/.devcontainer/devcontainer.json" ,
509
+ agentcontainers .DevcontainerLocalFolderLabel :workspaceFolder1 ,
510
+ agentcontainers .DevcontainerConfigFileLabel :configPath1 ,
503
511
},
504
512
}
505
513
506
- missingFolderContainer := codersdk.WorkspaceAgentContainer {
507
- ID :"missing-folder-container" ,
508
- FriendlyName :"missing-folder-container" ,
509
- Labels :map [string ]string {},
514
+ devContainer2 := codersdk.WorkspaceAgentContainer {
515
+ ID :"container-2" ,
516
+ FriendlyName :"test-container-2" ,
517
+ Running :true ,
518
+ Labels :map [string ]string {
519
+ agentcontainers .DevcontainerLocalFolderLabel :workspaceFolder2 ,
520
+ agentcontainers .DevcontainerConfigFileLabel :configPath2 ,
521
+ },
510
522
}
511
523
512
524
tests := []struct {
513
- name string
514
- containerID string
515
- lister * fakeContainerCLI
516
- devcontainerCLI * fakeDevcontainerCLI
517
- wantStatus []int
518
- wantBody []string
525
+ name string
526
+ devcontainerID string
527
+ setupDevcontainers []codersdk.WorkspaceAgentDevcontainer
528
+ lister * fakeContainerCLI
529
+ devcontainerCLI * fakeDevcontainerCLI
530
+ wantStatus []int
531
+ wantBody []string
519
532
}{
520
533
{
521
- name :"Missingcontainer ID" ,
522
- containerID : "" ,
534
+ name :"Missingdevcontainer ID" ,
535
+ devcontainerID : "" ,
523
536
lister :& fakeContainerCLI {},
524
537
devcontainerCLI :& fakeDevcontainerCLI {},
525
538
wantStatus : []int {http .StatusBadRequest },
526
- wantBody : []string {"Missingcontainer ID or name " },
539
+ wantBody : []string {"Missingdevcontainer ID" },
527
540
},
528
541
{
529
- name :"List error " ,
530
- containerID : "container-id" ,
542
+ name :"Devcontainer not found " ,
543
+ devcontainerID : uuid . NewString () ,
531
544
lister :& fakeContainerCLI {
532
- listErr :xerrors .New ("list error" ),
533
- },
534
- devcontainerCLI :& fakeDevcontainerCLI {},
535
- wantStatus : []int {http .StatusInternalServerError },
536
- wantBody : []string {"Could not list containers" },
537
- },
538
- {
539
- name :"Container not found" ,
540
- containerID :"nonexistent-container" ,
541
- lister :& fakeContainerCLI {
542
- containers : codersdk.WorkspaceAgentListContainersResponse {
543
- Containers : []codersdk.WorkspaceAgentContainer {validContainer },
544
- },
545
+ arch :"<none>" ,// Unsupported architecture, don't inject subagent.
545
546
},
546
547
devcontainerCLI :& fakeDevcontainerCLI {},
547
548
wantStatus : []int {http .StatusNotFound },
548
- wantBody : []string {"Container not found" },
549
+ wantBody : []string {"Devcontainer not found" },
549
550
},
550
551
{
551
- name :"Missing workspace folder label" ,
552
- containerID :"missing-folder-container" ,
553
- lister :& fakeContainerCLI {
554
- containers : codersdk.WorkspaceAgentListContainersResponse {
555
- Containers : []codersdk.WorkspaceAgentContainer {missingFolderContainer },
552
+ name :"Devcontainer CLI error" ,
553
+ devcontainerID :devcontainerID1 .String (),
554
+ setupDevcontainers : []codersdk.WorkspaceAgentDevcontainer {
555
+ {
556
+ ID :devcontainerID1 ,
557
+ Name :"test-devcontainer-1" ,
558
+ WorkspaceFolder :workspaceFolder1 ,
559
+ ConfigPath :configPath1 ,
560
+ Status :codersdk .WorkspaceAgentDevcontainerStatusRunning ,
561
+ Container :& devContainer1 ,
556
562
},
557
563
},
558
- devcontainerCLI :& fakeDevcontainerCLI {},
559
- wantStatus : []int {http .StatusBadRequest },
560
- wantBody : []string {"Missing workspace folder label" },
561
- },
562
- {
563
- name :"Devcontainer CLI error" ,
564
- containerID :"container-id" ,
565
564
lister :& fakeContainerCLI {
566
565
containers : codersdk.WorkspaceAgentListContainersResponse {
567
- Containers : []codersdk.WorkspaceAgentContainer {validContainer },
566
+ Containers : []codersdk.WorkspaceAgentContainer {devContainer1 },
568
567
},
569
568
arch :"<none>" ,// Unsupported architecture, don't inject subagent.
570
569
},
@@ -575,11 +574,21 @@ func TestAPI(t *testing.T) {
575
574
wantBody : []string {"Devcontainer recreation initiated" ,"Devcontainer recreation already in progress" },
576
575
},
577
576
{
578
- name :"OK" ,
579
- containerID :"container-id" ,
577
+ name :"OK" ,
578
+ devcontainerID :devcontainerID2 .String (),
579
+ setupDevcontainers : []codersdk.WorkspaceAgentDevcontainer {
580
+ {
581
+ ID :devcontainerID2 ,
582
+ Name :"test-devcontainer-2" ,
583
+ WorkspaceFolder :workspaceFolder2 ,
584
+ ConfigPath :configPath2 ,
585
+ Status :codersdk .WorkspaceAgentDevcontainerStatusRunning ,
586
+ Container :& devContainer2 ,
587
+ },
588
+ },
580
589
lister :& fakeContainerCLI {
581
590
containers : codersdk.WorkspaceAgentListContainersResponse {
582
- Containers : []codersdk.WorkspaceAgentContainer {validContainer },
591
+ Containers : []codersdk.WorkspaceAgentContainer {devContainer2 },
583
592
},
584
593
arch :"<none>" ,// Unsupported architecture, don't inject subagent.
585
594
},
@@ -608,13 +617,16 @@ func TestAPI(t *testing.T) {
608
617
609
618
// Setup router with the handler under test.
610
619
r := chi .NewRouter ()
620
+
611
621
api := agentcontainers .NewAPI (
612
622
logger ,
613
623
agentcontainers .WithClock (mClock ),
614
624
agentcontainers .WithContainerCLI (tt .lister ),
615
625
agentcontainers .WithDevcontainerCLI (tt .devcontainerCLI ),
616
626
agentcontainers .WithWatcher (watcher .NewNoop ()),
627
+ agentcontainers .WithDevcontainers (tt .setupDevcontainers ,nil ),
617
628
)
629
+
618
630
api .Init ()
619
631
defer api .Close ()
620
632
r .Mount ("/" ,api .Routes ())
@@ -626,7 +638,7 @@ func TestAPI(t *testing.T) {
626
638
627
639
for i := range tt .wantStatus {
628
640
// Simulate HTTP request to the recreate endpoint.
629
- req := httptest .NewRequest (http .MethodPost ,"/devcontainers/container/ " + tt .containerID + "/recreate" ,nil ).
641
+ req := httptest .NewRequest (http .MethodPost ,"/devcontainers/" + tt .devcontainerID + "/recreate" ,nil ).
630
642
WithContext (ctx )
631
643
rec := httptest .NewRecorder ()
632
644
r .ServeHTTP (rec ,req )