Skip to content

Commit 867945d

Browse files
committed
fixup! feat!: coldObservableProvider now stops after maxRetries (defaults to 10) and logs errors - coldObservableProvider constructor now requires a logger object
1 parent 9398c5f commit 867945d

File tree

1 file changed

+21
-20
lines changed

1 file changed

+21
-20
lines changed

packages/util-rxjs/test/coldObservableProvider.test.ts

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
import { BehaviorSubject, EmptyError, Subject, firstValueFrom, lastValueFrom, tap } from 'rxjs';
22
import { InvalidStringError } from '@cardano-sdk/util';
3-
import { Logger } from 'ts-log';
43
import { RetryBackoffConfig, retryBackoff } from 'backoff-rxjs';
4+
import { TestLogger, createLogger } from '@cardano-sdk/util-dev';
55
import { coldObservableProvider } from '../src';
66

77
// There might be a more elegant way to mock with original implementation (spy)
88
jest.mock('backoff-rxjs', () => ({
99
retryBackoff: jest.fn().mockImplementation((...args) => jest.requireActual('backoff-rxjs').retryBackoff(...args))
1010
}));
1111

12-
const createMockLogger = (): Logger => ({
13-
debug: jest.fn(),
14-
error: jest.fn(),
15-
info: jest.fn(),
16-
trace: jest.fn(),
17-
warn: jest.fn()
18-
});
19-
2012
describe('coldObservableProvider', () => {
13+
let logger: TestLogger;
14+
const testErrorStr = 'Test error';
15+
16+
beforeEach(() => {
17+
logger = createLogger({ record: true });
18+
});
19+
2120
it('returns an observable that calls underlying provider on each subscription and uses retryBackoff', async () => {
2221
const underlyingProvider = jest.fn().mockResolvedValue(true);
2322
const backoffConfig: RetryBackoffConfig = { initialInterval: 1 };
24-
const logger = createMockLogger();
2523
const provider$ = coldObservableProvider({
2624
logger,
2725
provider: underlyingProvider,
@@ -38,7 +36,6 @@ describe('coldObservableProvider', () => {
3836
const underlyingProvider = () => firstValueFrom(fakeProviderSubject);
3937
const backoffConfig: RetryBackoffConfig = { initialInterval: 1 };
4038
const cancel$ = new BehaviorSubject<boolean>(true);
41-
const logger = createMockLogger();
4239
const provider$ = coldObservableProvider({
4340
cancel$,
4441
logger,
@@ -55,7 +52,6 @@ describe('coldObservableProvider', () => {
5552
});
5653

5754
it('retries using retryBackoff, when underlying provider rejects', async () => {
58-
const logger = createMockLogger();
5955
const underlyingProvider = jest.fn().mockRejectedValueOnce(false).mockResolvedValue(true);
6056
const retryBackoffConfig: RetryBackoffConfig = { initialInterval: 1 };
6157
const provider$ = coldObservableProvider({ logger, provider: underlyingProvider, retryBackoffConfig });
@@ -67,10 +63,9 @@ describe('coldObservableProvider', () => {
6763
it('does not retry, when underlying provider rejects with InvalidStringError', async () => {
6864
const testValue = { test: 'value' };
6965
const testError = new InvalidStringError('Test invalid string error');
70-
const logger = createMockLogger();
7166
const underlyingProvider = jest
7267
.fn()
73-
.mockRejectedValueOnce(new Error('Test error'))
68+
.mockRejectedValueOnce(new Error(testErrorStr))
7469
.mockResolvedValueOnce(testValue)
7570
.mockRejectedValueOnce(testError)
7671
.mockResolvedValueOnce(testValue);
@@ -86,7 +81,12 @@ describe('coldObservableProvider', () => {
8681
await expect(firstValueFrom(provider$)).rejects.toThrow(EmptyError);
8782
expect(underlyingProvider).toBeCalledTimes(3);
8883
expect(onFatalError).toBeCalledWith(testError);
89-
expect(logger.error).toBeCalledWith(testError);
84+
expect(logger.messages).toStrictEqual([
85+
{ level: 'error', message: [new Error(testErrorStr)] },
86+
{ level: 'debug', message: ['Should retry: true'] },
87+
{ level: 'error', message: [testError] },
88+
{ level: 'debug', message: ['Should retry: true'] }
89+
]);
9090
});
9191

9292
it('polls the provider until the pollUntil condition is satisfied', async () => {
@@ -97,7 +97,6 @@ describe('coldObservableProvider', () => {
9797
.mockResolvedValueOnce('c')
9898
.mockResolvedValue('Never reached');
9999
const backoffConfig: RetryBackoffConfig = { initialInterval: 1 };
100-
const logger = createMockLogger();
101100

102101
const provider$ = coldObservableProvider({
103102
logger,
@@ -113,12 +112,11 @@ describe('coldObservableProvider', () => {
113112
});
114113

115114
it('stops retrying after maxRetries attempts and handles the error in catchError', async () => {
116-
const testError = new Error('Test error');
115+
const testError = new Error(testErrorStr);
117116
const underlyingProvider = jest.fn().mockRejectedValue(testError);
118117
const maxRetries = 3;
119118
const retryBackoffConfig: RetryBackoffConfig = { initialInterval: 1, maxRetries };
120119
const onFatalError = jest.fn();
121-
const logger = createMockLogger();
122120

123121
const provider$ = coldObservableProvider({
124122
logger,
@@ -131,7 +129,10 @@ describe('coldObservableProvider', () => {
131129

132130
expect(underlyingProvider).toBeCalledTimes(maxRetries + 1);
133131
expect(onFatalError).toBeCalledWith(expect.any(Error));
134-
expect(logger.error).toHaveBeenCalled();
135-
expect(logger.error).toHaveBeenCalledWith(testError);
132+
expect(logger.messages).toStrictEqual([
133+
{ level: 'error', message: [testError] },
134+
{ level: 'error', message: [testError] },
135+
{ level: 'error', message: [testError] }
136+
]);
136137
});
137138
});

0 commit comments

Comments
 (0)