@@ -1489,6 +1489,185 @@ fn admin_is_stable_after_pause_and_unpause() {
14891489 ) ;
14901490}
14911491
1492+ // ── #890 – initialize and admin path unit tests ──────────────────────────────
1493+
1494+ #[ test]
1495+ fn test_init_stores_admin ( ) {
1496+ let ( env, client, admin, token, _) = setup_test ( ) ;
1497+ let fee_recipient = Address :: generate ( & env) ;
1498+ client. init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1499+ assert_eq ! ( client. admin( ) , admin) ;
1500+ }
1501+
1502+ #[ test]
1503+ fn test_init_stores_fee_bps_zero ( ) {
1504+ let ( env, client, admin, token, _) = setup_test ( ) ;
1505+ let fee_recipient = Address :: generate ( & env) ;
1506+ client. init ( & admin, & 0 , & fee_recipient, & token. address , & 1000 ) ;
1507+ // fee_bps=0 means creator gets 100% — verify via subscribe payment
1508+ let creator = Address :: generate ( & env) ;
1509+ let fan = Address :: generate ( & env) ;
1510+ let ( _, _, _, _, token_admin) = setup_test ( ) ;
1511+ // use a fresh env for payment check
1512+ let ( env2, client2, admin2, token2, token_admin2) = setup_test ( ) ;
1513+ let fee_recipient2 = Address :: generate ( & env2) ;
1514+ client2. init ( & admin2, & 0 , & fee_recipient2, & token2. address , & 1000 ) ;
1515+ let creator2 = Address :: generate ( & env2) ;
1516+ let fan2 = Address :: generate ( & env2) ;
1517+ token_admin2. mint ( & fan2, & 5000 ) ;
1518+ let plan_id = client2. create_plan ( & creator2, & token2. address , & 1000 , & 30 ) ;
1519+ client2. subscribe ( & fan2, & plan_id, & token2. address ) ;
1520+ assert_eq ! ( token2. balance( & fee_recipient2) , 0 , "zero fee: recipient gets nothing" ) ;
1521+ assert_eq ! ( token2. balance( & creator2) , 1000 , "zero fee: creator gets full amount" ) ;
1522+ // suppress unused warnings
1523+ let _ = ( env, client, admin, token, fee_recipient, creator, fan, token_admin) ;
1524+ }
1525+
1526+ #[ test]
1527+ fn test_init_stores_max_fee_bps ( ) {
1528+ let ( env, client, admin, token, _) = setup_test ( ) ;
1529+ let fee_recipient = Address :: generate ( & env) ;
1530+ // 10_000 bps = 100% is the maximum valid value
1531+ client. init ( & admin, & 10_000 , & fee_recipient, & token. address , & 1000 ) ;
1532+ assert_eq ! ( client. admin( ) , admin) ;
1533+ }
1534+
1535+ #[ test]
1536+ fn test_init_rejects_already_initialized ( ) {
1537+ let ( env, client, admin, token, _) = setup_test ( ) ;
1538+ let fee_recipient = Address :: generate ( & env) ;
1539+ client. init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1540+ let result = client. try_init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1541+ assert_eq ! (
1542+ result,
1543+ Err ( Ok ( SorobanError :: from_contract_error(
1544+ Error :: AlreadyInitialized as u32 ,
1545+ ) ) )
1546+ ) ;
1547+ }
1548+
1549+ #[ test]
1550+ fn test_init_rejects_null_fee_recipient ( ) {
1551+ let ( env, client, admin, token, _) = setup_test ( ) ;
1552+ let null_addr = Address :: from_string ( & String :: from_str (
1553+ & env,
1554+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF" ,
1555+ ) ) ;
1556+ let result = client. try_init ( & admin, & 500 , & null_addr, & token. address , & 1000 ) ;
1557+ assert_eq ! (
1558+ result,
1559+ Err ( Ok ( SorobanError :: from_contract_error(
1560+ Error :: InvalidFeeRecipient as u32 ,
1561+ ) ) )
1562+ ) ;
1563+ }
1564+
1565+ #[ test]
1566+ fn test_init_rejects_negative_price ( ) {
1567+ let ( env, client, admin, token, _) = setup_test ( ) ;
1568+ let fee_recipient = Address :: generate ( & env) ;
1569+ let result = client. try_init ( & admin, & 500 , & fee_recipient, & token. address , & -1 ) ;
1570+ assert_eq ! (
1571+ result,
1572+ Err ( Ok ( SorobanError :: from_contract_error(
1573+ Error :: InvalidPrice as u32 ,
1574+ ) ) )
1575+ ) ;
1576+ }
1577+
1578+ #[ test]
1579+ fn test_pause_sets_paused_flag ( ) {
1580+ let ( env, client, admin, token, _) = setup_test ( ) ;
1581+ let fee_recipient = Address :: generate ( & env) ;
1582+ client. init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1583+ assert ! ( !client. is_paused( ) ) ;
1584+ client. pause ( ) ;
1585+ assert ! ( client. is_paused( ) ) ;
1586+ }
1587+
1588+ #[ test]
1589+ fn test_unpause_clears_paused_flag ( ) {
1590+ let ( env, client, admin, token, _) = setup_test ( ) ;
1591+ let fee_recipient = Address :: generate ( & env) ;
1592+ client. init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1593+ client. pause ( ) ;
1594+ assert ! ( client. is_paused( ) ) ;
1595+ client. unpause ( ) ;
1596+ assert ! ( !client. is_paused( ) ) ;
1597+ }
1598+
1599+ #[ test]
1600+ fn test_set_fee_bps_updates_value ( ) {
1601+ let ( env, client, admin, token, token_admin) = setup_test ( ) ;
1602+ let fee_recipient = Address :: generate ( & env) ;
1603+ client. init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1604+ // Change fee to 1000 bps (10%) and verify via subscribe payment
1605+ client. set_fee_bps ( & 1000 ) ;
1606+ let creator = Address :: generate ( & env) ;
1607+ let fan = Address :: generate ( & env) ;
1608+ token_admin. mint ( & fan, & 5000 ) ;
1609+ let plan_id = client. create_plan ( & creator, & token. address , & 1000 , & 30 ) ;
1610+ client. subscribe ( & fan, & plan_id, & token. address ) ;
1611+ assert_eq ! ( token. balance( & fee_recipient) , 100 , "10% fee = 100" ) ;
1612+ assert_eq ! ( token. balance( & creator) , 900 , "creator gets 900 after 10% fee" ) ;
1613+ }
1614+
1615+ #[ test]
1616+ fn test_set_fee_bps_rejects_over_10000 ( ) {
1617+ let ( env, client, admin, token, _) = setup_test ( ) ;
1618+ let fee_recipient = Address :: generate ( & env) ;
1619+ client. init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1620+ let result = client. try_set_fee_bps ( & 10_001 ) ;
1621+ assert_eq ! (
1622+ result,
1623+ Err ( Ok ( SorobanError :: from_contract_error(
1624+ Error :: InvalidFeeBps as u32 ,
1625+ ) ) )
1626+ ) ;
1627+ }
1628+
1629+ #[ test]
1630+ fn test_set_fee_recipient_updates_value ( ) {
1631+ let ( env, client, admin, token, token_admin) = setup_test ( ) ;
1632+ let old_recipient = Address :: generate ( & env) ;
1633+ let new_recipient = Address :: generate ( & env) ;
1634+ client. init ( & admin, & 500 , & old_recipient, & token. address , & 1000 ) ;
1635+ client. set_fee_recipient ( & new_recipient) ;
1636+ // Verify new recipient receives fees
1637+ let creator = Address :: generate ( & env) ;
1638+ let fan = Address :: generate ( & env) ;
1639+ token_admin. mint ( & fan, & 5000 ) ;
1640+ let plan_id = client. create_plan ( & creator, & token. address , & 1000 , & 30 ) ;
1641+ client. subscribe ( & fan, & plan_id, & token. address ) ;
1642+ assert_eq ! ( token. balance( & old_recipient) , 0 , "old recipient gets nothing" ) ;
1643+ assert_eq ! ( token. balance( & new_recipient) , 50 , "new recipient gets 5% fee" ) ;
1644+ }
1645+
1646+ #[ test]
1647+ fn test_set_fee_recipient_rejects_null_address ( ) {
1648+ let ( env, client, admin, token, _) = setup_test ( ) ;
1649+ let fee_recipient = Address :: generate ( & env) ;
1650+ client. init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1651+ let null_addr = Address :: from_string ( & String :: from_str (
1652+ & env,
1653+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF" ,
1654+ ) ) ;
1655+ let result = client. try_set_fee_recipient ( & null_addr) ;
1656+ assert_eq ! (
1657+ result,
1658+ Err ( Ok ( SorobanError :: from_contract_error(
1659+ Error :: InvalidFeeRecipient as u32 ,
1660+ ) ) )
1661+ ) ;
1662+ }
1663+
1664+ #[ test]
1665+ fn test_paused_blocks_create_plan( ) {
1666+ let ( env, client, admin, token, _) = setup_test ( ) ;
1667+ let fee_recipient = Address :: generate ( & env) ;
1668+ client. init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1669+ client. pause ( ) ;
1670+ let creator = Address :: generate ( & env) ;
14921671// ============================================================================
14931672// HEALTH CHECK / PING TESTS
14941673// Verifies Soroban RPC / contract connectivity probe (issue: health-check).
@@ -1593,6 +1772,14 @@ fn test_create_plan_paused_returns_typed_error() {
15931772 ) ;
15941773}
15951774
1775+ #[ test]
1776+ fn test_paused_blocks_subscribe( ) {
1777+ let ( env, client, admin, token, token_admin) = setup_test ( ) ;
1778+ let fee_recipient = Address :: generate ( & env) ;
1779+ client. init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1780+ let creator = Address :: generate ( & env) ;
1781+ let fan = Address :: generate ( & env) ;
1782+ token_admin. mint ( & fan, & 5000 ) ;
15961783/// subscribe when paused returns Error::Paused (code 2).
15971784#[ test]
15981785fn test_subscribe_paused_returns_typed_error ( ) {
@@ -1611,6 +1798,14 @@ fn test_subscribe_paused_returns_typed_error() {
16111798 ) ;
16121799}
16131800
1801+ #[ test]
1802+ fn test_paused_blocks_cancel( ) {
1803+ let ( env, client, admin, token, token_admin) = setup_test ( ) ;
1804+ let fee_recipient = Address :: generate ( & env) ;
1805+ client. init ( & admin, & 500 , & fee_recipient, & token. address , & 1000 ) ;
1806+ let creator = Address :: generate ( & env) ;
1807+ let fan = Address :: generate ( & env) ;
1808+ token_admin. mint ( & fan, & 5000 ) ;
16141809/// cancel when paused returns Error::Paused (code 2).
16151810#[ test]
16161811fn test_cancel_paused_returns_typed_error ( ) {
0 commit comments