Files
aitbc/contracts/test/fuzz/ContractRegistry.t.sol
aitbc 87e524e42c feat: enhance smart contract testing and deployment
- Add comprehensive test files for core contracts (ContractRegistry, TreasuryManager, AgentMarketplaceV2, EscrowService, DynamicPricing)
- Add Foundry fuzz tests for ContractRegistry, TreasuryManager, and AgentMarketplaceV2
- Add deployment automation scripts (deploy-automation.js, verify-deployment.js, monitor-contracts.js)
- Fix Hardhat/toolbox version compatibility in package.json
- Update smart-contract-tests.yml workflow to include deployment job
2026-04-29 10:44:40 +02:00

166 lines
5.5 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "forge-std/Test.sol";
import "../../contracts/contracts/ContractRegistry.sol";
contract ContractRegistryFuzzTest is Test {
ContractRegistry public registry;
address public owner;
address public user1;
address public user2;
address public contract1;
address public contract2;
function setUp() public {
owner = address(this);
user1 = address(0x1);
user2 = address(0x2);
contract1 = address(0x3);
contract2 = address(0x4);
vm.prank(owner);
registry = new ContractRegistry();
}
function testFuzz_RegisterContract(bytes32 contractId, address contractAddress) public {
vm.assume(contractAddress != address(0));
vm.assume(contractId != bytes32(0));
vm.prank(owner);
registry.registerContract(contractId, contractAddress);
assertEq(registry.getContract(contractId), contractAddress);
}
function testFuzz_RevertIfZeroAddress(bytes32 contractId) public {
vm.assume(contractId != bytes32(0));
vm.prank(owner);
vm.expectRevert("Invalid address");
registry.registerContract(contractId, address(0));
}
function testFuzz_RevertIfAlreadyRegistered(bytes32 contractId, address contractAddress) public {
vm.assume(contractAddress != address(0));
vm.assume(contractId != bytes32(0));
vm.prank(owner);
registry.registerContract(contractId, contractAddress);
vm.prank(owner);
vm.expectRevert("ContractAlreadyRegistered");
registry.registerContract(contractId, contractAddress);
}
function testFuzz_UpdateContract(bytes32 contractId, address oldAddress, address newAddress) public {
vm.assume(oldAddress != address(0));
vm.assume(newAddress != address(0));
vm.assume(oldAddress != newAddress);
vm.assume(contractId != bytes32(0));
vm.prank(owner);
registry.registerContract(contractId, oldAddress);
vm.prank(owner);
registry.updateContract(contractId, newAddress);
assertEq(registry.getContract(contractId), newAddress);
}
function testFuzz_DeregisterContract(bytes32 contractId, address contractAddress) public {
vm.assume(contractAddress != address(0));
vm.assume(contractId != bytes32(0));
vm.prank(owner);
registry.registerContract(contractId, contractAddress);
vm.prank(owner);
registry.deregisterContract(contractId);
vm.expectRevert("ContractNotFound");
registry.getContract(contractId);
}
function testFuzz_BatchRegister(bytes32[] calldata contractIds, address[] calldata addresses) public {
vm.assume(contractIds.length == addresses.length);
vm.assume(contractIds.length > 0);
vm.assume(contractIds.length <= 100);
for (uint256 i = 0; i < addresses.length; i++) {
vm.assume(addresses[i] != address(0));
vm.assume(contractIds[i] != bytes32(0));
}
vm.prank(owner);
registry.batchRegisterContracts(contractIds, addresses);
for (uint256 i = 0; i < contractIds.length; i++) {
assertEq(registry.getContract(contractIds[i]), addresses[i]);
}
}
function testFuzz_ListContracts(uint256 numContracts) public {
vm.assume(numContracts > 0);
vm.assume(numContracts <= 50);
bytes32[] memory contractIds = new bytes32[](numContracts);
address[] memory addresses = new address[](numContracts);
for (uint256 i = 0; i < numContracts; i++) {
contractIds[i] = keccak256(abi.encodePacked(i));
addresses[i] = address(uint160(i + 100));
vm.prank(owner);
registry.registerContract(contractIds[i], addresses[i]);
}
(bytes32[] memory listedIds, address[] memory listedAddresses) = registry.listContracts();
assertEq(listedIds.length, numContracts + 1); // +1 for registry itself
assertEq(listedAddresses.length, numContracts + 1);
}
function testFuzz_GetContractVersion(bytes32 contractId, address contractAddress) public {
vm.assume(contractAddress != address(0));
vm.assume(contractId != bytes32(0));
vm.prank(owner);
registry.registerContract(contractId, contractAddress);
uint256 version = registry.getContractVersion(contractId);
assertEq(version, 1);
}
function testFuzz_IsRegisteredContract(address contractAddress) public {
vm.assume(contractAddress != address(0));
bool isRegistered = registry.isRegisteredContract(contractAddress);
if (contractAddress == address(registry)) {
assertTrue(isRegistered);
} else {
assertFalse(isRegistered);
}
}
function testFuzz_GetContractId(address contractAddress, bytes32 contractId) public {
vm.assume(contractAddress != address(0));
vm.assume(contractId != bytes32(0));
vm.prank(owner);
registry.registerContract(contractId, contractAddress);
bytes32 retrievedId = registry.getContractId(contractAddress);
assertEq(retrievedId, contractId);
}
function testFuzz_GetRegistryStats() public {
(uint256 totalContracts, uint256 totalVersion, bool isPaused, address registryOwner) = registry.getRegistryStats();
assertEq(totalContracts, 1); // Registry itself
assertEq(totalVersion, 1);
assertFalse(isPaused);
assertEq(registryOwner, owner);
}
}