@@ -355,10 +355,10 @@ func TestTasks(t *testing.T) {
355355 }
356356 })
357357
358- t .Run ("NoWorkspace " , func (t * testing.T ) {
358+ t .Run ("DeletedWorkspace " , func (t * testing.T ) {
359359 t .Parallel ()
360360
361- client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
361+ client , db := coderdtest .NewWithDatabase (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
362362 user := coderdtest .CreateFirstUser (t , client )
363363 template := createAITemplate (t , client , user )
364364 ctx := testutil .Context (t , testutil .WaitLong )
@@ -372,14 +372,54 @@ func TestTasks(t *testing.T) {
372372 ws , err := client .Workspace (ctx , task .WorkspaceID .UUID )
373373 require .NoError (t , err )
374374 coderdtest .AwaitWorkspaceBuildJobCompleted (t , client , ws .LatestBuild .ID )
375- // Delete the task workspace
376- coderdtest .MustTransitionWorkspace (t , client , ws .ID , codersdk .WorkspaceTransitionStart , codersdk .WorkspaceTransitionDelete )
377- // We should still be able to fetch the task after deleting its workspace
375+
376+ // Mark the workspace as deleted directly in the database, bypassing provisionerd.
377+ require .NoError (t , db .UpdateWorkspaceDeletedByID (dbauthz .AsProvisionerd (ctx ), database.UpdateWorkspaceDeletedByIDParams {
378+ ID : ws .ID ,
379+ Deleted : true ,
380+ }))
381+ // We should still be able to fetch the task if its workspace was deleted.
382+ // Provisionerdserver will attempt delete the related task when deleting a workspace.
383+ // This test ensures that we can still handle the case where, for some reason, the
384+ // task has not been marked as deleted, but the workspace has.
378385 task , err = exp .TaskByID (ctx , task .ID )
379- require .NoError (t , err , "fetching a task should still work after deleting its related workspace" )
386+ require .NoError (t , err , "fetching a task should still work if its related workspace is deleted " )
380387 err = exp .DeleteTask (ctx , task .OwnerID .String (), task .ID )
381388 require .NoError (t , err , "should be possible to delete a task with no workspace" )
382389 })
390+
391+ t .Run ("DeletingTaskWorkspaceDeletesTask" , func (t * testing.T ) {
392+ t .Parallel ()
393+
394+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
395+ user := coderdtest .CreateFirstUser (t , client )
396+ template := createAITemplate (t , client , user )
397+
398+ ctx := testutil .Context (t , testutil .WaitLong )
399+
400+ exp := codersdk .NewExperimentalClient (client )
401+ task , err := exp .CreateTask (ctx , "me" , codersdk.CreateTaskRequest {
402+ TemplateVersionID : template .ActiveVersionID ,
403+ Input : "delete me" ,
404+ })
405+ require .NoError (t , err )
406+ require .True (t , task .WorkspaceID .Valid , "task should have a workspace ID" )
407+ ws , err := client .Workspace (ctx , task .WorkspaceID .UUID )
408+ require .NoError (t , err )
409+ if assert .True (t , ws .TaskID .Valid , "task id should be set on workspace" ) {
410+ assert .Equal (t , task .ID , ws .TaskID .UUID , "workspace task id should match" )
411+ }
412+ coderdtest .AwaitWorkspaceBuildJobCompleted (t , client , ws .LatestBuild .ID )
413+
414+ // When; the task workspace is deleted
415+ coderdtest .MustTransitionWorkspace (t , client , ws .ID , codersdk .WorkspaceTransitionStart , codersdk .WorkspaceTransitionDelete )
416+ // Then: the task associated with the workspace is also deleted
417+ _ , err = exp .TaskByID (ctx , task .ID )
418+ require .Error (t , err , "expected an error fetching the task" )
419+ var sdkErr * codersdk.Error
420+ require .ErrorAs (t , err , & sdkErr , "expected a codersdk.Error" )
421+ require .Equal (t , http .StatusNotFound , sdkErr .StatusCode ())
422+ })
383423 })
384424
385425 t .Run ("Send" , func (t * testing.T ) {
0 commit comments