diff --git a/coderd/aitasks_test.go b/coderd/aitasks_test.go index 491194ffd9..80af3e993e 100644 --- a/coderd/aitasks_test.go +++ b/coderd/aitasks_test.go @@ -1,6 +1,7 @@ package coderd_test import ( + "context" "database/sql" "encoding/json" "io" @@ -376,18 +377,14 @@ func TestTasks(t *testing.T) { require.NoError(t, err, "delete task request should be accepted") // Poll until the workspace is deleted. - for { + testutil.Eventually(ctx, t, func(ctx context.Context) (done bool) { dws, derr := client.DeletedWorkspace(ctx, task.WorkspaceID.UUID) - if derr == nil && dws.LatestBuild.Status == codersdk.WorkspaceStatusDeleted { - break + if !assert.NoError(t, derr, "expected to fetch deleted workspace before deadline") { + return false } - if ctx.Err() != nil { - require.NoError(t, derr, "expected to fetch deleted workspace before deadline") - require.Equal(t, codersdk.WorkspaceStatusDeleted, dws.LatestBuild.Status, "workspace should be deleted before deadline") - break - } - time.Sleep(testutil.IntervalMedium) - } + t.Logf("workspace latest_build status: %q", dws.LatestBuild.Status) + return dws.LatestBuild.Status == codersdk.WorkspaceStatusDeleted + }, testutil.IntervalMedium, "workspace should be deleted before deadline") }) t.Run("NotFound", func(t *testing.T) { @@ -468,6 +465,32 @@ func TestTasks(t *testing.T) { t.Fatalf("unexpected status code: %d (expected 403 or 404)", authErr.StatusCode()) } }) + + t.Run("NoWorkspace", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + user := coderdtest.CreateFirstUser(t, client) + template := createAITemplate(t, client, user) + ctx := testutil.Context(t, testutil.WaitLong) + exp := codersdk.NewExperimentalClient(client) + task, err := exp.CreateTask(ctx, "me", codersdk.CreateTaskRequest{ + TemplateVersionID: template.ActiveVersionID, + Input: "delete me", + }) + require.NoError(t, err) + require.True(t, task.WorkspaceID.Valid, "task should have a workspace ID") + ws, err := client.Workspace(ctx, task.WorkspaceID.UUID) + require.NoError(t, err) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) + // Delete the task workspace + coderdtest.MustTransitionWorkspace(t, client, ws.ID, codersdk.WorkspaceTransitionStart, codersdk.WorkspaceTransitionDelete) + // We should still be able to fetch the task after deleting its workspace + task, err = exp.TaskByID(ctx, task.ID) + require.NoError(t, err, "fetching a task should still work after deleting its related workspace") + err = exp.DeleteTask(ctx, task.OwnerID.String(), task.ID) + require.NoError(t, err, "should be possible to delete a task with no workspace") + }) }) t.Run("Send", func(t *testing.T) {