@@ -228,7 +228,7 @@ describe('PushWorker', () => {
228228 } ,
229229 response : { error : 'invalid error...' }
230230 }
231- ] , true ) ;
231+ ] , undefined , true ) ;
232232 expect ( spy ) . toHaveBeenCalled ( ) ;
233233 expect ( spy . calls . count ( ) ) . toBe ( 1 ) ;
234234 const lastCall = spy . calls . mostRecent ( ) ;
@@ -241,5 +241,137 @@ describe('PushWorker', () => {
241241 } ) ;
242242 done ( ) ;
243243 } ) ;
244+
245+ it ( 'tracks push status per UTC offsets' , ( done ) => {
246+ const config = new Config ( 'test' ) ;
247+ const handler = pushStatusHandler ( config , 'ABCDEF1234' ) ;
248+ const spy = spyOn ( config . database , "update" ) . and . callThrough ( ) ;
249+ const UTCOffset = 1 ;
250+ handler . setInitial ( ) . then ( ( ) => {
251+ return handler . trackSent ( [
252+ {
253+ transmitted : false ,
254+ device : {
255+ deviceToken : 1 ,
256+ deviceType : 'ios' ,
257+ } ,
258+ } ,
259+ {
260+ transmitted : true ,
261+ device : {
262+ deviceToken : 1 ,
263+ deviceType : 'ios' ,
264+ }
265+ } ,
266+ ] , UTCOffset )
267+ } ) . then ( ( ) => {
268+ expect ( spy ) . toHaveBeenCalled ( ) ;
269+ expect ( spy . calls . count ( ) ) . toBe ( 1 ) ;
270+ const lastCall = spy . calls . mostRecent ( ) ;
271+ expect ( lastCall . args [ 0 ] ) . toBe ( '_PushStatus' ) ;
272+ const updatePayload = lastCall . args [ 2 ] ;
273+ expect ( updatePayload . updatedAt instanceof Date ) . toBeTruthy ( ) ;
274+ // remove the updatedAt as not testable
275+ delete updatePayload . updatedAt ;
276+
277+ expect ( lastCall . args [ 2 ] ) . toEqual ( {
278+ numSent : { __op : 'Increment' , amount : 1 } ,
279+ numFailed : { __op : 'Increment' , amount : 1 } ,
280+ 'sentPerType.ios' : { __op : 'Increment' , amount : 1 } ,
281+ 'failedPerType.ios' : { __op : 'Increment' , amount : 1 } ,
282+ [ `sentPerUTCOffset.${ UTCOffset } ` ] : { __op : 'Increment' , amount : 1 } ,
283+ [ `failedPerUTCOffset.${ UTCOffset } ` ] : { __op : 'Increment' , amount : 1 } ,
284+ count : { __op : 'Increment' , amount : - 2 } ,
285+ } ) ;
286+ const query = new Parse . Query ( '_PushStatus' ) ;
287+ return query . get ( 'ABCDEF1234' , { useMasterKey : true } ) ;
288+ } ) . then ( ( pushStatus ) => {
289+ const sentPerUTCOffset = pushStatus . get ( 'sentPerUTCOffset' ) ;
290+ expect ( sentPerUTCOffset [ '1' ] ) . toBe ( 1 ) ;
291+ const failedPerUTCOffset = pushStatus . get ( 'failedPerUTCOffset' ) ;
292+ expect ( failedPerUTCOffset [ '1' ] ) . toBe ( 1 ) ;
293+ return handler . trackSent ( [
294+ {
295+ transmitted : false ,
296+ device : {
297+ deviceToken : 1 ,
298+ deviceType : 'ios' ,
299+ } ,
300+ } ,
301+ {
302+ transmitted : true ,
303+ device : {
304+ deviceToken : 1 ,
305+ deviceType : 'ios' ,
306+ }
307+ } ,
308+ {
309+ transmitted : true ,
310+ device : {
311+ deviceToken : 1 ,
312+ deviceType : 'ios' ,
313+ }
314+ } ,
315+ ] , UTCOffset )
316+ } ) . then ( ( ) => {
317+ const query = new Parse . Query ( '_PushStatus' ) ;
318+ return query . get ( 'ABCDEF1234' , { useMasterKey : true } ) ;
319+ } ) . then ( ( pushStatus ) => {
320+ const sentPerUTCOffset = pushStatus . get ( 'sentPerUTCOffset' ) ;
321+ expect ( sentPerUTCOffset [ '1' ] ) . toBe ( 3 ) ;
322+ const failedPerUTCOffset = pushStatus . get ( 'failedPerUTCOffset' ) ;
323+ expect ( failedPerUTCOffset [ '1' ] ) . toBe ( 2 ) ;
324+ } ) . then ( done ) . catch ( done . fail ) ;
325+ } ) ;
326+
327+ it ( 'tracks push status per UTC offsets with negative offsets' , ( done ) => {
328+ const config = new Config ( 'test' ) ;
329+ const handler = pushStatusHandler ( config ) ;
330+ spyOn ( config . database , "create" ) . and . callFake ( ( ) => {
331+ return Promise . resolve ( ) ;
332+ } ) ;
333+ const spy = spyOn ( config . database , "update" ) . and . callFake ( ( ) => {
334+ return Promise . resolve ( ) ;
335+ } ) ;
336+ const UTCOffset = - 6 ;
337+ handler . trackSent ( [
338+ {
339+ transmitted : false ,
340+ device : {
341+ deviceToken : 1 ,
342+ deviceType : 'ios' ,
343+ } ,
344+ response : { error : 'Unregistered' }
345+ } ,
346+ {
347+ transmitted : true ,
348+ device : {
349+ deviceToken : 1 ,
350+ deviceType : 'ios' ,
351+ } ,
352+ response : { error : 'Unregistered' }
353+ } ,
354+ ] , UTCOffset ) . then ( ( ) => {
355+ expect ( spy ) . toHaveBeenCalled ( ) ;
356+ expect ( spy . calls . count ( ) ) . toBe ( 1 ) ;
357+ const lastCall = spy . calls . mostRecent ( ) ;
358+ expect ( lastCall . args [ 0 ] ) . toBe ( '_PushStatus' ) ;
359+ const updatePayload = lastCall . args [ 2 ] ;
360+ expect ( updatePayload . updatedAt instanceof Date ) . toBeTruthy ( ) ;
361+ // remove the updatedAt as not testable
362+ delete updatePayload . updatedAt ;
363+
364+ expect ( lastCall . args [ 2 ] ) . toEqual ( {
365+ numSent : { __op : 'Increment' , amount : 1 } ,
366+ numFailed : { __op : 'Increment' , amount : 1 } ,
367+ 'sentPerType.ios' : { __op : 'Increment' , amount : 1 } ,
368+ 'failedPerType.ios' : { __op : 'Increment' , amount : 1 } ,
369+ [ `sentPerUTCOffset.${ UTCOffset } ` ] : { __op : 'Increment' , amount : 1 } ,
370+ [ `failedPerUTCOffset.${ UTCOffset } ` ] : { __op : 'Increment' , amount : 1 } ,
371+ count : { __op : 'Increment' , amount : - 2 } ,
372+ } ) ;
373+ done ( ) ;
374+ } ) ;
375+ } ) ;
244376 } ) ;
245377} ) ;
0 commit comments