From 744a98b9a8dee0d16778b86ae8a41d5f4949e01a Mon Sep 17 00:00:00 2001 From: Ray Kraesig Date: Sun, 9 Feb 2020 17:19:55 -0800 Subject: [PATCH] queueMarkAsRead: Adapt to use Lolex in tests. Simplify tests significantly by using Jest. In addition to changes in the tests proper, this also sets the internal variable `lastSentTime` to an initial value of `-Infinity` rather than `0`: Lolex's fake clock is initially set to a time of `0`, which badly confuses the original code. (An alternative solution would be to bump Lolex's initial time to some value greater than 0, but this seems more clearly a hack.) --- src/api/__tests__/queueMarkAsRead-test.js | 38 +++++++++++------------ src/api/queueMarkAsRead.js | 4 +-- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/api/__tests__/queueMarkAsRead-test.js b/src/api/__tests__/queueMarkAsRead-test.js index 86d8f82c874..caafd7eb8e4 100644 --- a/src/api/__tests__/queueMarkAsRead-test.js +++ b/src/api/__tests__/queueMarkAsRead-test.js @@ -2,17 +2,26 @@ import queueMarkAsRead, { resetAll } from '../queueMarkAsRead'; import * as messagesFlags from '../messages/messagesFlags'; import * as eg from '../../__tests__/exampleData'; +import { Lolex } from '../../__tests__/aux/lolex'; // $FlowFixMe Make flow understand about mocking messagesFlags.default = jest.fn(() => {}); -jest.useFakeTimers(); - describe('queueMarkAsRead', () => { - beforeEach(() => { - resetAll(); + let lolex: Lolex; + + beforeAll(() => { + lolex = new Lolex(); + }); + + afterAll(() => { + lolex.dispose(); + }); + + afterEach(() => { jest.clearAllMocks(); - jest.clearAllTimers(); + lolex.clearAllTimers(); + resetAll(); }); test('should not call messagesFlags on consecutive calls of queueMarkAsRead, setTimout on further calls', () => { @@ -21,36 +30,25 @@ describe('queueMarkAsRead', () => { queueMarkAsRead(eg.selfAuth, [7, 8, 9]); queueMarkAsRead(eg.selfAuth, [10, 11, 12]); - expect(setTimeout).toHaveBeenCalledTimes(1); + expect(lolex.getTimerCount()).toBe(1); expect(messagesFlags.default).toHaveBeenCalledTimes(1); }); test('should call messagesFlags, if calls to queueMarkAsRead are 2s apart', () => { - const start = Date.now(); - // $FlowFixMe Make flow understand about mocking - Date.now = jest.fn().mockReturnValue(start); queueMarkAsRead(eg.selfAuth, [13, 14, 15]); - - // $FlowFixMe Make flow understand about mocking - Date.now = jest.fn().mockReturnValue(start + 2100); + lolex.advanceTimersByTime(2100); queueMarkAsRead(eg.selfAuth, [16, 17, 18]); expect(messagesFlags.default).toHaveBeenCalledTimes(2); }); test('should set timeout for time remaining for next API call to clear queue', () => { - const start = Date.now(); - // $FlowFixMe Make flow understand about mocking - Date.now = jest.fn().mockReturnValue(start); queueMarkAsRead(eg.selfAuth, [1, 2, 3]); - // $FlowFixMe Make flow understand about mocking - Date.now = jest.fn().mockReturnValue(start + 1900); + lolex.advanceTimersByTime(1900); queueMarkAsRead(eg.selfAuth, [4, 5, 6]); - // $FlowFixMe Make flow understand about mocking - Date.now = jest.fn().mockReturnValue(start + 2001); - jest.runOnlyPendingTimers(); + lolex.runOnlyPendingTimers(); expect(messagesFlags.default).toHaveBeenCalledTimes(2); }); }); diff --git a/src/api/queueMarkAsRead.js b/src/api/queueMarkAsRead.js index 1e767dfef3e..ed3d1ddf3df 100644 --- a/src/api/queueMarkAsRead.js +++ b/src/api/queueMarkAsRead.js @@ -6,13 +6,13 @@ import messagesFlags from './messages/messagesFlags'; const debouncePeriodMs = 2000; let unsentMessageIds = []; -let lastSentTime = 0; +let lastSentTime = -Infinity; let timeout = null; /** Private; exported only for tests. */ export const resetAll = () => { unsentMessageIds = []; - lastSentTime = 0; + lastSentTime = -Infinity; timeout = null; };