11import chai from 'chai'
22import EventEmitter from 'events'
3- import sinon from 'sinon'
3+ import Sinon from 'sinon'
44import sinonChai from 'sinon-chai'
55
66import { IWebSocketAdapter } from '../../../src/@types/adapters'
@@ -17,18 +17,16 @@ describe('CountMessageHandler', () => {
1717 let webSocket : IWebSocketAdapter
1818 let handler : CountMessageHandler
1919 let eventRepository : IEventRepository
20- let onMessageStub : sinon . SinonStub
21- let sandbox : sinon . SinonSandbox
20+ let sandbox : Sinon . SinonSandbox
2221
2322 beforeEach ( ( ) => {
24- sandbox = sinon . createSandbox ( )
23+ sandbox = Sinon . createSandbox ( )
24+
2525 eventRepository = {
2626 countByFilters : sandbox . stub ( ) . resolves ( 7 ) ,
2727 } as any
2828
2929 webSocket = new EventEmitter ( ) as any
30- onMessageStub = sandbox . stub ( )
31- webSocket . on ( WebSocketAdapterEvent . Message , onMessageStub )
3230
3331 handler = new CountMessageHandler ( webSocket , eventRepository , ( ) => ( {
3432 limits : {
@@ -47,47 +45,89 @@ describe('CountMessageHandler', () => {
4745 sandbox . restore ( )
4846 } )
4947
50- it ( 'emits COUNT message with count on success' , async ( ) => {
51- const message = [ MessageType . COUNT , 'q1' , { } ] as any
48+ describe ( 'handleMessage()' , ( ) => {
49+ let webSocketOnMessageStub : Sinon . SinonStub
5250
53- await handler . handleMessage ( message )
51+ beforeEach ( ( ) => {
52+ webSocketOnMessageStub = sandbox . stub ( )
53+ webSocket . on ( WebSocketAdapterEvent . Message , webSocketOnMessageStub )
54+ } )
5455
55- expect ( eventRepository . countByFilters ) . to . have . been . calledOnceWithExactly ( [ { } ] )
56- expect ( onMessageStub ) . to . have . been . calledOnceWithExactly ( [ MessageType . COUNT , 'q1' , { count : 7 } ] )
57- } )
56+ it ( 'returns COUNT with the result when counting works' , async ( ) => {
57+ const message = [ MessageType . COUNT , 'q1' , { } ] as any
5858
59- it ( 'emits CLOSED message when request is rejected' , async ( ) => {
60- handler = new CountMessageHandler ( webSocket , eventRepository , ( ) => ( {
61- limits : {
62- client : {
63- subscription : {
64- maxFilters : 1 ,
65- maxSubscriptionIdLength : 256 ,
59+ await handler . handleMessage ( message )
60+
61+ expect ( eventRepository . countByFilters ) . to . have . been . calledOnceWithExactly ( [ { } ] )
62+ expect ( webSocketOnMessageStub ) . to . have . been . calledOnceWithExactly ( [ MessageType . COUNT , 'q1' , { count : 7 } ] )
63+ } )
64+
65+ it ( 'drops duplicate filters before querying the repository' , async ( ) => {
66+ const repeatedFilter = { kinds : [ 1 ] }
67+ const message = [ MessageType . COUNT , 'q1' , repeatedFilter , repeatedFilter ] as any
68+
69+ await handler . handleMessage ( message )
70+
71+ expect ( eventRepository . countByFilters ) . to . have . been . calledOnceWithExactly ( [ repeatedFilter ] )
72+ expect ( webSocketOnMessageStub ) . to . have . been . calledOnceWithExactly ( [ MessageType . COUNT , 'q1' , { count : 7 } ] )
73+ } )
74+
75+ it ( 'returns CLOSED when the request has too many filters' , async ( ) => {
76+ handler = new CountMessageHandler ( webSocket , eventRepository , ( ) => ( {
77+ limits : {
78+ client : {
79+ subscription : {
80+ maxFilters : 1 ,
81+ maxSubscriptionIdLength : 256 ,
82+ } ,
6683 } ,
6784 } ,
68- } ,
69- } ) as Settings )
85+ } ) as Settings )
86+
87+ const message = [ MessageType . COUNT , 'q1' , { kinds : [ 1 ] } , { kinds : [ 2 ] } ] as any
88+
89+ await handler . handleMessage ( message )
90+
91+ expect ( eventRepository . countByFilters ) . to . not . have . been . called
92+ expect ( webSocketOnMessageStub ) . to . have . been . calledOnce
93+ expect ( webSocketOnMessageStub . firstCall . args [ 0 ] [ 0 ] ) . to . equal ( MessageType . CLOSED )
94+ expect ( webSocketOnMessageStub . firstCall . args [ 0 ] [ 1 ] ) . to . equal ( 'q1' )
95+ } )
96+
97+ it ( 'returns CLOSED when the query ID is too long' , async ( ) => {
98+ handler = new CountMessageHandler ( webSocket , eventRepository , ( ) => ( {
99+ limits : {
100+ client : {
101+ subscription : {
102+ maxFilters : 10 ,
103+ maxSubscriptionIdLength : 2 ,
104+ } ,
105+ } ,
106+ } ,
107+ } ) as Settings )
70108
71- const message = [ MessageType . COUNT , 'q1 ' , { kinds : [ 1 ] } , { kinds : [ 2 ] } ] as any
109+ const message = [ MessageType . COUNT , 'q123 ' , { } ] as any
72110
73- await handler . handleMessage ( message )
111+ await handler . handleMessage ( message )
74112
75- expect ( eventRepository . countByFilters ) . to . not . have . been . called
76- expect ( onMessageStub ) . to . have . been . calledOnce
77- expect ( onMessageStub . firstCall . args [ 0 ] [ 0 ] ) . to . equal ( MessageType . CLOSED )
78- expect ( onMessageStub . firstCall . args [ 0 ] [ 1 ] ) . to . equal ( 'q1 ' )
79- } )
113+ expect ( eventRepository . countByFilters ) . to . not . have . been . called
114+ expect ( webSocketOnMessageStub ) . to . have . been . calledOnce
115+ expect ( webSocketOnMessageStub . firstCall . args [ 0 ] [ 0 ] ) . to . equal ( MessageType . CLOSED )
116+ expect ( webSocketOnMessageStub . firstCall . args [ 0 ] [ 1 ] ) . to . equal ( 'q123 ' )
117+ } )
80118
81- it ( 'emits CLOSED message when repository fails' , async ( ) => {
82- ( eventRepository . countByFilters as sinon . SinonStub ) . rejects ( new Error ( 'boom' ) )
83- const message = [ MessageType . COUNT , 'q1' , { } ] as any
119+ it ( 'returns CLOSED when counting fails in the repository' , async ( ) => {
120+ const countByFiltersStub = eventRepository . countByFilters as Sinon . SinonStub
121+ countByFiltersStub . rejects ( new Error ( 'boom' ) )
122+ const message = [ MessageType . COUNT , 'q1' , { } ] as any
84123
85- await handler . handleMessage ( message )
124+ await handler . handleMessage ( message )
86125
87- expect ( onMessageStub ) . to . have . been . calledOnceWithExactly ( [
88- MessageType . CLOSED ,
89- 'q1' ,
90- 'error: unable to count events' ,
91- ] )
126+ expect ( webSocketOnMessageStub ) . to . have . been . calledOnceWithExactly ( [
127+ MessageType . CLOSED ,
128+ 'q1' ,
129+ 'error: unable to count events' ,
130+ ] )
131+ } )
92132 } )
93133} )
0 commit comments