@@ -1403,3 +1403,80 @@ fn test_expert_pagination_50_bookings() {
14031403 let tail = client. get_expert_bookings ( & expert, & 40 , & 20 ) ;
14041404 assert_eq ! ( tail. len( ) , 10 ) ; // only 10 left from index 40 to 49
14051405}
1406+
1407+ #[ test]
1408+ fn test_top_up_session_success ( ) {
1409+ let env = Env :: default ( ) ;
1410+ env. mock_all_auths ( ) ;
1411+
1412+ let admin = Address :: generate ( & env) ;
1413+ let user = Address :: generate ( & env) ;
1414+ let expert = Address :: generate ( & env) ;
1415+ let oracle = Address :: generate ( & env) ;
1416+ let registry = create_mock_registry ( & env) ;
1417+
1418+ let token_admin = Address :: generate ( & env) ;
1419+ let token = create_token_contract ( & env, & token_admin) ;
1420+ token. mint ( & user, & 100_000 ) ;
1421+
1422+ let client = create_client ( & env) ;
1423+ client. init ( & admin, & token. address , & oracle, & registry) ;
1424+
1425+ let rate_per_second = 10_i128 ;
1426+ let initial_duration = 1800_u64 ; // 30 mins
1427+ let additional_duration = 900_u64 ; // 15 mins
1428+
1429+ let booking_id = {
1430+ client. set_my_rate ( & expert, & rate_per_second) ;
1431+ client. book_session ( & user, & expert, & initial_duration)
1432+ } ;
1433+
1434+ let initial_deposit = rate_per_second * ( initial_duration as i128 ) ; // 18,000
1435+ assert_eq ! ( token. balance( & client. address) , initial_deposit) ;
1436+
1437+ // Top up 15 mins
1438+ let extra_cost = rate_per_second * ( additional_duration as i128 ) ; // 9,000
1439+ let result = client. try_top_up_session ( & user, & booking_id, & additional_duration) ;
1440+ assert ! ( result. is_ok( ) ) ;
1441+
1442+ // Verify balances
1443+ let expected_total_deposit = initial_deposit + extra_cost;
1444+ assert_eq ! ( token. balance( & client. address) , expected_total_deposit) ;
1445+
1446+ // Verify booking record
1447+ let booking = client. get_booking ( & booking_id) . unwrap ( ) ;
1448+ assert_eq ! ( booking. max_duration, initial_duration + additional_duration) ;
1449+ assert_eq ! ( booking. total_deposit, expected_total_deposit) ;
1450+ }
1451+
1452+ #[ test]
1453+ fn test_top_up_wrong_user_fails ( ) {
1454+ let env = Env :: default ( ) ;
1455+ env. mock_all_auths ( ) ;
1456+
1457+ let admin = Address :: generate ( & env) ;
1458+ let user = Address :: generate ( & env) ;
1459+ let other_user = Address :: generate ( & env) ;
1460+ let expert = Address :: generate ( & env) ;
1461+ let oracle = Address :: generate ( & env) ;
1462+ let registry = create_mock_registry ( & env) ;
1463+
1464+ let token_admin = Address :: generate ( & env) ;
1465+ let token = create_token_contract ( & env, & token_admin) ;
1466+ token. mint ( & user, & 40_000 ) ;
1467+ token. mint ( & other_user, & 40_000 ) ;
1468+
1469+ let client = create_client ( & env) ;
1470+ client. init ( & admin, & token. address , & oracle, & registry) ;
1471+
1472+ let rate_per_second = 10_i128 ;
1473+ let initial_duration = 1800_u64 ;
1474+
1475+ let booking_id = {
1476+ client. set_my_rate ( & expert, & rate_per_second) ;
1477+ client. book_session ( & user, & expert, & initial_duration)
1478+ } ;
1479+
1480+ let result = client. try_top_up_session ( & other_user, & booking_id, & 900 ) ;
1481+ assert ! ( result. is_err( ) ) ;
1482+ }
0 commit comments