refactor(core): Simplify createDeferredPromise, and add tests (no-changelog) (#10811)

This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™
2024-09-13 15:53:03 +02:00
committed by GitHub
parent d647ef41ac
commit cef64329a9
14 changed files with 66 additions and 43 deletions

View File

@@ -1,14 +1,17 @@
// From: https://gist.github.com/compulim/8b49b0a744a3eeb2205e2b9506201e50
type ResolveFn<T> = (result: T | PromiseLike<T>) => void;
type RejectFn = (error: Error) => void;
export interface IDeferredPromise<T> {
promise: () => Promise<T>;
reject: (error: Error) => void;
resolve: (result: T) => void;
promise: Promise<T>;
resolve: ResolveFn<T>;
reject: RejectFn;
}
export async function createDeferredPromise<T = void>(): Promise<IDeferredPromise<T>> {
return await new Promise<IDeferredPromise<T>>((resolveCreate) => {
const promise = new Promise<T>((resolve, reject) => {
resolveCreate({ promise: async () => await promise, resolve, reject });
});
export function createDeferredPromise<T = void>(): IDeferredPromise<T> {
const deferred: Partial<IDeferredPromise<T>> = {};
deferred.promise = new Promise<T>((resolve, reject) => {
deferred.resolve = resolve;
deferred.reject = reject;
});
return deferred as IDeferredPromise<T>;
}

View File

@@ -728,7 +728,7 @@ export interface ICredentialTestFunctions {
}
interface BaseHelperFunctions {
createDeferredPromise: <T = void>() => Promise<IDeferredPromise<T>>;
createDeferredPromise: <T = void>() => IDeferredPromise<T>;
}
interface JsonHelperFunctions {

View File

@@ -0,0 +1,22 @@
import { createDeferredPromise } from '@/DeferredPromise';
describe('DeferredPromise', () => {
it('should resolve the promise with the correct value', async () => {
let done = false;
const deferred = createDeferredPromise<string>();
void deferred.promise.finally(() => {
done = true;
});
expect(done).toBe(false);
deferred.resolve('test');
await expect(deferred.promise).resolves.toBe('test');
expect(done).toBe(true);
});
it('should reject the promise with the correct error', async () => {
const deferred = createDeferredPromise();
const error = new Error('test error');
deferred.reject(error);
await expect(deferred.promise).rejects.toThrow(error);
});
});