@@ -82,9 +82,21 @@ const mockLocalStorageController = {
8282 clear : jest . fn ( ) ,
8383} ;
8484jest . 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+
8596const CoreManager = require ( '../CoreManager' ) ;
8697const LocalDatastore = require ( '../LocalDatastore' ) ;
8798const ParseObject = require ( '../ParseObject' ) ;
99+ const ParseQuery = require ( '../ParseQuery' ) ;
88100const RNDatastoreController = require ( '../LocalDatastoreController.react-native' ) ;
89101const BrowserDatastoreController = require ( '../LocalDatastoreController.browser' ) ;
90102const DefaultDatastoreController = require ( '../LocalDatastoreController.default' ) ;
@@ -572,6 +584,139 @@ describe('LocalDatastore', () => {
572584 LocalDatastore . _traverse ( object , encountered ) ;
573585 expect ( encountered ) . toEqual ( { 'Item_1234' : object } ) ;
574586 } ) ;
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+ } ) ;
575720} ) ;
576721
577722describe ( 'BrowserDatastoreController' , async ( ) => {
0 commit comments