@@ -796,6 +796,86 @@ describe_only_db('mongo')('Read preference option', () => {
796
796
} ) ;
797
797
} ) ;
798
798
799
+ it ( 'should change read preference for `aggregate` using `beforeFind`' , async ( ) => {
800
+ // Save objects
801
+ const obj0 = new Parse . Object ( 'MyObject' ) ;
802
+ obj0 . set ( 'boolKey' , false ) ;
803
+ const obj1 = new Parse . Object ( 'MyObject' ) ;
804
+ obj1 . set ( 'boolKey' , true ) ;
805
+ await Parse . Object . saveAll ( [ obj0 , obj1 ] ) ;
806
+ // Add trigger
807
+ Parse . Cloud . beforeFind ( 'MyObject' , req => {
808
+ req . readPreference = 'SECONDARY' ;
809
+ } ) ;
810
+ // Spy on DB adapter
811
+ const databaseAdapter = Config . get ( Parse . applicationId ) . database . adapter ;
812
+ spyOn ( databaseAdapter . database . serverConfig , 'startSession' ) . and . callThrough ( ) ;
813
+ // Query
814
+ const query = new Parse . Query ( 'MyObject' ) ;
815
+ const results = await query . aggregate ( [ { match :{ boolKey : false } } ] ) ;
816
+ // Validate
817
+ expect ( results . length ) . toBe ( 1 ) ;
818
+ let readPreference = null ;
819
+ databaseAdapter . database . serverConfig . startSession . calls . all ( ) . forEach ( call => {
820
+ if ( call . args [ 0 ] . owner . ns . indexOf ( 'MyObject' ) > - 1 ) {
821
+ readPreference = call . args [ 0 ] . owner . operation . readPreference . mode ;
822
+ }
823
+ } ) ;
824
+ expect ( readPreference ) . toEqual ( ReadPreference . SECONDARY ) ;
825
+ } ) ;
826
+
827
+ it ( 'should change read preference for `find` using query option' , async ( ) => {
828
+ // Save objects
829
+ const obj0 = new Parse . Object ( 'MyObject' ) ;
830
+ obj0 . set ( 'boolKey' , false ) ;
831
+ const obj1 = new Parse . Object ( 'MyObject' ) ;
832
+ obj1 . set ( 'boolKey' , true ) ;
833
+ await Parse . Object . saveAll ( [ obj0 , obj1 ] ) ;
834
+ // Spy on DB adapter
835
+ const databaseAdapter = Config . get ( Parse . applicationId ) . database . adapter ;
836
+ spyOn ( databaseAdapter . database . serverConfig , 'cursor' ) . and . callThrough ( ) ;
837
+ // Query
838
+ const query = new Parse . Query ( 'MyObject' ) ;
839
+ query . equalTo ( 'boolKey' , false ) ;
840
+ query . readPreference ( 'SECONDARY' ) ;
841
+ const results = await query . find ( ) ;
842
+ // Validate
843
+ expect ( results . length ) . toBe ( 1 ) ;
844
+ let myObjectReadPreference = null ;
845
+ databaseAdapter . database . serverConfig . cursor . calls . all ( ) . forEach ( call => {
846
+ if ( call . args [ 0 ] . ns . collection . indexOf ( 'MyObject' ) >= 0 ) {
847
+ myObjectReadPreference =
848
+ call . args [ 0 ] . options . readPreference . mode ;
849
+ }
850
+ } ) ;
851
+ expect ( myObjectReadPreference ) . toEqual ( ReadPreference . SECONDARY ) ;
852
+ } ) ;
853
+
854
+ it ( 'should change read preference for `aggregate` using query option' , async ( ) => {
855
+ // Save objects
856
+ const obj0 = new Parse . Object ( 'MyObject' ) ;
857
+ obj0 . set ( 'boolKey' , false ) ;
858
+ const obj1 = new Parse . Object ( 'MyObject' ) ;
859
+ obj1 . set ( 'boolKey' , true ) ;
860
+ await Parse . Object . saveAll ( [ obj0 , obj1 ] ) ;
861
+ // Spy on DB adapter
862
+ const databaseAdapter = Config . get ( Parse . applicationId ) . database . adapter ;
863
+ spyOn ( databaseAdapter . database . serverConfig , 'startSession' ) . and . callThrough ( ) ;
864
+ // Query
865
+ const query = new Parse . Query ( 'MyObject' ) ;
866
+ query . readPreference ( 'SECONDARY' ) ;
867
+ const results = await query . aggregate ( [ { match :{ boolKey : false } } ] ) ;
868
+ // Validate
869
+ expect ( results . length ) . toBe ( 1 ) ;
870
+ let readPreference = null ;
871
+ databaseAdapter . database . serverConfig . startSession . calls . all ( ) . forEach ( call => {
872
+ if ( call . args [ 0 ] . owner . ns . indexOf ( 'MyObject' ) > - 1 ) {
873
+ readPreference = call . args [ 0 ] . owner . operation . readPreference . mode ;
874
+ }
875
+ } ) ;
876
+ expect ( readPreference ) . toEqual ( ReadPreference . SECONDARY ) ;
877
+ } ) ;
878
+
799
879
it ( 'should find includes in same replica of readPreference by default' , done => {
800
880
const databaseAdapter = Config . get ( Parse . applicationId ) . database . adapter ;
801
881
0 commit comments