@@ -115,6 +115,21 @@ describe('SSE Lifecycle', () => {
115
115
sse . xhr . trigger ( 'abort' , { } ) ;
116
116
expect ( sse . readyState ) . toBe ( sse . CLOSED ) ;
117
117
} ) ;
118
+
119
+ it ( 'should sent Last-Event-ID on reconnection' , ( ) => {
120
+ sse . stream ( ) ;
121
+ expect ( sse . xhr . setRequestHeader ) . toHaveBeenCalledTimes ( 0 ) ;
122
+ sse . xhr . responseText = 'id: event-1\ndata: Test message\n\n' ;
123
+ sse . xhr . trigger ( 'progress' , { } ) ;
124
+ expect ( sse . lastEventId ) . toBe ( 'event-1' ) ;
125
+
126
+ sse . xhr . trigger ( 'abort' , { } ) ;
127
+ expect ( sse . readyState ) . toBe ( sse . CLOSED ) ;
128
+ expect ( sse . lastEventId ) . toBe ( 'event-1' ) ;
129
+
130
+ sse . stream ( ) ;
131
+ expect ( sse . xhr . setRequestHeader ) . toHaveBeenCalledWith ( 'Last-Event-ID' , 'event-1' ) ;
132
+ } ) ;
118
133
} ) ;
119
134
120
135
describe ( 'SSE Event handling and Listeners' , ( ) => {
@@ -147,22 +162,71 @@ describe('SSE Event handling and Listeners', () => {
147
162
expect ( listener ) . toHaveBeenCalledTimes ( 1 ) ;
148
163
expect ( listener . mock . calls [ 0 ] [ 0 ] . data ) . toBe ( 'Test message' ) ;
149
164
expect ( listener . mock . calls [ 0 ] [ 0 ] . event ) . toBe ( undefined ) ;
150
- expect ( listener . mock . calls [ 0 ] [ 0 ] . id ) . toBe ( "1" ) ;
165
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . id ) . toBe ( '1' ) ;
166
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . lastEventId ) . toBe ( '1' ) ;
151
167
} )
152
168
153
169
it ( 'should handle multiple data events' , ( ) => {
154
- sse . xhr . responseText = 'data: First message\n\n' ;
170
+ sse . xhr . responseText = 'id: id1\ndata: First message\n\n' ;
171
+ sse . xhr . trigger ( 'progress' , { } ) ;
172
+ sse . xhr . responseText += 'id: id2\ndata: Second message\n\n' ;
173
+ sse . xhr . trigger ( 'progress' , { } ) ;
174
+
175
+ expect ( listener ) . toHaveBeenCalledTimes ( 2 ) ;
176
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . data ) . toBe ( 'First message' ) ;
177
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . event ) . toBe ( undefined ) ;
178
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . id ) . toBe ( 'id1' ) ;
179
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . lastEventId ) . toBe ( 'id1' ) ;
180
+ expect ( listener . mock . calls [ 1 ] [ 0 ] . data ) . toBe ( 'Second message' ) ;
181
+ expect ( listener . mock . calls [ 1 ] [ 0 ] . event ) . toBe ( undefined ) ;
182
+ expect ( listener . mock . calls [ 1 ] [ 0 ] . id ) . toBe ( 'id2' ) ;
183
+ expect ( listener . mock . calls [ 1 ] [ 0 ] . lastEventId ) . toBe ( 'id2' ) ;
184
+ } ) ;
185
+
186
+ it ( 'should set lastEventId only when id field is in the event' , ( ) => {
187
+ sse . xhr . responseText = 'id: id1\ndata: First message\n\n' ;
155
188
sse . xhr . trigger ( 'progress' , { } ) ;
156
189
sse . xhr . responseText += 'data: Second message\n\n' ;
157
190
sse . xhr . trigger ( 'progress' , { } ) ;
158
191
159
192
expect ( listener ) . toHaveBeenCalledTimes ( 2 ) ;
160
193
expect ( listener . mock . calls [ 0 ] [ 0 ] . data ) . toBe ( 'First message' ) ;
161
194
expect ( listener . mock . calls [ 0 ] [ 0 ] . event ) . toBe ( undefined ) ;
162
- expect ( listener . mock . calls [ 0 ] [ 0 ] . id ) . toBe ( null ) ;
195
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . id ) . toBe ( 'id1' ) ;
196
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . lastEventId ) . toBe ( 'id1' ) ;
163
197
expect ( listener . mock . calls [ 1 ] [ 0 ] . data ) . toBe ( 'Second message' ) ;
164
198
expect ( listener . mock . calls [ 1 ] [ 0 ] . event ) . toBe ( undefined ) ;
165
199
expect ( listener . mock . calls [ 1 ] [ 0 ] . id ) . toBe ( null ) ;
200
+ expect ( listener . mock . calls [ 1 ] [ 0 ] . lastEventId ) . toBe ( 'id1' ) ;
201
+ } ) ;
202
+
203
+ it ( 'should reset lastEventId when id is empty' , ( ) => {
204
+ sse . xhr . responseText = 'data: First message\n\n' ;
205
+ sse . xhr . trigger ( 'progress' , { } ) ;
206
+ sse . xhr . responseText += 'data: Second message\nid: id2\n\n' ;
207
+ sse . xhr . trigger ( 'progress' , { } ) ;
208
+ sse . xhr . responseText += 'data: Third message\n\n' ;
209
+ sse . xhr . trigger ( 'progress' , { } ) ;
210
+ sse . xhr . responseText += 'data: Fourth message\nid\n\n' ;
211
+ sse . xhr . trigger ( 'progress' , { } ) ;
212
+
213
+ expect ( listener ) . toHaveBeenCalledTimes ( 4 ) ;
214
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . data ) . toBe ( 'First message' ) ;
215
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . event ) . toBe ( undefined ) ;
216
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . id ) . toBe ( null ) ;
217
+ expect ( listener . mock . calls [ 0 ] [ 0 ] . lastEventId ) . toBe ( '' ) ;
218
+ expect ( listener . mock . calls [ 1 ] [ 0 ] . data ) . toBe ( 'Second message' ) ;
219
+ expect ( listener . mock . calls [ 1 ] [ 0 ] . event ) . toBe ( undefined ) ;
220
+ expect ( listener . mock . calls [ 1 ] [ 0 ] . id ) . toBe ( 'id2' ) ;
221
+ expect ( listener . mock . calls [ 1 ] [ 0 ] . lastEventId ) . toBe ( 'id2' ) ;
222
+ expect ( listener . mock . calls [ 2 ] [ 0 ] . data ) . toBe ( 'Third message' ) ;
223
+ expect ( listener . mock . calls [ 2 ] [ 0 ] . event ) . toBe ( undefined ) ;
224
+ expect ( listener . mock . calls [ 2 ] [ 0 ] . id ) . toBe ( null ) ;
225
+ expect ( listener . mock . calls [ 2 ] [ 0 ] . lastEventId ) . toBe ( 'id2' ) ;
226
+ expect ( listener . mock . calls [ 3 ] [ 0 ] . data ) . toBe ( 'Fourth message' ) ;
227
+ expect ( listener . mock . calls [ 3 ] [ 0 ] . event ) . toBe ( undefined ) ;
228
+ expect ( listener . mock . calls [ 3 ] [ 0 ] . id ) . toBe ( '' ) ;
229
+ expect ( listener . mock . calls [ 3 ] [ 0 ] . lastEventId ) . toBe ( '' ) ;
166
230
} ) ;
167
231
168
232
it ( 'should handle repeat data elements' , ( ) => {
0 commit comments