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