|
1 | 1 | package coderd_test |
2 | 2 |
|
3 | 3 | import ( |
| 4 | +"context" |
4 | 5 | "database/sql" |
5 | 6 | "encoding/json" |
6 | 7 | "io" |
@@ -376,18 +377,14 @@ func TestTasks(t *testing.T) { |
376 | 377 | require.NoError(t,err,"delete task request should be accepted") |
377 | 378 |
|
378 | 379 | // Poll until the workspace is deleted. |
379 | | -for { |
| 380 | +testutil.Eventually(ctx,t,func(ctx context.Context) (donebool) { |
380 | 381 | dws,derr:=client.DeletedWorkspace(ctx,task.WorkspaceID.UUID) |
381 | | -ifderr==nil&&dws.LatestBuild.Status==codersdk.WorkspaceStatusDeleted { |
382 | | -break |
| 382 | +if!assert.NoError(t,derr,"expected to fetch deleted workspace before deadline") { |
| 383 | +returnfalse |
383 | 384 | } |
384 | | -ifctx.Err()!=nil { |
385 | | -require.NoError(t,derr,"expected to fetch deleted workspace before deadline") |
386 | | -require.Equal(t,codersdk.WorkspaceStatusDeleted,dws.LatestBuild.Status,"workspace should be deleted before deadline") |
387 | | -break |
388 | | -} |
389 | | -time.Sleep(testutil.IntervalMedium) |
390 | | -} |
| 385 | +t.Logf("workspace latest_build status: %q",dws.LatestBuild.Status) |
| 386 | +returndws.LatestBuild.Status==codersdk.WorkspaceStatusDeleted |
| 387 | +},testutil.IntervalMedium,"workspace should be deleted before deadline") |
391 | 388 | }) |
392 | 389 |
|
393 | 390 | t.Run("NotFound",func(t*testing.T) { |
@@ -468,6 +465,32 @@ func TestTasks(t *testing.T) { |
468 | 465 | t.Fatalf("unexpected status code: %d (expected 403 or 404)",authErr.StatusCode()) |
469 | 466 | } |
470 | 467 | }) |
| 468 | + |
| 469 | +t.Run("NoWorkspace",func(t*testing.T) { |
| 470 | +t.Parallel() |
| 471 | + |
| 472 | +client:=coderdtest.New(t,&coderdtest.Options{IncludeProvisionerDaemon:true}) |
| 473 | +user:=coderdtest.CreateFirstUser(t,client) |
| 474 | +template:=createAITemplate(t,client,user) |
| 475 | +ctx:=testutil.Context(t,testutil.WaitLong) |
| 476 | +exp:=codersdk.NewExperimentalClient(client) |
| 477 | +task,err:=exp.CreateTask(ctx,"me", codersdk.CreateTaskRequest{ |
| 478 | +TemplateVersionID:template.ActiveVersionID, |
| 479 | +Input:"delete me", |
| 480 | +}) |
| 481 | +require.NoError(t,err) |
| 482 | +require.True(t,task.WorkspaceID.Valid,"task should have a workspace ID") |
| 483 | +ws,err:=client.Workspace(ctx,task.WorkspaceID.UUID) |
| 484 | +require.NoError(t,err) |
| 485 | +coderdtest.AwaitWorkspaceBuildJobCompleted(t,client,ws.LatestBuild.ID) |
| 486 | +// Delete the task workspace |
| 487 | +coderdtest.MustTransitionWorkspace(t,client,ws.ID,codersdk.WorkspaceTransitionStart,codersdk.WorkspaceTransitionDelete) |
| 488 | +// We should still be able to fetch the task after deleting its workspace |
| 489 | +task,err=exp.TaskByID(ctx,task.ID) |
| 490 | +require.NoError(t,err,"fetching a task should still work after deleting its related workspace") |
| 491 | +err=exp.DeleteTask(ctx,task.OwnerID.String(),task.ID) |
| 492 | +require.NoError(t,err,"should be possible to delete a task with no workspace") |
| 493 | +}) |
471 | 494 | }) |
472 | 495 |
|
473 | 496 | t.Run("Send",func(t*testing.T) { |
|