@@ -82,9 +82,21 @@ const mockLocalStorageController = {
82
82
clear : jest . fn ( ) ,
83
83
} ;
84
84
jest . setMock ( '../ParseObject' , MockObject ) ;
85
+
86
+ const mockQueryFind = jest . fn ( ) ;
87
+ jest . mock ( '../ParseQuery' , ( ) => {
88
+ return jest . fn ( ) . mockImplementation ( function ( ) {
89
+ this . equalTo = jest . fn ( ) ;
90
+ this . containedIn = jest . fn ( ) ;
91
+ this . limit = jest . fn ( ) ;
92
+ this . find = mockQueryFind ;
93
+ } ) ;
94
+ } ) ;
95
+
85
96
const CoreManager = require ( '../CoreManager' ) ;
86
97
const LocalDatastore = require ( '../LocalDatastore' ) ;
87
98
const ParseObject = require ( '../ParseObject' ) ;
99
+ const ParseQuery = require ( '../ParseQuery' ) ;
88
100
const RNDatastoreController = require ( '../LocalDatastoreController.react-native' ) ;
89
101
const BrowserDatastoreController = require ( '../LocalDatastoreController.browser' ) ;
90
102
const DefaultDatastoreController = require ( '../LocalDatastoreController.default' ) ;
@@ -572,6 +584,139 @@ describe('LocalDatastore', () => {
572
584
LocalDatastore . _traverse ( object , encountered ) ;
573
585
expect ( encountered ) . toEqual ( { 'Item_1234' : object } ) ;
574
586
} ) ;
587
+
588
+ it ( 'do not sync if disabled' , async ( ) => {
589
+ LocalDatastore . isEnabled = false ;
590
+ jest . spyOn ( mockLocalStorageController , 'getAllContents' ) ;
591
+
592
+ await LocalDatastore . updateFromServer ( ) ;
593
+ expect ( LocalDatastore . isSyncing ) . toBe ( false ) ;
594
+ expect ( mockLocalStorageController . getAllContents ) . toHaveBeenCalledTimes ( 0 ) ;
595
+ } ) ;
596
+
597
+ it ( 'do not sync if syncing' , async ( ) => {
598
+ LocalDatastore . isEnabled = true ;
599
+ LocalDatastore . isSyncing = true ;
600
+
601
+ jest . spyOn ( mockLocalStorageController , 'getAllContents' ) ;
602
+ await LocalDatastore . updateFromServer ( ) ;
603
+
604
+ expect ( LocalDatastore . isSyncing ) . toBe ( true ) ;
605
+ expect ( mockLocalStorageController . getAllContents ) . toHaveBeenCalledTimes ( 0 ) ;
606
+ } ) ;
607
+
608
+ it ( 'updateFromServer empty LDS' , async ( ) => {
609
+ LocalDatastore . isEnabled = true ;
610
+ LocalDatastore . isSyncing = false ;
611
+ const LDS = { } ;
612
+
613
+ mockLocalStorageController
614
+ . getAllContents
615
+ . mockImplementationOnce ( ( ) => LDS ) ;
616
+
617
+ jest . spyOn ( mockLocalStorageController , 'pinWithName' ) ;
618
+ await LocalDatastore . updateFromServer ( ) ;
619
+
620
+ expect ( mockLocalStorageController . pinWithName ) . toHaveBeenCalledTimes ( 0 ) ;
621
+ } ) ;
622
+
623
+ it ( 'updateFromServer on one object' , async ( ) => {
624
+ LocalDatastore . isEnabled = true ;
625
+ LocalDatastore . isSyncing = false ;
626
+ const object = new ParseObject ( 'Item' ) ;
627
+ const LDS = {
628
+ [ `Item_${ object . id } ` ] : object . _toFullJSON ( ) ,
629
+ [ `${ LocalDatastore . PIN_PREFIX } _testPinName` ] : [ `Item_${ object . id } ` ] ,
630
+ [ LocalDatastore . DEFAULT_PIN ] : [ `Item_${ object . id } ` ] ,
631
+ } ;
632
+
633
+ mockLocalStorageController
634
+ . getAllContents
635
+ . mockImplementationOnce ( ( ) => LDS ) ;
636
+
637
+ object . set ( 'updatedField' , 'foo' ) ;
638
+ mockQueryFind . mockImplementationOnce ( ( ) => Promise . resolve ( [ object ] ) ) ;
639
+
640
+ await LocalDatastore . updateFromServer ( ) ;
641
+
642
+ expect ( mockLocalStorageController . getAllContents ) . toHaveBeenCalledTimes ( 1 ) ;
643
+ expect ( ParseQuery ) . toHaveBeenCalledTimes ( 1 ) ;
644
+ const mockQueryInstance = ParseQuery . mock . instances [ 0 ] ;
645
+
646
+ expect ( mockQueryInstance . equalTo . mock . calls . length ) . toBe ( 1 ) ;
647
+ expect ( mockQueryFind ) . toHaveBeenCalledTimes ( 1 ) ;
648
+ expect ( mockLocalStorageController . pinWithName ) . toHaveBeenCalledTimes ( 1 ) ;
649
+ } ) ;
650
+
651
+ it ( 'updateFromServer handle error' , async ( ) => {
652
+ LocalDatastore . isEnabled = true ;
653
+ LocalDatastore . isSyncing = false ;
654
+ const object = new ParseObject ( 'Item' ) ;
655
+ const LDS = {
656
+ [ `Item_${ object . id } ` ] : object . _toFullJSON ( ) ,
657
+ [ `${ LocalDatastore . PIN_PREFIX } _testPinName` ] : [ `Item_${ object . id } ` ] ,
658
+ [ LocalDatastore . DEFAULT_PIN ] : [ `Item_${ object . id } ` ] ,
659
+ } ;
660
+
661
+ mockLocalStorageController
662
+ . getAllContents
663
+ . mockImplementationOnce ( ( ) => LDS ) ;
664
+
665
+ object . set ( 'updatedField' , 'foo' ) ;
666
+ mockQueryFind . mockImplementationOnce ( ( ) => {
667
+ expect ( LocalDatastore . isSyncing ) . toBe ( true ) ;
668
+ return Promise . reject ( 'Unable to connect to the Parse API' )
669
+ } ) ;
670
+
671
+ jest . spyOn ( console , 'log' ) ;
672
+ await LocalDatastore . updateFromServer ( ) ;
673
+
674
+ expect ( mockLocalStorageController . getAllContents ) . toHaveBeenCalledTimes ( 1 ) ;
675
+ expect ( ParseQuery ) . toHaveBeenCalledTimes ( 1 ) ;
676
+ const mockQueryInstance = ParseQuery . mock . instances [ 0 ] ;
677
+
678
+ expect ( mockQueryInstance . equalTo . mock . calls . length ) . toBe ( 1 ) ;
679
+ expect ( mockQueryFind ) . toHaveBeenCalledTimes ( 1 ) ;
680
+ expect ( mockLocalStorageController . pinWithName ) . toHaveBeenCalledTimes ( 0 ) ;
681
+ expect ( console . log ) . toHaveBeenCalledTimes ( 2 ) ;
682
+ expect ( LocalDatastore . isSyncing ) . toBe ( false ) ;
683
+ } ) ;
684
+
685
+ it ( 'updateFromServer on mixed object' , async ( ) => {
686
+ LocalDatastore . isEnabled = true ;
687
+ LocalDatastore . isSyncing = false ;
688
+ const obj1 = new ParseObject ( 'Item' ) ;
689
+ const obj2 = new ParseObject ( 'Item' ) ;
690
+ const obj3 = new ParseObject ( 'TestObject' ) ;
691
+ const LDS = {
692
+ [ `Item_${ obj1 . id } ` ] : obj1 . _toFullJSON ( ) ,
693
+ [ `Item_${ obj2 . id } ` ] : obj2 . _toFullJSON ( ) ,
694
+ [ `TestObject_${ obj3 . id } ` ] : obj3 . _toFullJSON ( ) ,
695
+ [ `${ LocalDatastore . PIN_PREFIX } _testPinName` ] : [ `Item_${ obj1 . id } ` ] ,
696
+ [ LocalDatastore . DEFAULT_PIN ] : [ `Item_${ obj1 . id } ` ] ,
697
+ } ;
698
+
699
+ mockLocalStorageController
700
+ . getAllContents
701
+ . mockImplementationOnce ( ( ) => LDS ) ;
702
+
703
+ mockQueryFind
704
+ . mockImplementationOnce ( ( ) => Promise . resolve ( [ obj1 , obj2 ] ) )
705
+ . mockImplementationOnce ( ( ) => Promise . resolve ( [ obj3 ] ) ) ;
706
+
707
+ await LocalDatastore . updateFromServer ( ) ;
708
+
709
+ expect ( mockLocalStorageController . getAllContents ) . toHaveBeenCalledTimes ( 1 ) ;
710
+ expect ( ParseQuery ) . toHaveBeenCalledTimes ( 2 ) ;
711
+
712
+ const mockQueryInstance1 = ParseQuery . mock . instances [ 0 ] ;
713
+ const mockQueryInstance2 = ParseQuery . mock . instances [ 1 ] ;
714
+
715
+ expect ( mockQueryInstance1 . containedIn . mock . calls . length ) . toBe ( 1 ) ;
716
+ expect ( mockQueryInstance2 . equalTo . mock . calls . length ) . toBe ( 1 ) ;
717
+ expect ( mockQueryFind ) . toHaveBeenCalledTimes ( 2 ) ;
718
+ expect ( mockLocalStorageController . pinWithName ) . toHaveBeenCalledTimes ( 3 ) ;
719
+ } ) ;
575
720
} ) ;
576
721
577
722
describe ( 'BrowserDatastoreController' , async ( ) => {
0 commit comments