107 lines
4.0 KiB
Solidity
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();
|
|
}
|
|
} |