Skip to content

Commit

Permalink
Add Reputation Manager Tests
Browse files Browse the repository at this point in the history
  • Loading branch information
j04n-f committed Jul 23, 2024
1 parent 42afc7d commit 09ee8c8
Show file tree
Hide file tree
Showing 3 changed files with 288 additions and 23 deletions.
35 changes: 24 additions & 11 deletions src/ReputationSystem.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,10 @@ import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "./ReputationManager.sol";
import {Value as Level, Value as Penalty, Value as Reward, Mapping} from "./lib/Mapping.sol";

/// @custom:oz-upgrades-unsafe-allow external-library-linking
contract ReputationSystem is Initializable, PausableUpgradeable, AccessManagedUpgradeable, UUPSUpgradeable {
using Mapping for Mapping.Map;

uint256 private constant REPUTATION = 0;

event LevelCreated(string title, uint256 requiredReputation);
event LevelUpdated(string title, uint256 requiredReputation, bool enabled);
event RewardCreated(string title, uint256 amount, string requiredLevel);
Expand Down Expand Up @@ -57,21 +56,23 @@ contract ReputationSystem is Initializable, PausableUpgradeable, AccessManagedUp
}

modifier rewardExists(string calldata _title) {
if (!rewards.has(_title)) revert NotFoundError("Level", _title);
if (!rewards.has(_title)) revert NotFoundError("Reward", _title);
_;
}

modifier penaltyExists(string calldata _title) {
if (!penalties.has(_title)) revert NotFoundError("Level", _title);
if (!penalties.has(_title)) revert NotFoundError("Penalty", _title);
_;
}

function _toBytes32(string calldata _title) private pure returns (bytes32) {
return keccak256(bytes(_title));
}

function levelRequired(string calldata _title) public view returns (string memory) {
return levels.get(requiredLevel[_toBytes32(_title)]).title;
function levelRequired(string calldata _title) public view rewardExists(_title) returns (string memory) {
bytes32 level = requiredLevel[_toBytes32(_title)];
if (level.length == 0) revert NotFoundError("Required Level", _title);
return levels.get(level).title;
}

function createLevel(string calldata _title, uint256 _reputation) external restricted {
Expand All @@ -86,7 +87,7 @@ contract ReputationSystem is Initializable, PausableUpgradeable, AccessManagedUp
function createReward(string calldata _title, uint256 _reputation, string calldata _levelRequired)
external
restricted
levelExists(_title)
levelExists(_levelRequired)
{
if (bytes(_title).length == 0) revert InvalidTitleError("Reward", _title);
if (rewards.has(_title)) revert AlreadyExistError("Reward", _title);
Expand All @@ -108,19 +109,31 @@ contract ReputationSystem is Initializable, PausableUpgradeable, AccessManagedUp
emit PenaltyCreated(_title, _reputation);
}

function toogleLevelAvailability(string calldata _title) external restricted levelExists(_title) {
function getLevel(string calldata _title) external view returns (Level memory) {
return levels.get(_title);
}

function getReward(string calldata _title) external view returns (Reward memory) {
return rewards.get(_title);
}

function getPenalty(string calldata _title) external view returns (Penalty memory) {
return penalties.get(_title);
}

function toggleLevelAvailability(string calldata _title) external restricted levelExists(_title) {
Level storage level = levels.get(_title);
level.available = !level.available;
emit LevelUpdated(level.title, level.reputation, level.available);
}

function toogleRewardAvailability(string calldata _title) external restricted rewardExists(_title) {
function toggleRewardAvailability(string calldata _title) external restricted rewardExists(_title) {
Reward storage reward = rewards.get(_title);
reward.available = !reward.available;
emit RewardUpdated(reward.title, reward.reputation, levelRequired(_title), reward.available);
}

function tooglePenaltyAvailability(string calldata _title) external restricted penaltyExists(_title) {
function togglePenaltyAvailability(string calldata _title) external restricted penaltyExists(_title) {
Penalty storage penalty = penalties.get(_title);
penalty.available = !penalty.available;
emit PenaltyUpdated(penalty.title, penalty.reputation, penalty.available);
Expand Down Expand Up @@ -167,7 +180,7 @@ contract ReputationSystem is Initializable, PausableUpgradeable, AccessManagedUp

uint256 requiredReputation = level.reputation;
uint256 contributorReputation = reputationOf(_contributor);
bool hasRequiredReputation = contributorReputation < requiredReputation;
bool hasRequiredReputation = requiredReputation <= contributorReputation;

if (!hasRequiredReputation) revert InsufficientReputationError(contributorReputation, requiredReputation);

Expand Down
23 changes: 11 additions & 12 deletions test/ReputationManaget.t.sol → test/ReputationManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,20 @@ import "forge-std/Test.sol";
import "../src/ReputationManager.sol";
import "../src/AccessManager.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";
import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";

contract BaseTest is Test {
ReputationManager public reputationManager;
AccessManager public accessManager;
address public owner;
address public admin;
address public manager;
address public user;

uint64 ADMIN = 42;
uint64 MANAGER = 42;

function setUp() public {
owner = address(0x1);
admin = address(0x2);
manager = address(0x2);
user = address(0x3);

accessManager = AccessManager(
Expand All @@ -39,8 +38,8 @@ contract BaseTest is Test {
selectors[3] = bytes4(keccak256("unpause()"));

vm.startPrank(owner);
accessManager.grantRole(ADMIN, admin, 0);
accessManager.setTargetFunctionRole(address(reputationManager), selectors, ADMIN);
accessManager.grantRole(MANAGER, manager, 0);
accessManager.setTargetFunctionRole(address(reputationManager), selectors, MANAGER);
vm.stopPrank();
}
}
Expand All @@ -51,14 +50,14 @@ contract ReputationManagerTest is BaseTest {
}

function test_Reward() public {
vm.startPrank(admin);
vm.startPrank(manager);
reputationManager.reward(user, 100);
vm.stopPrank();
assertEq(reputationManager.reputationOf(user), 100);
}

function test_Penalize() public {
vm.startPrank(admin);
vm.startPrank(manager);
reputationManager.reward(user, 100);
reputationManager.penalize(user, 50);
vm.stopPrank();
Expand All @@ -68,23 +67,23 @@ contract ReputationManagerTest is BaseTest {

contract ReputationManagerPauseTest is BaseTest {
function test_RevertWhen_RewardPaused() public {
vm.startPrank(admin);
vm.startPrank(manager);
reputationManager.pause();
vm.expectRevert(bytes4(keccak256("EnforcedPause()")));
reputationManager.reward(user, 100);
vm.stopPrank();
}

function test_RevertWhen_PenalizePaused() public {
vm.startPrank(admin);
vm.startPrank(manager);
reputationManager.pause();
vm.expectRevert(bytes4(keccak256("EnforcedPause()")));
reputationManager.penalize(user, 100);
vm.stopPrank();
}

function test_RewardUnpause() public {
vm.startPrank(admin);
vm.startPrank(manager);
reputationManager.pause();
reputationManager.unpause();
reputationManager.reward(user, 100);
Expand All @@ -93,7 +92,7 @@ contract ReputationManagerPauseTest is BaseTest {
}

function test_PenalizeUnpause() public {
vm.startPrank(admin);
vm.startPrank(manager);
reputationManager.pause();
reputationManager.unpause();
reputationManager.reward(user, 100);
Expand Down
Loading

0 comments on commit 09ee8c8

Please sign in to comment.