Skip to content

Commit

Permalink
Add testFulFillRandomWordsPicksAWinnerResetsAndSendMoney test
Browse files Browse the repository at this point in the history
  • Loading branch information
Omid Bodaghi authored and Omid Bodaghi committed Feb 1, 2025
1 parent 37320cb commit 78f776a
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
2 changes: 1 addition & 1 deletion script/Interactions.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ contract FundSubscription is Script, CodeConstants {

if (block.chainid == LOCAL_CHAIN_ID) {
vm.startBroadcast();
VRFCoordinatorV2_5Mock(vrfCoordinator).fundSubscription(subscriptionId, FUND_AMOUNT);
VRFCoordinatorV2_5Mock(vrfCoordinator).fundSubscription(subscriptionId, FUND_AMOUNT * 100);
vm.stopBroadcast();
} else {
vm.startBroadcast();
Expand Down
8 changes: 8 additions & 0 deletions src/Raffle.sol
Original file line number Diff line number Diff line change
Expand Up @@ -149,4 +149,12 @@ contract Raffle is VRFConsumerBaseV2Plus {
function getPlayer(uint256 index) external view returns (address) {
return s_players[index];
}

function getLastTimeStamp() external view returns (uint256) {
return s_lastTimeStamp;
}

function getRecentWinner() external view returns (address) {
return s_recentWinner;
}
}
37 changes: 37 additions & 0 deletions test/unit/RaffleTest.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {DeployRaffle} from "../../script/DeployRaffle.s.sol";
import {HelperConfig} from "../../script/HelperConfig.s.sol";
import {Raffle} from "../../src/Raffle.sol";
import {Vm} from "forge-std/Vm.sol";
import {VRFCoordinatorV2_5Mock} from "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2_5Mock.sol";

contract RaffleTest is Test {
Raffle public raffle;
Expand Down Expand Up @@ -136,4 +137,40 @@ contract RaffleTest is Test {
assert(uint256(requestId) > 0);
assert(uint256(raffleState) == 1);
}

// FULFILL RANDOM WORDS
function testFulfillRandomWordsCanOnlyBeCalledAfterPerformUpkeep(uint256 randomRequestId) public raffleEntered {
vm.expectRevert(VRFCoordinatorV2_5Mock.InvalidRequest.selector);
VRFCoordinatorV2_5Mock(vrfCoordinator).fulfillRandomWords(randomRequestId, address(raffle));
}

function testFulFillRandomWordsPicksAWinnerResetsAndSendMoney() public raffleEntered {
uint256 additionalEntrants = 3;
uint256 startingIndex = 1;
address expectedWinner = address(1);
for (uint256 i = 1; i < startingIndex + additionalEntrants; i++) {
address newPlayer = address(uint160(i));
hoax(newPlayer, 1 ether);
raffle.enterRaffle{value: entranceFee}();
}
uint256 startingTimeStamp = raffle.getLastTimeStamp();
uint256 winnerStartingBalance = expectedWinner.balance;

vm.recordLogs();
raffle.performUpkeep("");
Vm.Log[] memory entries = vm.getRecordedLogs();
bytes32 requestId = entries[1].topics[1];
VRFCoordinatorV2_5Mock(vrfCoordinator).fulfillRandomWords(uint256(requestId), address(raffle));

address recentWinner = raffle.getRecentWinner();
Raffle.RaffleState raffleState = raffle.getRaffleState();
uint256 winnerBalance = recentWinner.balance;
uint256 endingTimeStamp = raffle.getLastTimeStamp();
uint256 prize = entranceFee * (additionalEntrants + 1);

assert(recentWinner == expectedWinner);
assert(uint256(raffleState) == 0);
assert(winnerBalance == winnerStartingBalance + prize);
assert(endingTimeStamp > startingTimeStamp);
}
}

0 comments on commit 78f776a

Please sign in to comment.