@@ -2,7 +2,7 @@ import { Cardano } from '@cardano-sdk/core';
22import { ConnectionStatus , TipTracker } from '../../src/services' ;
33import { InMemoryDocumentStore } from '../../src/persistence' ;
44import { Milliseconds , SyncStatus } from '../../src' ;
5- import { Observable , firstValueFrom , of } from 'rxjs' ;
5+ import { NEVER , Observable , firstValueFrom , of , take , takeUntil , timer } from 'rxjs' ;
66import { createStubObservable , createTestScheduler } from '@cardano-sdk/util-dev' ;
77import { dummyLogger } from 'ts-log' ;
88
@@ -15,6 +15,8 @@ const mockTips = {
1515 y : { hash : 'hy' }
1616} as unknown as Record < string , Cardano . Tip > ;
1717
18+ const trueFalse = { f : false , t : true } ;
19+
1820describe ( 'TipTracker' , ( ) => {
1921 const pollInterval : Milliseconds = 1 ; // delays emission after trigger
2022 let store : InMemoryDocumentStore < Cardano . Tip > ;
@@ -26,6 +28,48 @@ describe('TipTracker', () => {
2628 connectionStatus$ = of ( ConnectionStatus . up ) ;
2729 } ) ;
2830
31+ it ( 'calls the provider as soon as subscribed' , ( ) => {
32+ createTestScheduler ( ) . run ( ( { cold, expectObservable } ) => {
33+ const provider$ = createStubObservable < Cardano . Tip > ( cold ( 'a|' , mockTips ) ) ;
34+ const tracker$ = new TipTracker ( {
35+ connectionStatus$,
36+ logger,
37+ maxPollInterval : Number . MAX_VALUE ,
38+ minPollInterval : pollInterval ,
39+ provider$,
40+ store,
41+ syncStatus : { isSettled$ : NEVER } as unknown as SyncStatus
42+ } ) ;
43+ expectObservable ( tracker$ . asObservable ( ) . pipe ( take ( 1 ) ) ) . toBe ( '(a|)' , mockTips ) ;
44+ } ) ;
45+ } ) ;
46+
47+ it ( 'LW-11686 ignores multiple syncStatus emissions during pollInterval' , ( ) => {
48+ const poll : Milliseconds = 3 ;
49+ const sync = '-ttt-t----|' ;
50+ const tipT = 'a---b---c-|' ;
51+ // a-b--c-d|
52+ createTestScheduler ( ) . run ( ( { cold, expectObservable } ) => {
53+ const syncStatus : Partial < SyncStatus > = { isSettled$ : cold ( sync , trueFalse ) } ;
54+ const provider$ = createStubObservable < Cardano . Tip > (
55+ cold ( '(a|)' , mockTips ) ,
56+ cold ( '(b|)' , mockTips ) ,
57+ cold ( '(c|)' , mockTips ) ,
58+ cold ( '(d|)' , mockTips )
59+ ) ;
60+ const tracker$ = new TipTracker ( {
61+ connectionStatus$,
62+ logger,
63+ maxPollInterval : Number . MAX_VALUE ,
64+ minPollInterval : poll ,
65+ provider$,
66+ store,
67+ syncStatus : syncStatus as SyncStatus
68+ } ) ;
69+ expectObservable ( tracker$ . asObservable ( ) . pipe ( takeUntil ( timer ( 10 ) ) ) ) . toBe ( tipT , mockTips ) ;
70+ } ) ;
71+ } ) ;
72+
2973 it ( 'calls the provider immediately, only emitting distinct values, with throttling' , ( ) => {
3074 createTestScheduler ( ) . run ( ( { cold, expectObservable } ) => {
3175 const syncStatus : Partial < SyncStatus > = { isSettled$ : cold ( '---a---bc--d|' ) } ;
@@ -48,7 +92,7 @@ describe('TipTracker', () => {
4892 } ) ;
4993 } ) ;
5094
51- it ( 'starting offline, then coming online should subscribe to provider immediatelly for initial fetch' , ( ) => {
95+ it ( 'starting offline, then coming online should subscribe to provider immediately for initial fetch' , ( ) => {
5296 createTestScheduler ( ) . run ( ( { cold, hot, expectObservable, expectSubscriptions } ) => {
5397 const connectionStatusOffOn$ = hot ( 'd--u----|' , {
5498 d : ConnectionStatus . down ,
0 commit comments