@@ -544,6 +544,84 @@ describe('ParseObject', () => {
544
544
expect ( o2 . attributes ) . toEqual ( { } ) ;
545
545
} ) ;
546
546
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
+
547
625
it ( 'can clear all fields' , ( ) => {
548
626
const o = new ParseObject ( 'Person' ) ;
549
627
o . _finishFetch ( {
0 commit comments