Remove done callback usage from it(...) (#5514)
* Remove done callback usage from it(...) * Bump deps * continue-on-error: true
This commit is contained in:
@@ -22,81 +22,89 @@ describe('Combinator', (): void => {
|
||||
fns = [];
|
||||
});
|
||||
|
||||
it('it triggers on all values', (done): void => {
|
||||
let count = 0;
|
||||
const combinator = new Combinator(
|
||||
[storeFn],
|
||||
(value: any[]): void => {
|
||||
expect(value[0]).toEqual(`test${count}`);
|
||||
it('it triggers on all values', async (): Promise<void> => {
|
||||
await new Promise<boolean>((resolve) => {
|
||||
let count = 0;
|
||||
const combinator = new Combinator(
|
||||
[storeFn],
|
||||
(value: any[]): void => {
|
||||
expect(value[0]).toEqual(`test${count}`);
|
||||
|
||||
count++;
|
||||
count++;
|
||||
|
||||
if (count === 3) {
|
||||
done();
|
||||
if (count === 3) {
|
||||
resolve(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
);
|
||||
|
||||
fns[0]('test0');
|
||||
fns[0]('test1');
|
||||
fns[0]('test2');
|
||||
fns[0]('test0');
|
||||
fns[0]('test1');
|
||||
fns[0]('test2');
|
||||
|
||||
expect(combinator).toBeDefined();
|
||||
});
|
||||
|
||||
it('combines values from 2 sources, firing when it has all results', (done): void => {
|
||||
const combinator = new Combinator(
|
||||
[storeFn, storeFn],
|
||||
(value: any[]): void => {
|
||||
expect(value).toEqual(['test0', 'test1']);
|
||||
|
||||
done();
|
||||
}
|
||||
);
|
||||
|
||||
fns[0]('test0');
|
||||
fns[1]('test1');
|
||||
|
||||
expect(combinator).toBeDefined();
|
||||
});
|
||||
|
||||
it('combines values from 2 sources, allowing multiple updates', (done): void => {
|
||||
let count = 0;
|
||||
const combinator = new Combinator(
|
||||
[storeFn, storeFn],
|
||||
(value: any[]): void => {
|
||||
expect(value).toEqual(
|
||||
count === 0
|
||||
? ['test0', 'test1']
|
||||
: ['test2', 'test1']);
|
||||
|
||||
count++;
|
||||
|
||||
if (count === 2) {
|
||||
done();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
fns[0]('test0');
|
||||
fns[1]('test1');
|
||||
fns[0]('test2');
|
||||
|
||||
expect(combinator).toBeDefined();
|
||||
});
|
||||
|
||||
it('unsubscribes as required', (done): void => {
|
||||
// eslint-disable-next-line @typescript-eslint/require-await
|
||||
const mocker = () => Promise.resolve(done);
|
||||
const combinator = new Combinator([
|
||||
mocker,
|
||||
// eslint-disable-next-line @typescript-eslint/require-await
|
||||
async (): UnsubscribePromise => (): void => undefined
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
], (value: any[]): void => {
|
||||
// ignore
|
||||
expect(combinator).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
combinator.unsubscribe();
|
||||
it('combines values from 2 sources, firing when it has all results', async (): Promise<void> => {
|
||||
await new Promise<boolean>((resolve) => {
|
||||
const combinator = new Combinator(
|
||||
[storeFn, storeFn],
|
||||
(value: any[]): void => {
|
||||
expect(value).toEqual(['test0', 'test1']);
|
||||
|
||||
resolve(true);
|
||||
}
|
||||
);
|
||||
|
||||
fns[0]('test0');
|
||||
fns[1]('test1');
|
||||
|
||||
expect(combinator).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
it('combines values from 2 sources, allowing multiple updates', async (): Promise<void> => {
|
||||
await new Promise<boolean>((resolve) => {
|
||||
let count = 0;
|
||||
const combinator = new Combinator(
|
||||
[storeFn, storeFn],
|
||||
(value: any[]): void => {
|
||||
expect(value).toEqual(
|
||||
count === 0
|
||||
? ['test0', 'test1']
|
||||
: ['test2', 'test1']);
|
||||
|
||||
count++;
|
||||
|
||||
if (count === 2) {
|
||||
resolve(true);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
fns[0]('test0');
|
||||
fns[1]('test1');
|
||||
fns[0]('test2');
|
||||
|
||||
expect(combinator).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
it('unsubscribes as required', async (): Promise<void> => {
|
||||
await new Promise<void>((resolve) => {
|
||||
// eslint-disable-next-line @typescript-eslint/require-await
|
||||
const mocker = () => Promise.resolve(resolve);
|
||||
const combinator = new Combinator([
|
||||
mocker,
|
||||
// eslint-disable-next-line @typescript-eslint/require-await
|
||||
async (): UnsubscribePromise => (): void => undefined
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
], (value: any[]): void => {
|
||||
// ignore
|
||||
});
|
||||
|
||||
combinator.unsubscribe();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -55,24 +55,26 @@ describe('Cached Observables', (): void => {
|
||||
expect(observable2).not.toBe(observable1);
|
||||
});
|
||||
|
||||
it('subscribes to the same one if within the period (unbsub delay)', (done): void => {
|
||||
it('subscribes to the same one if within the period (unbsub delay)', async (): Promise<void> => {
|
||||
const observable1 = rpc.chain.subscribeNewHeads();
|
||||
const sub1 = observable1.subscribe();
|
||||
|
||||
sub1.unsubscribe();
|
||||
|
||||
setTimeout((): void => {
|
||||
const observable2 = rpc.chain.subscribeNewHeads();
|
||||
const sub2 = observable2.subscribe();
|
||||
await new Promise<boolean>((resolve) => {
|
||||
setTimeout((): void => {
|
||||
const observable2 = rpc.chain.subscribeNewHeads();
|
||||
const sub2 = observable2.subscribe();
|
||||
|
||||
expect(observable1).toBe(observable2);
|
||||
expect(observable1).toBe(observable2);
|
||||
|
||||
sub2.unsubscribe();
|
||||
done();
|
||||
}, 500);
|
||||
sub2.unsubscribe();
|
||||
resolve(true);
|
||||
}, 500);
|
||||
});
|
||||
});
|
||||
|
||||
it('clears cache if there are no more subscribers', (done): void => {
|
||||
it('clears cache if there are no more subscribers', async (): Promise<void> => {
|
||||
const observable1 = rpc.chain.subscribeNewHeads();
|
||||
const observable2 = rpc.chain.subscribeNewHeads();
|
||||
const sub1 = observable1.subscribe();
|
||||
@@ -83,13 +85,15 @@ describe('Cached Observables', (): void => {
|
||||
sub1.unsubscribe();
|
||||
sub2.unsubscribe();
|
||||
|
||||
setTimeout((): void => {
|
||||
// No more subscribers, now create a new observable
|
||||
const observable3 = rpc.chain.subscribeNewHeads();
|
||||
await new Promise<boolean>((resolve) => {
|
||||
setTimeout((): void => {
|
||||
// No more subscribers, now create a new observable
|
||||
const observable3 = rpc.chain.subscribeNewHeads();
|
||||
|
||||
expect(observable3).not.toBe(observable1);
|
||||
done();
|
||||
}, 3500);
|
||||
expect(observable3).not.toBe(observable1);
|
||||
resolve(true);
|
||||
}, 3500);
|
||||
});
|
||||
});
|
||||
|
||||
it('creates different observables for different methods but same arguments', (): void => {
|
||||
@@ -107,7 +111,7 @@ describe('Cached Observables', (): void => {
|
||||
expect(observable2).toBe(observable1);
|
||||
});
|
||||
|
||||
it('creates multiple observables for subsequent one-shots delayed', (done): void => {
|
||||
it('creates multiple observables for subsequent one-shots delayed', async (): Promise<void> => {
|
||||
const observable1 = rpc.chain.getBlockHash(123);
|
||||
|
||||
const sub = observable1.subscribe((): void => {
|
||||
@@ -116,9 +120,11 @@ describe('Cached Observables', (): void => {
|
||||
|
||||
expect(rpc.chain.getBlockHash(123)).toBe(observable1);
|
||||
|
||||
setTimeout((): void => {
|
||||
expect(rpc.chain.getBlockHash(123)).not.toBe(observable1);
|
||||
done();
|
||||
}, 3500);
|
||||
await new Promise<boolean>((resolve) => {
|
||||
setTimeout((): void => {
|
||||
expect(rpc.chain.getBlockHash(123)).not.toBe(observable1);
|
||||
resolve(true);
|
||||
}, 3500);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -42,31 +42,35 @@ describe('methodSend', (): void => {
|
||||
rpc = new RpcCore('987', registry, provider);
|
||||
});
|
||||
|
||||
it('checks for mismatched parameters', (done): void => {
|
||||
it('checks for mismatched parameters', async (): Promise<void> => {
|
||||
// private method
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
||||
const method = (rpc as any)._createMethodSend('test', 'bleh', methods.bleh);
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
||||
method(1).subscribe(
|
||||
(): void => undefined,
|
||||
(error: Error): void => {
|
||||
expect(error.message).toMatch(/parameters, 1 found instead/);
|
||||
done();
|
||||
});
|
||||
await new Promise<boolean>((resolve) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
||||
method(1).subscribe(
|
||||
(): void => undefined,
|
||||
(error: Error): void => {
|
||||
expect(error.message).toMatch(/parameters, 1 found instead/);
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('calls the provider with the correct parameters', (done): void => {
|
||||
it('calls the provider with the correct parameters', async (): Promise<void> => {
|
||||
// private method
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
||||
const method = (rpc as any)._createMethodSend('test', 'blah', methods.blah);
|
||||
|
||||
// Args are length-prefixed, because it's a Bytes
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
||||
method(new Uint8Array([2 << 2, 0x12, 0x34])).subscribe((): void => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
||||
expect(provider.send).toHaveBeenCalledWith('test_blah', ['0x1234'], false);
|
||||
done();
|
||||
await new Promise<boolean>((resolve) => {
|
||||
// Args are length-prefixed, because it's a Bytes
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
||||
method(new Uint8Array([2 << 2, 0x12, 0x34])).subscribe((): void => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
||||
expect(provider.send).toHaveBeenCalledWith('test_blah', ['0x1234'], false);
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -25,17 +25,19 @@ describe('replay', (): void => {
|
||||
await provider.disconnect();
|
||||
});
|
||||
|
||||
it('returns the observable value', (done): void => {
|
||||
rpc.system.chain().subscribe((value: any): void => {
|
||||
if (value) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
||||
expect(value.toString()).toEqual('mockChain'); // Defined in MockProvider
|
||||
done();
|
||||
}
|
||||
it('returns the observable value', async (): Promise<void> => {
|
||||
await new Promise<boolean>((resolve) => {
|
||||
rpc.system.chain().subscribe((value: any): void => {
|
||||
if (value) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
||||
expect(value.toString()).toEqual('mockChain'); // Defined in MockProvider
|
||||
resolve(true);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('replay(1) works as expected', (done): void => {
|
||||
it('replay(1) works as expected', async (): Promise<void> => {
|
||||
const observable = rpc.system.chain();
|
||||
let a: any | undefined;
|
||||
|
||||
@@ -43,28 +45,32 @@ describe('replay', (): void => {
|
||||
a = value;
|
||||
});
|
||||
|
||||
setTimeout((): void => {
|
||||
// Subscribe again to the same observable, it should fire value immediately
|
||||
observable.subscribe((value: any): void => {
|
||||
expect(value).toEqual(a);
|
||||
done();
|
||||
});
|
||||
}, 1000);
|
||||
await new Promise<boolean>((resolve) => {
|
||||
setTimeout((): void => {
|
||||
// Subscribe again to the same observable, it should fire value immediately
|
||||
observable.subscribe((value: any): void => {
|
||||
expect(value).toEqual(a);
|
||||
resolve(true);
|
||||
});
|
||||
}, 1000);
|
||||
});
|
||||
});
|
||||
|
||||
it('unsubscribes as required', (done): void => {
|
||||
it('unsubscribes as required', async (): Promise<void> => {
|
||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||
rpc.provider.unsubscribe = jest.fn();
|
||||
|
||||
const subscription = rpc.chain.subscribeNewHeads().subscribe((): void => {
|
||||
subscription.unsubscribe();
|
||||
await new Promise<boolean>((resolve) => {
|
||||
const subscription = rpc.chain.subscribeNewHeads().subscribe((): void => {
|
||||
subscription.unsubscribe();
|
||||
|
||||
// There's a promise inside .unsubscribe(), wait a bit (> 2s)
|
||||
setTimeout((): void => {
|
||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||
expect(rpc.provider.unsubscribe).toHaveBeenCalled();
|
||||
done();
|
||||
}, 3500);
|
||||
// There's a promise inside .unsubscribe(), wait a bit (> 2s)
|
||||
setTimeout((): void => {
|
||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||
expect(rpc.provider.unsubscribe).toHaveBeenCalled();
|
||||
resolve(true);
|
||||
}, 3500);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -9,41 +9,43 @@ import { of, timer } from 'rxjs';
|
||||
import { drr } from '.';
|
||||
|
||||
describe('drr', (): void => {
|
||||
it('should not fire twice the same value', (done): void => {
|
||||
it('should not fire twice the same value', async (): Promise<void> => {
|
||||
let count = 0;
|
||||
|
||||
const sub = of(1, 1).pipe(drr({ delay: 500 })).subscribe((): void => {
|
||||
++count;
|
||||
});
|
||||
|
||||
setTimeout((): void => {
|
||||
expect(count).toBe(1);
|
||||
sub.unsubscribe();
|
||||
|
||||
setTimeout(() => {
|
||||
done();
|
||||
}, 2000);
|
||||
}, 50);
|
||||
});
|
||||
|
||||
it('should be a ReplaySubject(1)', (done): void => {
|
||||
const obs = timer(0, 100).pipe(drr({ delay: 500 })); // Starts at 0, increments every 100ms
|
||||
|
||||
const sub = obs.subscribe(); // Fire the observable
|
||||
|
||||
// Subscribe another time after some time, i.e. after the observable has fired
|
||||
setTimeout((): void => {
|
||||
const sub = obs.subscribe((value): void => {
|
||||
expect(value > 1).toBe(true);
|
||||
await new Promise<boolean>((resolve) => {
|
||||
setTimeout((): void => {
|
||||
expect(count).toBe(1);
|
||||
sub.unsubscribe();
|
||||
|
||||
setTimeout(() => {
|
||||
done();
|
||||
resolve(true);
|
||||
}, 2000);
|
||||
});
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
||||
it('should be a ReplaySubject(1)', async (): Promise<void> => {
|
||||
const obs = timer(0, 100).pipe(drr({ delay: 500 })); // Starts at 0, increments every 100ms
|
||||
const sub = obs.subscribe(); // Fire the observable
|
||||
|
||||
await new Promise<boolean>((resolve) => {
|
||||
// Subscribe another time after some time, i.e. after the observable has fired
|
||||
setTimeout((): void => {
|
||||
const sub = obs.subscribe((value): void => {
|
||||
expect(value > 1).toBe(true);
|
||||
|
||||
setTimeout(() => {
|
||||
resolve(true);
|
||||
}, 2000);
|
||||
});
|
||||
|
||||
sub.unsubscribe();
|
||||
}, 500);
|
||||
|
||||
sub.unsubscribe();
|
||||
}, 500);
|
||||
|
||||
sub.unsubscribe();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -22,20 +22,22 @@ describe('on', (): void => {
|
||||
await mock.disconnect();
|
||||
});
|
||||
|
||||
it('it emits both connected and disconnected events', (done): void => {
|
||||
it('it emits both connected and disconnected events', async (): Promise<void> => {
|
||||
const events: Record<string, boolean> = { connected: false, disconnected: false };
|
||||
|
||||
const handler = (type: ProviderInterfaceEmitted): void => {
|
||||
mock.on(type, (): void => {
|
||||
events[type] = true;
|
||||
await new Promise<boolean>((resolve) => {
|
||||
const handler = (type: ProviderInterfaceEmitted): void => {
|
||||
mock.on(type, (): void => {
|
||||
events[type] = true;
|
||||
|
||||
if (Object.values(events).filter((value): boolean => value).length === 2) {
|
||||
done();
|
||||
}
|
||||
});
|
||||
};
|
||||
if (Object.values(events).filter((value): boolean => value).length === 2) {
|
||||
resolve(true);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
handler('connected');
|
||||
handler('disconnected');
|
||||
handler('connected');
|
||||
handler('disconnected');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -36,37 +36,43 @@ describe('subscribe', (): void => {
|
||||
});
|
||||
});
|
||||
|
||||
it('calls back with the last known value', (done): void => {
|
||||
it('calls back with the last known value', async (): Promise<void> => {
|
||||
mock.isUpdating = false;
|
||||
mock.subscriptions.chain_subscribeNewHead.lastValue = 'testValue';
|
||||
|
||||
mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, value: string): void => {
|
||||
expect(value).toEqual('testValue');
|
||||
done();
|
||||
}).catch(console.error);
|
||||
await new Promise<boolean>((resolve) => {
|
||||
mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, value: string): void => {
|
||||
expect(value).toEqual('testValue');
|
||||
resolve(true);
|
||||
}).catch(console.error);
|
||||
});
|
||||
});
|
||||
|
||||
it('calls back with new headers', (done): void => {
|
||||
mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, header: { number: number }): void => {
|
||||
if (header.number === 4) {
|
||||
done();
|
||||
}
|
||||
}).catch(console.error);
|
||||
it('calls back with new headers', async (): Promise<void> => {
|
||||
await new Promise<boolean>((resolve) => {
|
||||
mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, header: { number: number }): void => {
|
||||
if (header.number === 4) {
|
||||
resolve(true);
|
||||
}
|
||||
}).catch(console.error);
|
||||
});
|
||||
});
|
||||
|
||||
it('handles errors withing callbacks gracefully', (done): void => {
|
||||
it('handles errors within callbacks gracefully', async (): Promise<void> => {
|
||||
let hasThrown = false;
|
||||
|
||||
mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, header: { number: number }): void => {
|
||||
if (!hasThrown) {
|
||||
hasThrown = true;
|
||||
await new Promise<boolean>((resolve) => {
|
||||
mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, header: { number: number }): void => {
|
||||
if (!hasThrown) {
|
||||
hasThrown = true;
|
||||
|
||||
throw new Error('testing');
|
||||
}
|
||||
throw new Error('testing');
|
||||
}
|
||||
|
||||
if (header.number === 3) {
|
||||
done();
|
||||
}
|
||||
}).catch(console.error);
|
||||
if (header.number === 3) {
|
||||
resolve(true);
|
||||
}
|
||||
}).catch(console.error);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user