@@ -544,6 +544,84 @@ describe('ParseObject', () => {
544544 expect ( o2 . attributes ) . toEqual ( { } ) ;
545545 } ) ;
546546
547+ it ( 'can set sub property of a local changed object without creating an op' , ( ) => {
548+ const o = new ParseObject ( 'Person' ) ;
549+ o . set ( 'data' , { a : 2 } ) ;
550+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
551+
552+ o . set ( 'datab' , { v : 2 } ) ;
553+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 2 ) ;
554+
555+ o . set ( 'data.b' , 3 ) ;
556+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 2 ) ;
557+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data' ] . _value ) . toStrictEqual ( { a : 2 , b : 3 } ) ;
558+
559+ o . set ( { "data.c" : 5 , "data.d.a" : 4 } ) ;
560+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 2 ) ;
561+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data' ] . _value ) . toStrictEqual ( { a : 2 , b : 3 , c : 5 , d : { a : 4 } } ) ;
562+ } ) ;
563+
564+ it ( 'can unset sub property of a local changed object without creating an op' , ( ) => {
565+ const o = new ParseObject ( 'Person' ) ;
566+ o . set ( 'data' , { a : 2 , b : 4 } ) ;
567+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
568+
569+ o . unset ( 'data.b' ) ;
570+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
571+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data' ] . _value ) . toStrictEqual ( { a : 2 } ) ;
572+
573+ o . unset ( 'data.c' ) ;
574+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
575+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data' ] . _value ) . toStrictEqual ( { a : 2 } ) ;
576+
577+ o . unset ( 'data.c.d' ) ;
578+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
579+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data' ] . _value ) . toStrictEqual ( { a : 2 } ) ;
580+
581+ o . set ( 'data.b.c' , 3 ) ;
582+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
583+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data' ] . _value ) . toStrictEqual ( { a : 2 , b : { c : 3 } } ) ;
584+
585+ o . unset ( 'data.b.c' ) ;
586+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
587+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data' ] . _value ) . toStrictEqual ( { a : 2 , b : { } } ) ;
588+
589+ o . unset ( 'data.b' ) ;
590+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
591+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data' ] . _value ) . toStrictEqual ( { a : 2 } ) ;
592+ } ) ;
593+
594+ it ( 'can increment sub property of a local changed object without creating an op' , ( ) => {
595+ const o = new ParseObject ( 'Person' ) ;
596+ o . set ( 'data' , { a : 2 , b : 4 } ) ;
597+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
598+
599+ o . increment ( 'data.a' , 3 ) ;
600+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
601+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data' ] . _value ) . toStrictEqual ( { a : 5 , b : 4 } ) ;
602+ } ) ;
603+
604+ it ( 'collapse sub-property sets with parents as well' , ( ) => {
605+ const o = new ParseObject ( 'Person' ) ;
606+ o . _finishFetch ( {
607+ objectId : 'o12312' ,
608+ data : { a : 3 }
609+ } ) ;
610+ expect ( o . dirty ( ) ) . toBe ( false ) ;
611+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 0 ) ;
612+
613+ o . set ( 'data.b' , { c : 1 } ) ;
614+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 1 ) ;
615+
616+ o . set ( 'data.boo' , 4 ) ;
617+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 2 ) ;
618+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data.boo' ] . _value ) . toStrictEqual ( 4 ) ;
619+
620+ o . set ( 'data.b.c' , 2 ) ;
621+ expect ( Object . keys ( o . _getPendingOps ( ) [ 0 ] ) . length ) . toBe ( 2 ) ;
622+ expect ( o . _getPendingOps ( ) [ 0 ] [ 'data.b' ] . _value ) . toStrictEqual ( { c : 2 } ) ;
623+ } ) ;
624+
547625 it ( 'can clear all fields' , ( ) => {
548626 const o = new ParseObject ( 'Person' ) ;
549627 o . _finishFetch ( {
0 commit comments