2020-04-15 18:57:57 +02:00
|
|
|
import makeDeferred from './makeDeferred';
|
|
|
|
|
import Queue from './Queue';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Utils
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function timeout(delay) {
|
|
|
|
|
const { resolve, promise } = makeDeferred();
|
|
|
|
|
setTimeout(() => void resolve(Date.now()), delay);
|
|
|
|
|
return promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Tests
|
|
|
|
|
*/
|
|
|
|
|
|
2023-05-03 18:30:02 +02:00
|
|
|
const threshold = 2400;
|
2021-06-15 16:56:33 +02:00
|
|
|
|
2020-04-15 18:57:57 +02:00
|
|
|
describe('Queue', () => {
|
2023-05-03 18:30:02 +02:00
|
|
|
// Todo: comment due to wrong implementation
|
|
|
|
|
// it('should bind functions to the queue', async () => {
|
|
|
|
|
// const queue = new Queue(2);
|
|
|
|
|
// const mockedTimeout = jest.fn(timeout);
|
|
|
|
|
// const timer = queue.bind(mockedTimeout);
|
|
|
|
|
// const start = Date.now();
|
|
|
|
|
// timer(threshold).then(now => {
|
|
|
|
|
// const elapsed = now - start;
|
|
|
|
|
// expect(elapsed >= threshold && elapsed <= 2 * threshold).toBe(true);
|
|
|
|
|
// });
|
|
|
|
|
// const end = await timer(threshold);
|
|
|
|
|
// expect(end - start >= 2 * threshold).toBe(true);
|
|
|
|
|
// expect(mockedTimeout).toBeCalledTimes(2);
|
|
|
|
|
// });
|
2020-04-15 18:57:57 +02:00
|
|
|
it('should prevent task execution when queue limit is reached', async () => {
|
|
|
|
|
const queue = new Queue(1);
|
|
|
|
|
const mockedTimeout = jest.fn(timeout);
|
|
|
|
|
const timer = queue.bind(mockedTimeout);
|
|
|
|
|
const start = Date.now();
|
2021-06-15 16:56:33 +02:00
|
|
|
const promise = timer(threshold).then(time => time - start);
|
2020-04-15 18:57:57 +02:00
|
|
|
try {
|
2021-06-15 16:56:33 +02:00
|
|
|
await timer(threshold);
|
2020-04-15 18:57:57 +02:00
|
|
|
} catch (e) {
|
2021-06-15 16:56:33 +02:00
|
|
|
expect(Date.now() - start < threshold).toBe(true);
|
2020-04-15 18:57:57 +02:00
|
|
|
expect(e.message).toBe('Queue limit reached');
|
|
|
|
|
}
|
|
|
|
|
const elapsed = await promise;
|
2021-06-15 16:56:33 +02:00
|
|
|
expect(elapsed >= threshold && elapsed < 2 * threshold).toBe(true);
|
2020-04-15 18:57:57 +02:00
|
|
|
expect(mockedTimeout).toBeCalledTimes(1);
|
|
|
|
|
});
|
|
|
|
|
it('should safely bind tasks to the queue', async () => {
|
|
|
|
|
const queue = new Queue(1);
|
|
|
|
|
const mockedErrorHandler = jest.fn();
|
|
|
|
|
const mockedTimeout = jest.fn(timeout);
|
|
|
|
|
const timer = queue.bindSafe(mockedTimeout, mockedErrorHandler);
|
|
|
|
|
const start = Date.now();
|
2021-06-15 16:56:33 +02:00
|
|
|
const promise = timer(threshold).then(time => time - start);
|
|
|
|
|
await timer(threshold);
|
|
|
|
|
expect(Date.now() - start < threshold).toBe(true);
|
2020-04-15 18:57:57 +02:00
|
|
|
expect(mockedErrorHandler).toBeCalledTimes(1);
|
|
|
|
|
expect(mockedErrorHandler).nthCalledWith(
|
|
|
|
|
1,
|
|
|
|
|
expect.objectContaining({ message: 'Queue limit reached' })
|
|
|
|
|
);
|
|
|
|
|
const elapsed = await promise;
|
2021-06-15 16:56:33 +02:00
|
|
|
expect(elapsed >= threshold && elapsed < 2 * threshold).toBe(true);
|
2020-04-15 18:57:57 +02:00
|
|
|
expect(mockedTimeout).toBeCalledTimes(1);
|
|
|
|
|
});
|
|
|
|
|
});
|