mirror of
https://github.com/n8n-io/n8n.git
synced 2025-02-02 07:01:30 -08:00
fix(core): Ensure executions cannot resume if already running (#10014)
This commit is contained in:
parent
c2adaa58cd
commit
d651be4e01
|
@ -57,6 +57,10 @@ export class WaitingWebhooks implements IWebhookManager {
|
|||
throw new NotFoundError(`The execution "${executionId} does not exist.`);
|
||||
}
|
||||
|
||||
if (execution.status === 'running') {
|
||||
throw new ConflictError(`The execution "${executionId} is running already.`);
|
||||
}
|
||||
|
||||
if (execution.finished || execution.data.resultData.error) {
|
||||
throw new ConflictError(`The execution "${executionId} has finished already.`);
|
||||
}
|
||||
|
|
80
packages/cli/src/__tests__/waiting-webhooks.test.ts
Normal file
80
packages/cli/src/__tests__/waiting-webhooks.test.ts
Normal file
|
@ -0,0 +1,80 @@
|
|||
import { mock } from 'jest-mock-extended';
|
||||
import { WaitingWebhooks } from '@/WaitingWebhooks';
|
||||
import { ConflictError } from '@/errors/response-errors/conflict.error';
|
||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||
import type { IExecutionResponse, WaitingWebhookRequest } from '@/Interfaces';
|
||||
import type express from 'express';
|
||||
import type { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
||||
|
||||
describe('WaitingWebhooks', () => {
|
||||
const executionRepository = mock<ExecutionRepository>();
|
||||
const waitingWebhooks = new WaitingWebhooks(mock(), mock(), executionRepository);
|
||||
|
||||
beforeEach(() => {
|
||||
jest.restoreAllMocks();
|
||||
});
|
||||
|
||||
it('should throw NotFoundError if there is no execution to resume', async () => {
|
||||
/**
|
||||
* Arrange
|
||||
*/
|
||||
executionRepository.findSingleExecution.mockResolvedValue(undefined);
|
||||
|
||||
/**
|
||||
* Act
|
||||
*/
|
||||
const promise = waitingWebhooks.executeWebhook(
|
||||
mock<WaitingWebhookRequest>(),
|
||||
mock<express.Response>(),
|
||||
);
|
||||
|
||||
/**
|
||||
* Assert
|
||||
*/
|
||||
await expect(promise).rejects.toThrowError(NotFoundError);
|
||||
});
|
||||
|
||||
it('should throw ConflictError if the execution to resume is already running', async () => {
|
||||
/**
|
||||
* Arrange
|
||||
*/
|
||||
executionRepository.findSingleExecution.mockResolvedValue(
|
||||
mock<IExecutionResponse>({ status: 'running' }),
|
||||
);
|
||||
|
||||
/**
|
||||
* Act
|
||||
*/
|
||||
const promise = waitingWebhooks.executeWebhook(
|
||||
mock<WaitingWebhookRequest>(),
|
||||
mock<express.Response>(),
|
||||
);
|
||||
|
||||
/**
|
||||
* Assert
|
||||
*/
|
||||
await expect(promise).rejects.toThrowError(ConflictError);
|
||||
});
|
||||
|
||||
it('should throw ConflictError if the execution to resume already finished', async () => {
|
||||
/**
|
||||
* Arrange
|
||||
*/
|
||||
executionRepository.findSingleExecution.mockResolvedValue(
|
||||
mock<IExecutionResponse>({ finished: true }),
|
||||
);
|
||||
|
||||
/**
|
||||
* Act
|
||||
*/
|
||||
const promise = waitingWebhooks.executeWebhook(
|
||||
mock<WaitingWebhookRequest>(),
|
||||
mock<express.Response>(),
|
||||
);
|
||||
|
||||
/**
|
||||
* Assert
|
||||
*/
|
||||
await expect(promise).rejects.toThrowError(ConflictError);
|
||||
});
|
||||
});
|
Loading…
Reference in a new issue