11import { BehaviorSubject , EmptyError , Subject , firstValueFrom , lastValueFrom , tap } from 'rxjs' ;
22import { InvalidStringError } from '@cardano-sdk/util' ;
3- import { Logger } from 'ts-log' ;
43import { RetryBackoffConfig , retryBackoff } from 'backoff-rxjs' ;
4+ import { TestLogger , createLogger } from '@cardano-sdk/util-dev' ;
55import { coldObservableProvider } from '../src' ;
66
77// There might be a more elegant way to mock with original implementation (spy)
88jest . 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-
2012describe ( '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