diff --git a/src/Crowdfund.sol b/src/Crowdfund.sol index abbc3d8..7305697 100644 --- a/src/Crowdfund.sol +++ b/src/Crowdfund.sol @@ -156,4 +156,13 @@ contract Crowdfund { ) external view returns (Campaign memory) { return campaigns[campaignId]; } + + /// @notice Gets the amount raised for a specific campaign. + /// @param campaignId The ID of the campaign. + /// @return The amount raised for the campaign. + function getCampaignAmountRaised( + uint campaignId + ) external view returns (uint) { + return campaigns[campaignId].amountRaised; + } } diff --git a/test/Crowdfund.t.sol b/test/Crowdfund.t.sol index 6f72c12..d795a78 100644 --- a/test/Crowdfund.t.sol +++ b/test/Crowdfund.t.sol @@ -9,36 +9,86 @@ contract CrowdfundTest is Test { address fakeUser = vm.addr(1); function setUp() public { + vm.deal(fakeUser, 1 ether); crowdfund = new Crowdfund(); } - function test_IsInitializedCorrectly() public view { - assertEq(crowdfund.getTotalCampaigns(), 0); - assertEq(crowdfund.getTotalFunding(), 0); - assertEq(crowdfund.getUserCampaigns(fakeUser).length, 0); - } - - function test_CanCreateCampaign() public { - vm.deal(fakeUser, 1 ether); - + function newCampaign() public returns (uint campaignId) { string memory title = "Test Campaign"; string memory description = "This is a test campaign."; uint goal = 1 ether; uint deadline = 1 minutes; vm.prank(fakeUser); - uint campaignId = crowdfund.createCampaign( + campaignId = crowdfund.createCampaign( title, description, goal, deadline ); - + } + + function test_IsInitializedCorrectly() public view { + assertEq(crowdfund.getTotalCampaigns(), 0); + assertEq(crowdfund.getTotalFunding(), 0); + assertEq(crowdfund.getUserCampaigns(fakeUser).length, 0); + } + + function test_CanCreateCampaign() public { + uint campaignId = newCampaign(); + uint[] memory userCampaigns = crowdfund.getUserCampaigns(fakeUser); assertEq(campaignId, 0); assertEq(crowdfund.getTotalCampaigns(), 1); assertEq(crowdfund.getTotalFunding(), 0); - // assertEq(crowdfund.getUserCampaigns(fakeUser).length, 1); - // console.log(crowdfund.getUserCampaigns(fakeUser)); + assertEq(userCampaigns.length, 1); + } + + function test_CanDonateToCampaign() public { + uint campaignId = newCampaign(); + uint amount = 10 ether; + uint amountToDonate = 1 ether; + + address fakeDonor1 = vm.addr(2); + address fakeDonor2 = vm.addr(3); + + vm.deal(fakeDonor1, amount); + vm.deal(fakeDonor2, amount); + + vm.prank(fakeDonor1); + crowdfund.donateToCampaign{value: amountToDonate}(campaignId); + + vm.prank(fakeDonor2); + crowdfund.donateToCampaign{value: amountToDonate}(campaignId); + + assertEq(crowdfund.getTotalFunding(), amountToDonate * 2); + assertEq( + crowdfund.getCampaignAmountRaised(campaignId), + amountToDonate * 2 + ); + } + + function test_CannotDonateZero() public { + uint amount = 10 ether; + address fakeDonor = vm.addr(2); + vm.deal(fakeDonor, amount); + uint campaignId = newCampaign(); + + vm.expectRevert(Crowdfund.Crowdfund_CannotDonateZero.selector); + vm.prank(fakeDonor); + crowdfund.donateToCampaign{value: 0}(campaignId); + } + + function test_CannotDonateToInvalidCampaign() public { + uint campaignId = 1; + address fakeDonor = vm.addr(2); + uint amount = 10 ether; + uint amountToDonate = 1 ether; + + vm.deal(fakeDonor, amount); + + vm.expectRevert(abi.encodeWithSelector(Crowdfund.Crowdfund_InvalidCampaign.selector, campaignId)); + vm.prank(fakeDonor); + crowdfund.donateToCampaign{value: amountToDonate}(campaignId); } }