@@ -4,7 +4,7 @@ use super::*;
44use soroban_sdk:: testutils:: { Address as _, Events as _} ;
55use soroban_sdk:: token;
66use soroban_sdk:: TryFromVal ;
7- use soroban_sdk:: { Address , Env , Symbol , Vec } ;
7+ use soroban_sdk:: { Address , Env , IntoVal , Symbol , Vec } ;
88
99fn create_usdc < ' a > (
1010 env : & ' a Env ,
@@ -266,3 +266,88 @@ fn batch_distribute_success_events() {
266266 }
267267 }
268268}
269+
270+ #[ test]
271+ fn receive_payment_emits_event_for_admin ( ) {
272+ let env = Env :: default ( ) ;
273+ env. mock_all_auths ( ) ;
274+ let admin = Address :: generate ( & env) ;
275+ let ( _, client) = create_pool ( & env) ;
276+ let ( usdc, _, _) = create_usdc ( & env, & admin) ;
277+
278+ client. init ( & admin, & usdc) ;
279+ client. receive_payment ( & admin, & 250 , & true ) ;
280+
281+ let events = env. events ( ) . all ( ) ;
282+ let receive_event = events. last ( ) . unwrap ( ) ;
283+ let event_name = Symbol :: try_from_val ( & env, & receive_event. 1 . get ( 0 ) . unwrap ( ) ) . unwrap ( ) ;
284+ assert_eq ! ( event_name, Symbol :: new( & env, "receive_payment" ) ) ;
285+
286+ let caller: Address = Address :: try_from_val ( & env, & receive_event. 1 . get ( 1 ) . unwrap ( ) ) . unwrap ( ) ;
287+ assert_eq ! ( caller, admin) ;
288+
289+ let ( amount, from_vault) : ( i128 , bool ) = receive_event. 2 . into_val ( & env) ;
290+ assert_eq ! ( amount, 250 ) ;
291+ assert ! ( from_vault) ;
292+ }
293+
294+ #[ test]
295+ #[ should_panic( expected = "no pending admin" ) ]
296+ fn claim_admin_without_pending_panics ( ) {
297+ let env = Env :: default ( ) ;
298+ env. mock_all_auths ( ) ;
299+ let admin = Address :: generate ( & env) ;
300+ let candidate = Address :: generate ( & env) ;
301+ let ( _, client) = create_pool ( & env) ;
302+ let ( usdc, _, _) = create_usdc ( & env, & admin) ;
303+
304+ client. init ( & admin, & usdc) ;
305+ client. claim_admin ( & candidate) ;
306+ }
307+
308+ #[ test]
309+ #[ should_panic( expected = "unauthorized: caller is not pending admin" ) ]
310+ fn claim_admin_wrong_caller_panics ( ) {
311+ let env = Env :: default ( ) ;
312+ env. mock_all_auths ( ) ;
313+ let admin = Address :: generate ( & env) ;
314+ let pending_admin = Address :: generate ( & env) ;
315+ let attacker = Address :: generate ( & env) ;
316+ let ( _, client) = create_pool ( & env) ;
317+ let ( usdc, _, _) = create_usdc ( & env, & admin) ;
318+
319+ client. init ( & admin, & usdc) ;
320+ client. set_admin ( & admin, & pending_admin) ;
321+ client. claim_admin ( & attacker) ;
322+ }
323+
324+ #[ test]
325+ #[ should_panic( expected = "invalid recipient: cannot distribute to the contract itself" ) ]
326+ fn distribute_to_self_panics ( ) {
327+ let env = Env :: default ( ) ;
328+ env. mock_all_auths ( ) ;
329+ let admin = Address :: generate ( & env) ;
330+ let ( pool_addr, client) = create_pool ( & env) ;
331+ let ( usdc_address, _, usdc_admin) = create_usdc ( & env, & admin) ;
332+
333+ client. init ( & admin, & usdc_address) ;
334+ fund_pool ( & usdc_admin, & pool_addr, 100 ) ;
335+ client. distribute ( & admin, & pool_addr, & 50 ) ;
336+ }
337+
338+ #[ test]
339+ #[ should_panic( expected = "amount must be positive" ) ]
340+ fn batch_distribute_zero_amount_panics ( ) {
341+ let env = Env :: default ( ) ;
342+ env. mock_all_auths ( ) ;
343+ let admin = Address :: generate ( & env) ;
344+ let dev = Address :: generate ( & env) ;
345+ let ( _, client) = create_pool ( & env) ;
346+ let ( usdc_address, _, _) = create_usdc ( & env, & admin) ;
347+
348+ client. init ( & admin, & usdc_address) ;
349+
350+ let mut payments: Vec < ( Address , i128 ) > = Vec :: new ( & env) ;
351+ payments. push_back ( ( dev, 0 ) ) ;
352+ client. batch_distribute ( & admin, & payments) ;
353+ }
0 commit comments