2020-04-15 13:57:57 -03: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
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
describe('Queue', () => {
|
|
|
|
|
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();
|
2020-12-03 10:26:22 +01:00
|
|
|
timer(1200).then(now => {
|
2020-04-15 13:57:57 -03:00
|
|
|
const elapsed = now - start;
|
2020-12-03 10:26:22 +01:00
|
|
|
expect(elapsed >= 1200 && elapsed < 2400).toBe(true);
|
2020-04-15 13:57:57 -03:00
|
|
|
});
|
2020-12-03 10:26:22 +01:00
|
|
|
const end = await timer(1200);
|
|
|
|
|
expect(end - start > 2400).toBe(true);
|
2020-04-15 13:57:57 -03:00
|
|
|
expect(mockedTimeout).toBeCalledTimes(2);
|
|
|
|
|
});
|
|
|
|
|
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();
|
2020-12-03 10:26:22 +01:00
|
|
|
const promise = timer(1200).then(time => time - start);
|
2020-04-15 13:57:57 -03:00
|
|
|
try {
|
2020-12-03 10:26:22 +01:00
|
|
|
await timer(1200);
|
2020-04-15 13:57:57 -03:00
|
|
|
} catch (e) {
|
2020-12-03 10:26:22 +01:00
|
|
|
expect(Date.now() - start < 1200).toBe(true);
|
2020-04-15 13:57:57 -03:00
|
|
|
expect(e.message).toBe('Queue limit reached');
|
|
|
|
|
}
|
|
|
|
|
const elapsed = await promise;
|
2020-12-03 10:26:22 +01:00
|
|
|
expect(elapsed >= 1200 && elapsed < 2400).toBe(true);
|
2020-04-15 13:57:57 -03: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();
|
2020-12-03 10:26:22 +01:00
|
|
|
const promise = timer(1200).then(time => time - start);
|
|
|
|
|
await timer(1200);
|
|
|
|
|
expect(Date.now() - start < 1200).toBe(true);
|
2020-04-15 13:57:57 -03:00
|
|
|
expect(mockedErrorHandler).toBeCalledTimes(1);
|
|
|
|
|
expect(mockedErrorHandler).nthCalledWith(
|
|
|
|
|
1,
|
|
|
|
|
expect.objectContaining({ message: 'Queue limit reached' })
|
|
|
|
|
);
|
|
|
|
|
const elapsed = await promise;
|
2020-12-03 10:26:22 +01:00
|
|
|
expect(elapsed >= 1200 && elapsed < 2400).toBe(true);
|
2020-04-15 13:57:57 -03:00
|
|
|
expect(mockedTimeout).toBeCalledTimes(1);
|
|
|
|
|
});
|
|
|
|
|
});
|