source_weaver_3-contract-lab/test/Repository.t.sol
source_weaver_3 1550cae23d
Some checks are pending
CI / build-and-test (push) Waiting to run
CI / slither (push) Waiting to run
test: add foundry tests for Repository.sol
2026-04-19 09:08:09 +00:00

107 lines
4.0 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "forge-std/Test.sol";
import "../contracts/Repository.sol";
contract RepositoryTest is Test {
Repository public repo;
address public owner;
address public user;
function setUp() public {
owner = makeAddr("owner");
user = makeAddr("user");
vm.prank(owner);
repo = new Repository();
}
function test_CreateRepository() public {
vm.prank(owner);
bytes32 repoId = repo.createRepository("TestRepo", "Test Description", true);
RepositoryMetadata memory metadata = repo.getRepository(repoId);
assertEq(metadata.owner, owner, "Repository owner should match creator");
assertEq(metadata.name, "TestRepo", "Repository name should be correct");
assertTrue(metadata.isPublic, "Repository should be public");
}
function testRevert_CreateRepositoryWithEmptyName() public {
vm.expectRevert("Repository name must be between 1-50 characters");
vm.prank(owner);
repo.createRepository("", "Test Description", true);
}
function testRevert_CreateRepositoryWithLongName() public {
string memory longName = string(abi.encodePacked(
"ThisIsAVeryLongRepositoryNameThatExceedsTheFiftyCharacterLimit"
));
vm.expectRevert("Repository name must be between 1-50 characters");
vm.prank(owner);
repo.createRepository(longName, "Test Description", true);
}
function test_AddCommit() public {
vm.startPrank(owner);
bytes32 repoId = repo.createRepository("TestRepo", "Test Description", true);
bytes32 commitHash = keccak256(abi.encodePacked("first commit"));
bytes32 parentCommitHash = bytes32(0);
repo.addCommit(repoId, commitHash, "Initial commit", parentCommitHash);
vm.stopPrank();
Commit[] memory commits = repo.getRepositoryCommits(repoId);
assertEq(commits.length, 1, "Should have one commit");
assertEq(commits[0].commitHash, commitHash, "Commit hash should match");
assertEq(commits[0].author, owner, "Commit author should be owner");
}
function testRevert_AddCommitByNonOwner() public {
vm.startPrank(owner);
bytes32 repoId = repo.createRepository("TestRepo", "Test Description", true);
vm.stopPrank();
vm.expectRevert("Only repository owner can add commits");
vm.prank(user);
repo.addCommit(repoId, keccak256("commit"), "Unauthorized commit", bytes32(0));
}
function testFuzz_CreateRepositoryWithVariedNames(string memory name) public {
vm.assume(bytes(name).length > 0 && bytes(name).length <= 50);
vm.prank(owner);
bytes32 repoId = repo.createRepository(name, "Fuzzed Description", true);
RepositoryMetadata memory metadata = repo.getRepository(repoId);
assertEq(metadata.name, name, "Repository name should match fuzzed input");
}
function test_GetUserRepositories() public {
vm.startPrank(owner);
bytes32 repoId1 = repo.createRepository("Repo1", "Description 1", true);
bytes32 repoId2 = repo.createRepository("Repo2", "Description 2", false);
vm.stopPrank();
bytes32[] memory userRepos = repo.getUserRepositories(owner);
assertEq(userRepos.length, 2, "Should have two repositories");
assertEq(userRepos[0], repoId1, "First repository should match");
assertEq(userRepos[1], repoId2, "Second repository should match");
}
function testGas_CreateRepository() public {
vm.prank(owner);
repo.createRepository("GasTestRepo", "Gas Description", true);
}
function testGas_AddCommit() public {
vm.startPrank(owner);
bytes32 repoId = repo.createRepository("GasTestRepo", "Gas Description", true);
repo.addCommit(repoId, keccak256("commit"), "Gas commit", bytes32(0));
vm.stopPrank();
}
}