@@ -57,6 +57,48 @@ it('it sets basis to false when intent code is xfer-changes', () => {
5757 expect ( receivedPayloads [ 0 ] . basis ) . toEqual ( false ) ;
5858} ) ;
5959
60+ it ( 'it handles xfer-full then xfer-changes' , ( ) => {
61+ const mockStream = new MockEventStream ( ) ;
62+ const receivedPayloads : Payload [ ] = [ ] ;
63+ const readerUnderTest = new PayloadReader ( mockStream , {
64+ mockKind : ( it ) => it , // obj processor that just returns the same obj
65+ } ) ;
66+ readerUnderTest . addPayloadListener ( ( it ) => {
67+ receivedPayloads . push ( it ) ;
68+ } ) ;
69+
70+ mockStream . simulateEvent ( 'server-intent' , {
71+ data : '{"payloads": [{"code": "xfer-full", "id": "mockId"}]}' ,
72+ } ) ;
73+ mockStream . simulateEvent ( 'put-object' , {
74+ data : '{"kind": "mockKind", "key": "flagA", "version": 123, "object": {"objectFieldA": "objectValueA"}}' ,
75+ } ) ;
76+ mockStream . simulateEvent ( 'payload-transferred' , {
77+ data : '{"state": "mockState", "version": 1}' ,
78+ } ) ;
79+
80+ mockStream . simulateEvent ( 'put-object' , {
81+ data : '{"kind": "mockKind", "key": "flagA", "version": 456, "object": {"objectFieldA": "newValue"}}' ,
82+ } ) ;
83+ mockStream . simulateEvent ( 'payload-transferred' , {
84+ data : '{"state": "mockState", "version": 1}' ,
85+ } ) ;
86+ expect ( receivedPayloads . length ) . toEqual ( 2 ) ;
87+ expect ( receivedPayloads [ 0 ] . id ) . toEqual ( 'mockId' ) ;
88+ expect ( receivedPayloads [ 0 ] . state ) . toEqual ( 'mockState' ) ;
89+ expect ( receivedPayloads [ 0 ] . basis ) . toEqual ( true ) ;
90+ expect ( receivedPayloads [ 0 ] . updates . length ) . toEqual ( 1 ) ;
91+ expect ( receivedPayloads [ 0 ] . updates [ 0 ] . object ) . toEqual ( { objectFieldA : 'objectValueA' } ) ;
92+ expect ( receivedPayloads [ 0 ] . updates [ 0 ] . deleted ) . toEqual ( undefined ) ;
93+
94+ expect ( receivedPayloads [ 1 ] . id ) . toEqual ( 'mockId' ) ;
95+ expect ( receivedPayloads [ 1 ] . state ) . toEqual ( 'mockState' ) ;
96+ expect ( receivedPayloads [ 1 ] . basis ) . toEqual ( false ) ;
97+ expect ( receivedPayloads [ 1 ] . updates . length ) . toEqual ( 1 ) ;
98+ expect ( receivedPayloads [ 1 ] . updates [ 0 ] . object ) . toEqual ( { objectFieldA : 'newValue' } ) ;
99+ expect ( receivedPayloads [ 1 ] . updates [ 0 ] . deleted ) . toEqual ( undefined ) ;
100+ } ) ;
101+
60102it ( 'it includes multiple types of updates in payload' , ( ) => {
61103 const mockStream = new MockEventStream ( ) ;
62104 const receivedPayloads : Payload [ ] = [ ] ;
@@ -183,12 +225,15 @@ it('logs prescribed message when error event is encountered', () => {
183225 mockStream . simulateEvent ( 'error' , {
184226 data : '{"reason": "Womp womp"}' ,
185227 } ) ;
228+ mockStream . simulateEvent ( 'put-object' , {
229+ data : '{"kind": "mockKind", "key": "flagB", "version": 123, "object": {"objectFieldB": "objectValueB"}}' ,
230+ } ) ;
186231 mockStream . simulateEvent ( 'payload-transferred' , {
187232 data : '{"state": "mockState", "version": 1}' ,
188233 } ) ;
189- expect ( receivedPayloads . length ) . toEqual ( 0 ) ;
234+ expect ( receivedPayloads . length ) . toEqual ( 1 ) ;
190235 expect ( mockLogger . info ) . toHaveBeenCalledWith (
191- 'An issue was encountered receiving updates for payload mockId with reason: Womp womp. Automatic retry will occur. ' ,
236+ 'An issue was encountered receiving updates for payload mockId with reason: Womp womp.' ,
192237 ) ;
193238} ) ;
194239
@@ -222,6 +267,9 @@ it('discards partially transferred data when an error is encountered', () => {
222267 mockStream . simulateEvent ( 'error' , {
223268 data : '{"reason": "Womp womp"}' ,
224269 } ) ;
270+ mockStream . simulateEvent ( 'put-object' , {
271+ data : '{"kind": "mockKind", "key": "flagB", "version": 123, "object": {"objectFieldB": "objectValueB"}}' ,
272+ } ) ;
225273 mockStream . simulateEvent ( 'payload-transferred' , {
226274 data : '{"state": "mockState", "version": 1}' ,
227275 } ) ;
@@ -240,17 +288,23 @@ it('discards partially transferred data when an error is encountered', () => {
240288 mockStream . simulateEvent ( 'payload-transferred' , {
241289 data : '{"state": "mockState2", "version": 1}' ,
242290 } ) ;
243- expect ( receivedPayloads . length ) . toEqual ( 1 ) ;
244- expect ( receivedPayloads [ 0 ] . id ) . toEqual ( 'mockId2 ' ) ;
245- expect ( receivedPayloads [ 0 ] . state ) . toEqual ( 'mockState2 ' ) ;
291+ expect ( receivedPayloads . length ) . toEqual ( 2 ) ;
292+ expect ( receivedPayloads [ 0 ] . id ) . toEqual ( 'mockId ' ) ;
293+ expect ( receivedPayloads [ 0 ] . state ) . toEqual ( 'mockState ' ) ;
246294 expect ( receivedPayloads [ 0 ] . basis ) . toEqual ( true ) ;
247- expect ( receivedPayloads [ 0 ] . updates . length ) . toEqual ( 3 ) ;
248- expect ( receivedPayloads [ 0 ] . updates [ 0 ] . object ) . toEqual ( { objectFieldX : 'objectValueX ' } ) ;
295+ expect ( receivedPayloads [ 0 ] . updates . length ) . toEqual ( 1 ) ;
296+ expect ( receivedPayloads [ 0 ] . updates [ 0 ] . object ) . toEqual ( { objectFieldB : 'objectValueB ' } ) ;
249297 expect ( receivedPayloads [ 0 ] . updates [ 0 ] . deleted ) . toEqual ( undefined ) ;
250- expect ( receivedPayloads [ 0 ] . updates [ 1 ] . object ) . toEqual ( undefined ) ;
251- expect ( receivedPayloads [ 0 ] . updates [ 1 ] . deleted ) . toEqual ( true ) ;
252- expect ( receivedPayloads [ 0 ] . updates [ 2 ] . object ) . toEqual ( { objectFieldZ : 'objectValueZ' } ) ;
253- expect ( receivedPayloads [ 0 ] . updates [ 2 ] . deleted ) . toEqual ( undefined ) ;
298+ expect ( receivedPayloads [ 1 ] . id ) . toEqual ( 'mockId2' ) ;
299+ expect ( receivedPayloads [ 1 ] . state ) . toEqual ( 'mockState2' ) ;
300+ expect ( receivedPayloads [ 1 ] . basis ) . toEqual ( true ) ;
301+ expect ( receivedPayloads [ 1 ] . updates . length ) . toEqual ( 3 ) ;
302+ expect ( receivedPayloads [ 1 ] . updates [ 0 ] . object ) . toEqual ( { objectFieldX : 'objectValueX' } ) ;
303+ expect ( receivedPayloads [ 1 ] . updates [ 0 ] . deleted ) . toEqual ( undefined ) ;
304+ expect ( receivedPayloads [ 1 ] . updates [ 1 ] . object ) . toEqual ( undefined ) ;
305+ expect ( receivedPayloads [ 1 ] . updates [ 1 ] . deleted ) . toEqual ( true ) ;
306+ expect ( receivedPayloads [ 1 ] . updates [ 2 ] . object ) . toEqual ( { objectFieldZ : 'objectValueZ' } ) ;
307+ expect ( receivedPayloads [ 1 ] . updates [ 2 ] . deleted ) . toEqual ( undefined ) ;
254308} ) ;
255309
256310it ( 'silently ignores unrecognized kinds' , ( ) => {
0 commit comments