All files / platform/core/src/utils Queue.test.js

0% Statements 0/35
0% Branches 0/4
0% Functions 0/7
0% Lines 0/32

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70                                                                                                                                           
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
 */
 
const threshold = 2400;
 
describe('Queue', () => {
  // 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);
  // });
  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();
    const promise = timer(threshold).then(time => time - start);
    try {
      await timer(threshold);
    } catch (e) {
      expect(Date.now() - start < threshold).toBe(true);
      expect(e.message).toBe('Queue limit reached');
    }
    const elapsed = await promise;
    expect(elapsed >= threshold && elapsed < 2 * threshold).toBe(true);
    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();
    const promise = timer(threshold).then(time => time - start);
    await timer(threshold);
    expect(Date.now() - start < threshold).toBe(true);
    expect(mockedErrorHandler).toBeCalledTimes(1);
    expect(mockedErrorHandler).nthCalledWith(
      1,
      expect.objectContaining({ message: 'Queue limit reached' })
    );
    const elapsed = await promise;
    expect(elapsed >= threshold && elapsed < 2 * threshold).toBe(true);
    expect(mockedTimeout).toBeCalledTimes(1);
  });
});