From cac51162b853247e19a66ec45d63d07661d8ad24 Mon Sep 17 00:00:00 2001 From: Davide Silvestri <davide@baserow.io> Date: Thu, 17 Oct 2024 12:48:55 +0000 Subject: [PATCH] Fix flaky frontend test --- .../test/unit/core/utils/queue.spec.js | 64 ++++++++++++------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/web-frontend/test/unit/core/utils/queue.spec.js b/web-frontend/test/unit/core/utils/queue.spec.js index db9aab8ad..f50de2544 100644 --- a/web-frontend/test/unit/core/utils/queue.spec.js +++ b/web-frontend/test/unit/core/utils/queue.spec.js @@ -1,15 +1,12 @@ import { GroupTaskQueue } from '@baserow/modules/core/utils/queue' +import flushPromises from 'flush-promises' + +jest.useFakeTimers() function sleep(ms) { - // FIXME: * 10 is a hack to increase the sleep time without the need to change all the - // values. The problem is that timing is not always accurate when running tests in - // parallel and this tests might fail because of that. - return new Promise((resolve) => setTimeout(resolve, ms * 10)) + return new Promise((resolve) => setTimeout(resolve, ms)) } -// Split the test to make sure they run async. This actually helps with the sleep -// timing. Not super happy about these tests that rely on `sleep`, but I'm not aware -// of a better way of testing concurrency in this case. describe('test GroupTaskQueue when immediately filling the queue', () => { test('test GroupTaskQueue when immediately filling the queue', async () => { let executed1 = false @@ -28,17 +25,20 @@ describe('test GroupTaskQueue when immediately filling the queue', () => { expect(executed1).toBe(false) expect(executed2).toBe(false) - await sleep(15) + jest.advanceTimersByTime(15) + await flushPromises() expect(executed1).toBe(false) expect(executed2).toBe(false) - await sleep(10) + jest.advanceTimersByTime(10) + await flushPromises() expect(executed1).toBe(true) expect(executed2).toBe(false) - await sleep(20) + jest.advanceTimersByTime(20) + await flushPromises() expect(executed1).toBe(true) expect(executed2).toBe(true) @@ -60,7 +60,8 @@ describe('test GroupTaskQueue adding to queue on the fly', () => { expect(executed2).toBe(false) expect(executed3).toBe(false) - await sleep(15) + jest.advanceTimersByTime(15) + await flushPromises() expect(executed1).toBe(false) expect(executed2).toBe(false) @@ -71,7 +72,8 @@ describe('test GroupTaskQueue adding to queue on the fly', () => { executed2 = true }) - await sleep(15) + jest.advanceTimersByTime(15) + await flushPromises() expect(executed1).toBe(true) expect(executed2).toBe(false) @@ -82,13 +84,15 @@ describe('test GroupTaskQueue adding to queue on the fly', () => { executed3 = true }) - await sleep(15) + jest.advanceTimersByTime(20) + await flushPromises() expect(executed1).toBe(true) expect(executed2).toBe(true) expect(executed3).toBe(false) - await sleep(25) + jest.advanceTimersByTime(25) + await flushPromises() expect(executed1).toBe(true) expect(executed2).toBe(true) @@ -107,7 +111,8 @@ describe('test GroupTaskQueue with different ids', () => { executed1 = true }, 1) - await sleep(10) + jest.advanceTimersByTime(10) + await flushPromises() expect(executed1).toBe(false) expect(executed2).toBe(false) @@ -122,13 +127,15 @@ describe('test GroupTaskQueue with different ids', () => { executed3 = true }, 1) - await sleep(30) + jest.advanceTimersByTime(30) + await flushPromises() expect(executed1).toBe(true) expect(executed2).toBe(true) expect(executed3).toBe(false) - await sleep(10) + jest.advanceTimersByTime(30) + await flushPromises() expect(executed1).toBe(true) expect(executed2).toBe(true) @@ -164,7 +171,10 @@ describe('test GroupTaskQueue with waiting for add to resolve', () => { executed3 = true }) - await sleep(50) + jest.advanceTimersByTime(30) + await flushPromises() + jest.advanceTimersByTime(20) + await flushPromises() expect(executed1).toBe(true) expect(executed2).toBe(true) @@ -201,7 +211,8 @@ describe('test GroupTaskQueue with exception during execution', () => { failed2 = true }) - await sleep(50) + jest.advanceTimersByTime(50) + await flushPromises() expect(failed1).toBe(true) expect(failed1Error.toString()).toBe('Error: test') @@ -231,7 +242,8 @@ describe('test GroupTaskQueue with lock', () => { executed3 = true }, 1) - await sleep(30) + jest.advanceTimersByTime(30) + await flushPromises() expect(executed1).toBe(false) expect(executed2).toBe(false) @@ -239,7 +251,8 @@ describe('test GroupTaskQueue with lock', () => { queue.release(2) - await sleep(30) + jest.advanceTimersByTime(30) + await flushPromises() expect(executed1).toBe(false) expect(executed2).toBe(true) @@ -247,13 +260,15 @@ describe('test GroupTaskQueue with lock', () => { queue.release(1) - await sleep(30) + jest.advanceTimersByTime(30) + await flushPromises() expect(executed1).toBe(true) expect(executed2).toBe(true) expect(executed3).toBe(false) - await sleep(20) + jest.advanceTimersByTime(20) + await flushPromises() expect(executed1).toBe(true) expect(executed2).toBe(true) @@ -269,7 +284,8 @@ describe('test queue deleted from GroupTaskQueue', () => { expect(Object.prototype.hasOwnProperty.call(queue.queues, 1)).toBe(true) - await sleep(30) + jest.advanceTimersByTime(30) + await flushPromises() expect(Object.prototype.hasOwnProperty.call(queue.queues, 1)).toBe(false) })