From e0fed7c671ebe2da0a2e7c2ad780280f86c207dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=98=89=E5=91=88?= Date: Mon, 25 May 2026 23:31:52 +0800 Subject: [PATCH] test(contracts): add bounty contract coverage for issue #5 --- contracts/bounty/src/lib.rs | 3 + contracts/bounty/src/test.rs | 107 ++++++++++++++++++++++++++++++----- 2 files changed, 95 insertions(+), 15 deletions(-) diff --git a/contracts/bounty/src/lib.rs b/contracts/bounty/src/lib.rs index adacfa7..bc5f37f 100644 --- a/contracts/bounty/src/lib.rs +++ b/contracts/bounty/src/lib.rs @@ -35,3 +35,6 @@ impl BountyContract { client.transfer(&env.current_contract_address(), &maintainer, &amount); } } + +#[cfg(test)] +mod test; diff --git a/contracts/bounty/src/test.rs b/contracts/bounty/src/test.rs index 0bdcba0..269a643 100644 --- a/contracts/bounty/src/test.rs +++ b/contracts/bounty/src/test.rs @@ -1,21 +1,98 @@ #![cfg(test)] -use super::*; -use soroban_sdk::{vec, Env, String}; +use super::{BountyContract, BountyContractClient}; +use soroban_sdk::testutils::Address as _; +use soroban_sdk::{symbol_short, token, Address, Env}; #[test] -fn test() { +fn tip_transfers_tokens_from_sender_to_receiver() { let env = Env::default(); - let contract_id = env.register(Contract, ()); - let client = ContractClient::new(&env, &contract_id); - - let words = client.hello(&String::from_str(&env, "Dev")); - assert_eq!( - words, - vec![ - &env, - String::from_str(&env, "Hello"), - String::from_str(&env, "Dev"), - ] - ); + env.mock_all_auths(); + + let sender = Address::generate(&env); + let receiver = Address::generate(&env); + let token_admin = Address::generate(&env); + + let token_address = env.register_stellar_asset_contract_v2(token_admin); + let token = token::Client::new(&env, &token_address.address()); + let token_admin_client = token::StellarAssetClient::new(&env, &token_address.address()); + + token_admin_client.mint(&sender, &1_000); + + let contract_id = env.register(BountyContract, ()); + let client = BountyContractClient::new(&env, &contract_id); + + client.tip(&token_address.address(), &sender, &receiver, &250); + + assert_eq!(token.balance(&sender), 750); + assert_eq!(token.balance(&receiver), 250); +} + +#[test] +fn create_bounty_locks_maintainer_funds_in_contract() { + let env = Env::default(); + env.mock_all_auths(); + + let maintainer = Address::generate(&env); + let token_admin = Address::generate(&env); + + let token_address = env.register_stellar_asset_contract_v2(token_admin); + let token = token::Client::new(&env, &token_address.address()); + let token_admin_client = token::StellarAssetClient::new(&env, &token_address.address()); + + token_admin_client.mint(&maintainer, &500); + + let contract_id = env.register(BountyContract, ()); + let client = BountyContractClient::new(&env, &contract_id); + + client.create_bounty(&token_address.address(), &maintainer, &symbol_short!("iss1"), &300); + + assert_eq!(token.balance(&maintainer), 200); + assert_eq!(token.balance(&contract_id), 300); +} + +#[test] +#[should_panic(expected = "Bounty already exists for this issue and maintainer")] +fn create_bounty_rejects_duplicate_issue_for_same_maintainer() { + let env = Env::default(); + env.mock_all_auths(); + + let maintainer = Address::generate(&env); + let token_admin = Address::generate(&env); + + let token_address = env.register_stellar_asset_contract_v2(token_admin); + let token_admin_client = token::StellarAssetClient::new(&env, &token_address.address()); + + token_admin_client.mint(&maintainer, &1_000); + + let contract_id = env.register(BountyContract, ()); + let client = BountyContractClient::new(&env, &contract_id); + + let issue_id = symbol_short!("iss2"); + client.create_bounty(&token_address.address(), &maintainer, &issue_id, &100); + client.create_bounty(&token_address.address(), &maintainer, &issue_id, &150); +} + +#[test] +fn cancel_bounty_returns_funds_to_maintainer() { + let env = Env::default(); + env.mock_all_auths(); + + let maintainer = Address::generate(&env); + let token_admin = Address::generate(&env); + + let token_address = env.register_stellar_asset_contract_v2(token_admin); + let token = token::Client::new(&env, &token_address.address()); + let token_admin_client = token::StellarAssetClient::new(&env, &token_address.address()); + + token_admin_client.mint(&maintainer, &900); + + let contract_id = env.register(BountyContract, ()); + let client = BountyContractClient::new(&env, &contract_id); + + client.create_bounty(&token_address.address(), &maintainer, &symbol_short!("iss3"), &400); + client.cancel_bounty(&token_address.address(), &maintainer, &400); + + assert_eq!(token.balance(&contract_id), 0); + assert_eq!(token.balance(&maintainer), 900); }