@@ -216,6 +216,9 @@ pub async fn update_campaign(pool: &DbPool, campaign: &Campaign) -> Result<Campa
216
216
Ok ( Campaign :: from ( & updated_row) )
217
217
}
218
218
219
+ /// Get Campaigns for GET `/v5/units-for-slot` route.
220
+ ///
221
+ /// This method was tested with **5099** deposit assets and it does not reach the postgres query limit.
219
222
pub async fn units_for_slot_get_campaigns (
220
223
pool : & DbPool ,
221
224
deposit_assets : Option < & HashSet < Address > > ,
@@ -905,4 +908,68 @@ mod test {
905
908
vec![ campaign_new_id. clone( ) , campaign. clone( ) ]
906
909
) ;
907
910
}
911
+
912
+ #[ tokio:: test]
913
+ async fn test_units_for_slot_query_max_length_with_deposit_assets ( ) {
914
+ use primitives:: test_util:: { CREATOR , PUBLISHER } ;
915
+ let database = DATABASE_POOL . get ( ) . await . expect ( "Should get a DB pool" ) ;
916
+
917
+ setup_test_migrations ( database. pool . clone ( ) )
918
+ . await
919
+ . expect ( "Migrations should succeed" ) ;
920
+
921
+ let token_addr = * CREATOR ;
922
+ // generate addresses
923
+ let generate = |for_byte : usize | {
924
+ ( 0 ..255_u8 )
925
+ . map ( |byte| {
926
+ let mut bytes = token_addr. to_bytes ( ) ;
927
+ bytes[ for_byte] = byte;
928
+
929
+ Address :: from_bytes ( & bytes)
930
+ } )
931
+ . collect :: < Vec < _ > > ( )
932
+ } ;
933
+ let mut generated = vec ! [ ] ;
934
+ generated. extend ( generate ( 19 ) ) ;
935
+ generated. extend ( generate ( 18 ) ) ;
936
+ generated. extend ( generate ( 17 ) ) ;
937
+ generated. extend ( generate ( 16 ) ) ;
938
+ generated. extend ( generate ( 15 ) ) ;
939
+ generated. extend ( generate ( 14 ) ) ;
940
+ generated. extend ( generate ( 13 ) ) ;
941
+ generated. extend ( generate ( 12 ) ) ;
942
+ generated. extend ( generate ( 11 ) ) ;
943
+ generated. extend ( generate ( 10 ) ) ;
944
+ generated. extend ( generate ( 9 ) ) ;
945
+ generated. extend ( generate ( 8 ) ) ;
946
+ generated. extend ( generate ( 7 ) ) ;
947
+ generated. extend ( generate ( 6 ) ) ;
948
+ generated. extend ( generate ( 5 ) ) ;
949
+ generated. extend ( generate ( 4 ) ) ;
950
+ generated. extend ( generate ( 3 ) ) ;
951
+ generated. extend ( generate ( 2 ) ) ;
952
+ generated. extend ( generate ( 1 ) ) ;
953
+ generated. extend ( generate ( 0 ) ) ;
954
+
955
+ // start from the largest to the smallest and if it successes with the largest value,
956
+ // then we just break the look.
957
+ // Otherwise continues to try out other amount of deposit assets before it succeeds.
958
+ for i in ( 0 ..generated. len ( ) ) . rev ( ) {
959
+ let deposit_assets = generated[ 0 ..i] . iter ( ) . copied ( ) . collect :: < HashSet < _ > > ( ) ;
960
+
961
+
962
+ match units_for_slot_get_campaigns (
963
+ & database,
964
+ Some ( & deposit_assets) ,
965
+ * PUBLISHER ,
966
+ Utc :: now ( ) ,
967
+ )
968
+ . await
969
+ {
970
+ Ok ( _success) => break ,
971
+ Err ( _err) => panic ! ( "Failed with {} deposit assets" , i) ,
972
+ } ;
973
+ }
974
+ }
908
975
}
0 commit comments