@@ -14,6 +14,7 @@ const mockGetWorkflowById = vi.fn()
1414const mockGetWorkflowAccessContext = vi . fn ( )
1515const mockDbDelete = vi . fn ( )
1616const mockDbUpdate = vi . fn ( )
17+ const mockDbSelect = vi . fn ( )
1718
1819vi . mock ( '@/lib/auth' , ( ) => ( {
1920 getSession : ( ) => mockGetSession ( ) ,
@@ -49,6 +50,7 @@ vi.mock('@sim/db', () => ({
4950 db : {
5051 delete : ( ) => mockDbDelete ( ) ,
5152 update : ( ) => mockDbUpdate ( ) ,
53+ select : ( ) => mockDbSelect ( ) ,
5254 } ,
5355 workflow : { } ,
5456} ) )
@@ -327,6 +329,13 @@ describe('Workflow By ID API Route', () => {
327329 isWorkspaceOwner : false ,
328330 } )
329331
332+ // Mock db.select() to return multiple workflows so deletion is allowed
333+ mockDbSelect . mockReturnValue ( {
334+ from : vi . fn ( ) . mockReturnValue ( {
335+ where : vi . fn ( ) . mockResolvedValue ( [ { id : 'workflow-123' } , { id : 'workflow-456' } ] ) ,
336+ } ) ,
337+ } )
338+
330339 mockDbDelete . mockReturnValue ( {
331340 where : vi . fn ( ) . mockResolvedValue ( [ { id : 'workflow-123' } ] ) ,
332341 } )
@@ -347,6 +356,46 @@ describe('Workflow By ID API Route', () => {
347356 expect ( data . success ) . toBe ( true )
348357 } )
349358
359+ it ( 'should prevent deletion of the last workflow in workspace' , async ( ) => {
360+ const mockWorkflow = {
361+ id : 'workflow-123' ,
362+ userId : 'user-123' ,
363+ name : 'Test Workflow' ,
364+ workspaceId : 'workspace-456' ,
365+ }
366+
367+ mockGetSession . mockResolvedValue ( {
368+ user : { id : 'user-123' } ,
369+ } )
370+
371+ mockGetWorkflowById . mockResolvedValue ( mockWorkflow )
372+ mockGetWorkflowAccessContext . mockResolvedValue ( {
373+ workflow : mockWorkflow ,
374+ workspaceOwnerId : 'workspace-456' ,
375+ workspacePermission : 'admin' ,
376+ isOwner : true ,
377+ isWorkspaceOwner : false ,
378+ } )
379+
380+ // Mock db.select() to return only 1 workflow (the one being deleted)
381+ mockDbSelect . mockReturnValue ( {
382+ from : vi . fn ( ) . mockReturnValue ( {
383+ where : vi . fn ( ) . mockResolvedValue ( [ { id : 'workflow-123' } ] ) ,
384+ } ) ,
385+ } )
386+
387+ const req = new NextRequest ( 'http://localhost:3000/api/workflows/workflow-123' , {
388+ method : 'DELETE' ,
389+ } )
390+ const params = Promise . resolve ( { id : 'workflow-123' } )
391+
392+ const response = await DELETE ( req , { params } )
393+
394+ expect ( response . status ) . toBe ( 400 )
395+ const data = await response . json ( )
396+ expect ( data . error ) . toBe ( 'Cannot delete the only workflow in the workspace' )
397+ } )
398+
350399 it . concurrent ( 'should deny deletion for non-admin users' , async ( ) => {
351400 const mockWorkflow = {
352401 id : 'workflow-123' ,
0 commit comments