diff --git a/test/RepositoryExplorerTest.t.sol b/test/RepositoryExplorerTest.t.sol new file mode 100644 index 0000000..365ef09 --- /dev/null +++ b/test/RepositoryExplorerTest.t.sol @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {Test, console} from "forge-std/Test.sol"; +import {RepositoryExplorer} from "../contracts/RepositoryExplorer.sol"; +import {Repository} from "../contracts/Repository.sol"; + +contract RepositoryExplorerTest is Test { + RepositoryExplorer public repositoryExplorer; + Repository public repository; + address public owner; + address public testUser; + + function setUp() public { + owner = address(this); + testUser = vm.addr(1); + + repository = new Repository(owner); + repositoryExplorer = new RepositoryExplorer(address(repository)); + + vm.startPrank(testUser); + } + + function test_CreateRepository() public { + string memory repoName = "TestRepo"; + string memory repoDescription = "A test repository for exploration"; + + uint256 repositoryId = repositoryExplorer.createRepository(repoName, repoDescription); + + assertEq(repositoryId, 1, "First repository should have ID 1"); + + (string memory name, string memory description, address creator) = repository.getRepositoryDetails(repositoryId); + + assertEq(name, repoName, "Repository name should match"); + assertEq(description, repoDescription, "Repository description should match"); + assertEq(creator, testUser, "Repository creator should be test user"); + } + + function test_AddRepositoryContent() public { + string memory repoName = "ContentRepo"; + string memory repoDescription = "Repository for content testing"; + + uint256 repositoryId = repositoryExplorer.createRepository(repoName, repoDescription); + + string memory contentHash = "QmTestHash123"; + string memory contentType = "text/markdown"; + + repositoryExplorer.addRepositoryContent(repositoryId, contentHash, contentType); + + (string memory retrievedHash, string memory retrievedType) = repository.getRepositoryContent(repositoryId, 0); + + assertEq(retrievedHash, contentHash, "Content hash should match"); + assertEq(retrievedType, contentType, "Content type should match"); + } + + function test_TransferRepositoryOwnership() public { + address newOwner = vm.addr(2); + + string memory repoName = "OwnershipRepo"; + string memory repoDescription = "Repository for ownership transfer"; + + uint256 repositoryId = repositoryExplorer.createRepository(repoName, repoDescription); + + vm.startPrank(testUser); + repositoryExplorer.transferRepositoryOwnership(repositoryId, newOwner); + + address currentOwner = repository.getRepositoryOwner(repositoryId); + + assertEq(currentOwner, newOwner, "Repository ownership should be transferred"); + } + + function testRevert_CreateRepositoryWithEmptyName() public { + vm.expectRevert("Repository name cannot be empty"); + repositoryExplorer.createRepository("", "Empty name test"); + } + + function test_MultipleRepositoryCreation() public { + uint256 initialRepositoryCount = repositoryExplorer.getTotalRepositories(); + + repositoryExplorer.createRepository("Repo1", "First test repository"); + repositoryExplorer.createRepository("Repo2", "Second test repository"); + + uint256 finalRepositoryCount = repositoryExplorer.getTotalRepositories(); + + assertEq(finalRepositoryCount, initialRepositoryCount + 2, "Two repositories should be created"); + } + + function testFuzz_CreateRepositoryWithVariedNames(string memory repoName) public { + vm.assume(bytes(repoName).length > 0); + + uint256 repositoryId = repositoryExplorer.createRepository(repoName, "Fuzzy repository"); + + (string memory name,, ) = repository.getRepositoryDetails(repositoryId); + + assertEq(name, repoName, "Fuzzy repository name should match input"); + } + + function testGas_CreateRepository() public { + string memory repoName = "GasTestRepo"; + string memory repoDescription = "Repository for gas measurement"; + + uint256 gasStart = gasleft(); + repositoryExplorer.createRepository(repoName, repoDescription); + uint256 gasSpent = gasStart - gasleft(); + + console.log("Gas spent on repository creation:", gasSpent); + } + + function test_RepositoryContentLimits() public { + string memory repoName = "LimitTestRepo"; + uint256 repositoryId = repositoryExplorer.createRepository(repoName, "Limit testing"); + + for (uint256 i = 0; i < 10; i++) { + repositoryExplorer.addRepositoryContent( + repositoryId, + string(abi.encodePacked("QmTestHash", vm.toString(i))), + "text/plain" + ); + } + + uint256 contentCount = repository.getRepositoryContentCount(repositoryId); + assertEq(contentCount, 10, "R \ No newline at end of file