Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions contract/contract/src/crowdfunding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,18 @@ impl CrowdfundingTrait for CrowdfundingContract {
.instance()
.set(&StorageKey::AllCampaigns, &all_campaigns);

// Track campaigns by creator
let creator_key = StorageKey::CreatorCampaigns(creator.clone());
let mut creator_campaigns = env
.storage()
.instance()
.get(&creator_key)
.unwrap_or(Vec::new(&env));
creator_campaigns.push_back(id.clone());
env.storage()
.instance()
.set(&creator_key, &creator_campaigns);

events::campaign_created(&env, id, title, creator, goal, deadline);

Ok(())
Expand Down
74 changes: 74 additions & 0 deletions contract/contract/test/get_campaigns_by_creator_test.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#![cfg(test)]

use crate::{
crowdfunding::{CrowdfundingContract, CrowdfundingContractClient},
};
use soroban_sdk::{testutils::Address as _, Address, BytesN, Env, String};

#[test]
fn test_get_campaigns_by_creator_multiple_users() {
let env = Env::default();
env.mock_all_auths();

let contract_id = env.register(CrowdfundingContract, ());
let client = CrowdfundingContractClient::new(&env, &contract_id);

// Initialize contract
let admin = Address::generate(&env);
let token_admin = Address::generate(&env);
let token_contract = env.register_stellar_asset_contract_v2(token_admin.clone());
let token_address = token_contract.address();

client.initialize(&admin, &token_address, &0);

// Create campaigns with two different creators
let creator1 = Address::generate(&env);
let creator2 = Address::generate(&env);

let campaign_id1 = BytesN::from_array(&env, &[1u8; 32]);
let campaign_id2 = BytesN::from_array(&env, &[2u8; 32]);
let campaign_id3 = BytesN::from_array(&env, &[3u8; 32]);

let title1 = String::from_str(&env, "Campaign 1");
let title2 = String::from_str(&env, "Campaign 2");
let title3 = String::from_str(&env, "Campaign 3");
let goal = 1_000_000i128;
let deadline = env.ledger().timestamp() + 86400;

// Creator 1 creates 2 campaigns
client.create_campaign(
&campaign_id1,
&title1,
&creator1,
&goal,
&deadline,
&token_address,
);

client.create_campaign(
&campaign_id2,
&title2,
&creator1,
&goal,
&deadline,
&token_address,
);

// Creator 2 creates 1 campaign
client.create_campaign(
&campaign_id3,
&title3,
&creator2,
&goal,
&deadline,
&token_address,
);

// Verify creator1 has 2 campaigns
let campaigns1 = client.get_campaigns_by_creator(&creator1);
assert_eq!(campaigns1.len(), 2);

// Verify creator2 has 1 campaign
let campaigns2 = client.get_campaigns_by_creator(&creator2);
assert_eq!(campaigns2.len(), 1);
}
1 change: 1 addition & 0 deletions contract/contract/test/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
mod close_pool_test;
mod create_pool;
mod crowdfunding_test;
mod get_campaigns_by_creator_test;
mod verify_cause;
Loading