Skip to content

Commit 6e369bb

Browse files
committed
refactor(locks): hoist constant folder-lock check out of move loop; scope test mocks with Once
1 parent f7a6d31 commit 6e369bb

3 files changed

Lines changed: 8 additions & 5 deletions

File tree

apps/sim/app/api/workflows/route.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ describe('Workflows API Route - POST ordering', () => {
8989

9090
it('rejects creating a workflow inside a locked folder', async () => {
9191
const { FolderLockedError } = await import('@sim/workflow-authz')
92-
workflowAuthzMockFns.mockAssertFolderMutable.mockRejectedValue(
92+
workflowAuthzMockFns.mockAssertFolderMutable.mockRejectedValueOnce(
9393
new FolderLockedError('Folder is locked')
9494
)
9595

apps/sim/lib/copilot/tools/handlers/workflow/mutations.test.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ describe('lock enforcement', () => {
155155
ensureWorkflowAccessMock.mockResolvedValue({
156156
workflow: { id: 'workflow-1', variables: {} },
157157
})
158-
workflowAuthzMockFns.mockAssertWorkflowMutable.mockRejectedValue(
158+
workflowAuthzMockFns.mockAssertWorkflowMutable.mockRejectedValueOnce(
159159
new Error('Workflow is locked')
160160
)
161161

@@ -178,15 +178,17 @@ describe('lock enforcement', () => {
178178
workflow: { id: 'workflow-1', name: 'WF', folderId: null },
179179
})
180180
verifyFolderWorkspaceMock.mockResolvedValue(true)
181-
workflowAuthzMockFns.mockAssertFolderMutable.mockRejectedValue(new Error('Folder is locked'))
181+
workflowAuthzMockFns.mockAssertFolderMutable.mockRejectedValueOnce(
182+
new Error('Folder is locked')
183+
)
182184

183185
const result = await executeMoveWorkflow(
184186
{ workflowIds: ['workflow-1'], folderId: 'locked-folder' },
185187
{ userId: 'user-1' } as any
186188
)
187189

188190
expect(result.success).toBe(false)
189-
expect(result.output).toMatchObject({ moved: [], failed: ['workflow-1'] })
191+
expect(result.error).toBe('Folder is locked')
190192
expect(performUpdateWorkflowMock).not.toHaveBeenCalled()
191193
})
192194
})

apps/sim/lib/copilot/tools/handlers/workflow/mutations.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,8 @@ export async function executeMoveWorkflow(
676676
const moved: string[] = []
677677
const failed: string[] = []
678678

679+
await assertFolderMutable(folderId)
680+
679681
for (const workflowId of workflowIds) {
680682
try {
681683
const { workspaceId, workflow } = await ensureWorkflowAccess(
@@ -694,7 +696,6 @@ export async function executeMoveWorkflow(
694696
}
695697
}
696698
await assertWorkflowMutable(workflowId)
697-
await assertFolderMutable(folderId)
698699
assertWorkflowMutationNotAborted(context)
699700
const result = await performUpdateWorkflow({
700701
workflowId,

0 commit comments

Comments
 (0)