Skip to content

Commit

Permalink
fix(core): Ensure executions cannot resume if already running (#10014)
Browse files Browse the repository at this point in the history
  • Loading branch information
ivov authored and jeanpaul committed Jul 11, 2024
1 parent ede1b53 commit b328d83
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 0 deletions.
4 changes: 4 additions & 0 deletions packages/cli/src/WaitingWebhooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.`);
}
Expand Down
80 changes: 80 additions & 0 deletions packages/cli/src/__tests__/waiting-webhooks.test.ts
Original file line number Diff line number Diff line change
@@ -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);
});
});

0 comments on commit b328d83

Please sign in to comment.