// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.15;
import {DSTestPlus} from "./utils/DSTestPlus.sol";
import {MockAuthority} from "./utils/mocks/MockAuthority.sol";
import {Authority} from "../auth/Auth.sol";
import {RolesAuthority} from "../auth/authorities/RolesAuthority.sol";
contract RolesAuthorityTest is DSTestPlus {
RolesAuthority rolesAuthority;
function setUp() public {
rolesAuthority = new RolesAuthority(address(this), Authority(address(0)));
}
function testSetRoles() public {
assertFalse(rolesAuthority.doesUserHaveRole(address(0xBEEF), 0));
rolesAuthority.setUserRole(address(0xBEEF), 0, true);
assertTrue(rolesAuthority.doesUserHaveRole(address(0xBEEF), 0));
rolesAuthority.setUserRole(address(0xBEEF), 0, false);
assertFalse(rolesAuthority.doesUserHaveRole(address(0xBEEF), 0));
}
function testSetRoleCapabilities() public {
assertFalse(rolesAuthority.doesRoleHaveCapability(0, address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setRoleCapability(0, address(0xCAFE), 0xBEEFCAFE, true);
assertTrue(rolesAuthority.doesRoleHaveCapability(0, address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setRoleCapability(0, address(0xCAFE), 0xBEEFCAFE, false);
assertFalse(rolesAuthority.doesRoleHaveCapability(0, address(0xCAFE), 0xBEEFCAFE));
}
function testSetPublicCapabilities() public {
assertFalse(rolesAuthority.isCapabilityPublic(address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setPublicCapability(address(0xCAFE), 0xBEEFCAFE, true);
assertTrue(rolesAuthority.isCapabilityPublic(address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setPublicCapability(address(0xCAFE), 0xBEEFCAFE, false);
assertFalse(rolesAuthority.isCapabilityPublic(address(0xCAFE), 0xBEEFCAFE));
}
function testCanCallWithAuthorizedRole() public {
assertFalse(rolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setUserRole(address(0xBEEF), 0, true);
assertFalse(rolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setRoleCapability(0, address(0xCAFE), 0xBEEFCAFE, true);
assertTrue(rolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setRoleCapability(0, address(0xCAFE), 0xBEEFCAFE, false);
assertFalse(rolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setRoleCapability(0, address(0xCAFE), 0xBEEFCAFE, true);
assertTrue(rolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setUserRole(address(0xBEEF), 0, false);
assertFalse(rolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
}
function testCanCallPublicCapability() public {
assertFalse(rolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setPublicCapability(address(0xCAFE), 0xBEEFCAFE, true);
assertTrue(rolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
rolesAuthority.setPublicCapability(address(0xCAFE), 0xBEEFCAFE, false);
assertFalse(rolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
}
function testSetRoles(address user, uint8 role) public {
assertFalse(rolesAuthority.doesUserHaveRole(user, role));
rolesAuthority.setUserRole(user, role, true);
assertTrue(rolesAuthority.doesUserHaveRole(user, role));
rolesAuthority.setUserRole(user, role, false);
assertFalse(rolesAuthority.doesUserHaveRole(user, role));
}
function testSetRoleCapabilities(
uint8 role,
address target,
bytes4 functionSig
) public {
assertFalse(rolesAuthority.doesRoleHaveCapability(role, target, functionSig));
rolesAuthority.setRoleCapability(role, target, functionSig, true);
assertTrue(rolesAuthority.doesRoleHaveCapability(role, target, functionSig));
rolesAuthority.setRoleCapability(role, target, functionSig, false);
assertFalse(rolesAuthority.doesRoleHaveCapability(role, target, functionSig));
}
function testSetPublicCapabilities(address target, bytes4 functionSig) public {
assertFalse(rolesAuthority.isCapabilityPublic(target, functionSig));
rolesAuthority.setPublicCapability(target, functionSig, true);
assertTrue(rolesAuthority.isCapabilityPublic(target, functionSig));
rolesAuthority.setPublicCapability(target, functionSig, false);
assertFalse(rolesAuthority.isCapabilityPublic(target, functionSig));
}
function testCanCallWithAuthorizedRole(
address user,
uint8 role,
address target,
bytes4 functionSig
) public {
assertFalse(rolesAuthority.canCall(user, target, functionSig));
rolesAuthority.setUserRole(user, role, true);
assertFalse(rolesAuthority.canCall(user, target, functionSig));
rolesAuthority.setRoleCapability(role, target, functionSig, true);
assertTrue(rolesAuthority.canCall(user, target, functionSig));
rolesAuthority.setRoleCapability(role, target, functionSig, false);
assertFalse(rolesAuthority.canCall(user, target, functionSig));
rolesAuthority.setRoleCapability(role, target, functionSig, true);
assertTrue(rolesAuthority.canCall(user, target, functionSig));
rolesAuthority.setUserRole(user, role, false);
assertFalse(rolesAuthority.canCall(user, target, functionSig));
}
function testCanCallPublicCapability(
address user,
address target,
bytes4 functionSig
) public {
assertFalse(rolesAuthority.canCall(user, target, functionSig));
rolesAuthority.setPublicCapability(target, functionSig, true);
assertTrue(rolesAuthority.canCall(user, target, functionSig));
rolesAuthority.setPublicCapability(target, functionSig, false);
assertFalse(rolesAuthority.canCall(user, target, functionSig));
}
}