import { AssertionError, expect } from "chai" export function elapsedFrom(from: number): number { return Date.now() - from } export async function eventually(fn: Function, timeout = 1500) { const start = Date.now() while (true) { try { await fn() return } catch (error) { if (elapsedFrom(start) > timeout) { if (error instanceof AssertionError) throw error expect.fail((error as Error).message) } await wait(5) } } } export async function expectToThrowAsync( method: () => Promise, expectedError: Function | Error, errorMessage: string | RegExp | null = null ): Promise { let error = null try { await method() } catch (err) { error = err } expect(error).instanceOf(expectedError) if (errorMessage instanceof RegExp) { expect((error as { message: string }).message).match(errorMessage) } if (typeof errorMessage === "string") { expect((error as { message: string }).message).eql(errorMessage) } } export function wait(timeout: number) { return new Promise((res) => setTimeout(res, timeout)) }