Skip to content

Commit 78f776a

Browse files
Omid BodaghiOmid Bodaghi
authored andcommitted
Add testFulFillRandomWordsPicksAWinnerResetsAndSendMoney test
1 parent 37320cb commit 78f776a

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

script/Interactions.s.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ contract FundSubscription is Script, CodeConstants {
5050

5151
if (block.chainid == LOCAL_CHAIN_ID) {
5252
vm.startBroadcast();
53-
VRFCoordinatorV2_5Mock(vrfCoordinator).fundSubscription(subscriptionId, FUND_AMOUNT);
53+
VRFCoordinatorV2_5Mock(vrfCoordinator).fundSubscription(subscriptionId, FUND_AMOUNT * 100);
5454
vm.stopBroadcast();
5555
} else {
5656
vm.startBroadcast();

src/Raffle.sol

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,12 @@ contract Raffle is VRFConsumerBaseV2Plus {
149149
function getPlayer(uint256 index) external view returns (address) {
150150
return s_players[index];
151151
}
152+
153+
function getLastTimeStamp() external view returns (uint256) {
154+
return s_lastTimeStamp;
155+
}
156+
157+
function getRecentWinner() external view returns (address) {
158+
return s_recentWinner;
159+
}
152160
}

test/unit/RaffleTest.s.sol

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {DeployRaffle} from "../../script/DeployRaffle.s.sol";
66
import {HelperConfig} from "../../script/HelperConfig.s.sol";
77
import {Raffle} from "../../src/Raffle.sol";
88
import {Vm} from "forge-std/Vm.sol";
9+
import {VRFCoordinatorV2_5Mock} from "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2_5Mock.sol";
910

1011
contract RaffleTest is Test {
1112
Raffle public raffle;
@@ -136,4 +137,40 @@ contract RaffleTest is Test {
136137
assert(uint256(requestId) > 0);
137138
assert(uint256(raffleState) == 1);
138139
}
140+
141+
// FULFILL RANDOM WORDS
142+
function testFulfillRandomWordsCanOnlyBeCalledAfterPerformUpkeep(uint256 randomRequestId) public raffleEntered {
143+
vm.expectRevert(VRFCoordinatorV2_5Mock.InvalidRequest.selector);
144+
VRFCoordinatorV2_5Mock(vrfCoordinator).fulfillRandomWords(randomRequestId, address(raffle));
145+
}
146+
147+
function testFulFillRandomWordsPicksAWinnerResetsAndSendMoney() public raffleEntered {
148+
uint256 additionalEntrants = 3;
149+
uint256 startingIndex = 1;
150+
address expectedWinner = address(1);
151+
for (uint256 i = 1; i < startingIndex + additionalEntrants; i++) {
152+
address newPlayer = address(uint160(i));
153+
hoax(newPlayer, 1 ether);
154+
raffle.enterRaffle{value: entranceFee}();
155+
}
156+
uint256 startingTimeStamp = raffle.getLastTimeStamp();
157+
uint256 winnerStartingBalance = expectedWinner.balance;
158+
159+
vm.recordLogs();
160+
raffle.performUpkeep("");
161+
Vm.Log[] memory entries = vm.getRecordedLogs();
162+
bytes32 requestId = entries[1].topics[1];
163+
VRFCoordinatorV2_5Mock(vrfCoordinator).fulfillRandomWords(uint256(requestId), address(raffle));
164+
165+
address recentWinner = raffle.getRecentWinner();
166+
Raffle.RaffleState raffleState = raffle.getRaffleState();
167+
uint256 winnerBalance = recentWinner.balance;
168+
uint256 endingTimeStamp = raffle.getLastTimeStamp();
169+
uint256 prize = entranceFee * (additionalEntrants + 1);
170+
171+
assert(recentWinner == expectedWinner);
172+
assert(uint256(raffleState) == 0);
173+
assert(winnerBalance == winnerStartingBalance + prize);
174+
assert(endingTimeStamp > startingTimeStamp);
175+
}
139176
}

0 commit comments

Comments
 (0)