sourcekeeper_42-contract-lab/test/ILabRegistry.t.sol

137 lines
4.0 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "forge-std/Test.sol";
import "../contracts/interfaces/ILabRegistry.sol";
import "@openzeppelin/contracts/mocks/ERC20Mock.sol";
contract ILabRegistryTest is Test {
ILabRegistry public labRegistry;
address public owner;
address public researcher1;
address public researcher2;
function setUp() public {
owner = makeAddr("owner");
researcher1 = makeAddr("researcher1");
researcher2 = makeAddr("researcher2");
vm.prank(owner);
labRegistry = ILabRegistry(address(new ERC20Mock())); // Placeholder deployment
}
function test_RegisterLab() public {
vm.prank(owner);
uint256 labId = labRegistry.registerLab(
"ChunkLabs",
"Advanced blockchain research",
keccak256("metadata")
);
ILabRegistry.LabEntity memory lab = labRegistry.getLab(labId);
assertEq(lab.name, "ChunkLabs", "Lab name should match");
assertEq(lab.owner, owner, "Lab owner should be msg.sender");
assertTrue(lab.isActive, "Lab should be active after registration");
}
function testFuzz_RegisterLabWithVariedNames(string memory name) public {
vm.assume(bytes(name).length > 0 && bytes(name).length < 50);
vm.prank(owner);
uint256 labId = labRegistry.registerLab(
name,
"Research lab",
keccak256(abi.encodePacked(name))
);
ILabRegistry.LabEntity memory lab = labRegistry.getLab(labId);
assertEq(lab.name, name, "Fuzzy lab name should match input");
}
function test_UpdateLabDetails() public {
vm.prank(owner);
uint256 labId = labRegistry.registerLab(
"InitialName",
"Initial description",
keccak256("initial")
);
vm.prank(owner);
labRegistry.updateLabDetails(
labId,
"UpdatedName",
"Updated description",
keccak256("updated")
);
ILabRegistry.LabEntity memory updatedLab = labRegistry.getLab(labId);
assertEq(updatedLab.name, "UpdatedName", "Lab name should be updated");
assertEq(updatedLab.description, "Updated description", "Lab description should be updated");
}
function test_AddRemoveResearcher() public {
vm.prank(owner);
uint256 labId = labRegistry.registerLab(
"ResearchLab",
"Researcher management",
keccak256("metadata")
);
vm.prank(owner);
labRegistry.addResearcher(labId, researcher1);
assertTrue(
labRegistry.isAuthorizedResearcher(labId, researcher1),
"Researcher should be authorized"
);
vm.prank(owner);
labRegistry.removeResearcher(labId, researcher1);
assertFalse(
labRegistry.isAuthorizedResearcher(labId, researcher1),
"Researcher should be unauthorized"
);
}
function testRevert_UnauthorizedLabUpdate() public {
vm.prank(owner);
uint256 labId = labRegistry.registerLab(
"SecureLab",
"Restricted updates",
keccak256("metadata")
);
vm.expectRevert("Unauthorized");
vm.prank(researcher1);
labRegistry.updateLabDetails(
labId,
"HackedName",
"Unauthorized update",
keccak256("hacked")
);
}
function testRevert_DeactivatedLabModification() public {
vm.prank(owner);
uint256 labId = labRegistry.registerLab(
"ClosedLab",
"Soon to be deactivated",
keccak256("metadata")
);
vm.prank(owner);
labRegistry.deactivateLab(labId);
vm.expectRevert("Lab is not active");
vm.prank(owner);
labRegistry.updateLabDetails(
labId,
"WontWork",
"Deactivated lab",
keccak256("wontupdate")
);
}
}