Skip to content

Commit 8c3f794

Browse files
authored
Merge pull request #1292 from had3sgames/issue-890-subscription-init-admin-tests
feat(subscription): add unit tests for initialize and admin paths (#890)
2 parents 7c00900 + 53abd09 commit 8c3f794

1 file changed

Lines changed: 195 additions & 0 deletions

File tree

  • contract/contracts/subscription/src

contract/contracts/subscription/src/test.rs

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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]
15981785
fn 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]
16161811
fn test_cancel_paused_returns_typed_error() {

0 commit comments

Comments
 (0)