diff --git a/packages/cli/src/runners/auth/__tests__/task-runner-auth.service.test.ts b/packages/cli/src/runners/auth/__tests__/task-runner-auth.service.test.ts index b5b35ace29..a1321945e3 100644 --- a/packages/cli/src/runners/auth/__tests__/task-runner-auth.service.test.ts +++ b/packages/cli/src/runners/auth/__tests__/task-runner-auth.service.test.ts @@ -3,6 +3,7 @@ import { sleep } from 'n8n-workflow'; import config from '@/config'; import { CacheService } from '@/services/cache/cache.service'; +import { retryUntil } from '@test-integration/retry-until'; import { mockInstance } from '../../../../test/shared/mocking'; import { TaskRunnerAuthService } from '../task-runner-auth.service'; @@ -86,7 +87,9 @@ describe('TaskRunnerAuthService', () => { // Act await sleep(TTL + 1); - expect(await authService.tryConsumeGrantToken(grantToken)).toBe(false); + await retryUntil(async () => + expect(await authService.tryConsumeGrantToken(grantToken)).toBe(false), + ); }); }); }); diff --git a/packages/cli/test/integration/shared/retry-until.ts b/packages/cli/test/integration/shared/retry-until.ts new file mode 100644 index 0000000000..f469149b31 --- /dev/null +++ b/packages/cli/test/integration/shared/retry-until.ts @@ -0,0 +1,32 @@ +/** + * Retries the given assertion until it passes or the timeout is reached + * + * @example + * await retryUntil( + * () => expect(service.someState).toBe(true) + * ); + */ +export const retryUntil = async ( + assertion: () => Promise | void, + { interval = 20, timeout = 1000 } = {}, +) => { + return await new Promise((resolve, reject) => { + const startTime = Date.now(); + + const tryAgain = () => { + setTimeout(async () => { + try { + resolve(await assertion()); + } catch (error) { + if (Date.now() - startTime > timeout) { + reject(error); + } else { + tryAgain(); + } + } + }, interval); + }; + + tryAgain(); + }); +};