@@ -57,37 +57,50 @@ describe('MetricsService', () => {
5757 expect ( setInterval ) . toHaveBeenCalledWith ( expect . any ( Function ) , testInterval ) ;
5858 } ) ;
5959
60- it ( 'emits the metrics at start ' , async ( ) => {
60+ it ( 'collects the metrics at every interval ' , async ( ) => {
6161 mockOpsCollector . collect . mockResolvedValue ( dummyMetrics ) ;
6262
63- const { getOpsMetrics$ } = await metricsService . setup ( {
64- http : httpMock ,
65- } ) ;
66-
63+ await metricsService . setup ( { http : httpMock } ) ;
6764 await metricsService . start ( ) ;
6865
6966 expect ( mockOpsCollector . collect ) . toHaveBeenCalledTimes ( 1 ) ;
70- expect (
71- await getOpsMetrics$ ( )
72- . pipe ( take ( 1 ) )
73- . toPromise ( )
74- ) . toEqual ( dummyMetrics ) ;
67+
68+ jest . advanceTimersByTime ( testInterval ) ;
69+ expect ( mockOpsCollector . collect ) . toHaveBeenCalledTimes ( 2 ) ;
70+
71+ jest . advanceTimersByTime ( testInterval ) ;
72+ expect ( mockOpsCollector . collect ) . toHaveBeenCalledTimes ( 3 ) ;
7573 } ) ;
7674
77- it ( 'collects the metrics at every interval ' , async ( ) => {
75+ it ( 'resets the collector after each collection ' , async ( ) => {
7876 mockOpsCollector . collect . mockResolvedValue ( dummyMetrics ) ;
7977
80- await metricsService . setup ( { http : httpMock } ) ;
81-
78+ const { getOpsMetrics$ } = await metricsService . setup ( { http : httpMock } ) ;
8279 await metricsService . start ( ) ;
8380
81+ // `advanceTimersByTime` only ensure the interval handler is executed
82+ // however the `reset` call is executed after the async call to `collect`
83+ // meaning that we are going to miss the call if we don't wait for the
84+ // actual observable emission that is performed after
85+ const waitForNextEmission = ( ) =>
86+ getOpsMetrics$ ( )
87+ . pipe ( take ( 1 ) )
88+ . toPromise ( ) ;
89+
8490 expect ( mockOpsCollector . collect ) . toHaveBeenCalledTimes ( 1 ) ;
91+ expect ( mockOpsCollector . reset ) . toHaveBeenCalledTimes ( 1 ) ;
8592
93+ let nextEmission = waitForNextEmission ( ) ;
8694 jest . advanceTimersByTime ( testInterval ) ;
95+ await nextEmission ;
8796 expect ( mockOpsCollector . collect ) . toHaveBeenCalledTimes ( 2 ) ;
97+ expect ( mockOpsCollector . reset ) . toHaveBeenCalledTimes ( 2 ) ;
8898
99+ nextEmission = waitForNextEmission ( ) ;
89100 jest . advanceTimersByTime ( testInterval ) ;
101+ await nextEmission ;
90102 expect ( mockOpsCollector . collect ) . toHaveBeenCalledTimes ( 3 ) ;
103+ expect ( mockOpsCollector . reset ) . toHaveBeenCalledTimes ( 3 ) ;
91104 } ) ;
92105
93106 it ( 'throws when called before setup' , async ( ) => {
0 commit comments