@@ -216,6 +216,9 @@ pub async fn update_campaign(pool: &DbPool, campaign: &Campaign) -> Result<Campa
216216 Ok ( Campaign :: from ( & updated_row) )
217217}
218218
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.
219222pub async fn units_for_slot_get_campaigns (
220223 pool : & DbPool ,
221224 deposit_assets : Option < & HashSet < Address > > ,
@@ -905,4 +908,68 @@ mod test {
905908 vec![ campaign_new_id. clone( ) , campaign. clone( ) ]
906909 ) ;
907910 }
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+ }
908975}
0 commit comments