verifier_42-contract-lab/test/IVerifier.t.sol

134 lines
4.9 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "forge-std/Test.sol";
import "../contracts/interfaces/IVerifier.sol";
import "../contracts/Verifier.sol";
contract IVerifierTest is Test {
Verifier public verifier;
address public owner;
address public submitter;
address public challenger;
function setUp() public {
owner = makeAddr("owner");
submitter = makeAddr("submitter");
challenger = makeAddr("challenger");
vm.prank(owner);
verifier = new Verifier();
}
function test_SubmitVerification() public {
vm.startPrank(submitter);
bytes32 contentHash = keccak256(abi.encodePacked("test content"));
bytes32[] memory proofData = new bytes32[](1);
proofData[0] = keccak256(abi.encodePacked("proof"));
uint256 challengePeriod = 1 days;
uint256 requiredStake = verifier.calculateRequiredStake(contentHash);
bytes32 submissionId = verifier.submitVerification{value: requiredStake}(
contentHash,
proofData,
challengePeriod
);
IVerifier.VerificationSubmission memory submission = verifier.getSubmissionDetails(submissionId);
assertEq(submission.submitter, submitter, "Incorrect submitter");
assertEq(submission.contentHash, contentHash, "Incorrect content hash");
assertEq(submission.status, IVerifier.VerificationStatus.Pending, "Incorrect initial status");
vm.stopPrank();
}
function testFuzz_SubmitVerification(bytes32 randomContent) public {
vm.startPrank(submitter);
bytes32[] memory proofData = new bytes32[](1);
proofData[0] = keccak256(abi.encodePacked("proof"));
uint256 challengePeriod = 1 days;
uint256 requiredStake = verifier.calculateRequiredStake(randomContent);
bytes32 submissionId = verifier.submitVerification{value: requiredStake}(
randomContent,
proofData,
challengePeriod
);
IVerifier.VerificationSubmission memory submission = verifier.getSubmissionDetails(submissionId);
assertEq(submission.submitter, submitter, "Incorrect submitter");
assertEq(submission.contentHash, randomContent, "Incorrect content hash");
vm.stopPrank();
}
function testRevert_SubmitVerificationInsufficientStake() public {
vm.startPrank(submitter);
bytes32 contentHash = keccak256(abi.encodePacked("test content"));
bytes32[] memory proofData = new bytes32[](1);
proofData[0] = keccak256(abi.encodePacked("proof"));
uint256 challengePeriod = 1 days;
vm.expectRevert("Insufficient stake");
verifier.submitVerification(contentHash, proofData, challengePeriod);
vm.stopPrank();
}
function test_ChallengeSubmission() public {
vm.startPrank(submitter);
bytes32 contentHash = keccak256(abi.encodePacked("test content"));
bytes32[] memory proofData = new bytes32[](1);
proofData[0] = keccak256(abi.encodePacked("proof"));
uint256 challengePeriod = 1 days;
uint256 requiredStake = verifier.calculateRequiredStake(contentHash);
bytes32 submissionId = verifier.submitVerification{value: requiredStake}(
contentHash,
proofData,
challengePeriod
);
vm.stopPrank();
vm.startPrank(challenger);
bytes32[] memory challengeProof = new bytes32[](1);
challengeProof[0] = keccak256(abi.encodePacked("challenge"));
bool challengeResult = verifier.challengeSubmission(submissionId, challengeProof);
assertTrue(challengeResult, "Challenge should be accepted");
assertEq(
uint256(verifier.getSubmissionStatus(submissionId)),
uint256(IVerifier.VerificationStatus.Challenged),
"Submission status not updated after challenge"
);
vm.stopPrank();
}
function test_FinalizeSubmission() public {
vm.startPrank(submitter);
bytes32 contentHash = keccak256(abi.encodePacked("test content"));
bytes32[] memory proofData = new bytes32[](1);
proofData[0] = keccak256(abi.encodePacked("proof"));
uint256 challengePeriod = 1 days;
uint256 requiredStake = verifier.calculateRequiredStake(contentHash);
bytes32 submissionId = verifier.submitVerification{value: requiredStake}(
contentHash,
proofData,
challengePeriod
);
vm.stopPrank();
vm.warp(block.timestamp + challengePeriod + 1);
bool finalizeResult = verifier.finalizeSubmission(submissionId);
assertTrue(finalizeResult, "Submission should be finalized");
assertEq(
uint256(verifier.getSubmissionStatus(submissionId)),
uint256(IVerifier.VerificationStatus.Verified),