Skip to content

Commit

Permalink
chore: add more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
fedealconada committed Jan 24, 2024
1 parent 3ccab8f commit b6d3d16
Show file tree
Hide file tree
Showing 4 changed files with 142 additions and 71 deletions.
190 changes: 119 additions & 71 deletions test/KintoAppRegistry.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ contract KintoAppRegistryV2 is KintoAppRegistry {
contract KintoAppRegistryTest is SharedSetup {
function testUp() public override {
super.testUp();
useHarness();

assertEq(_kintoAppRegistry.owner(), _owner);
assertEq(_kintoAppRegistry.name(), "Kinto APP");
Expand All @@ -27,6 +28,10 @@ contract KintoAppRegistryTest is SharedSetup {
assertEq(_kintoAppRegistry.RATE_LIMIT_THRESHOLD(), 10);
assertEq(_kintoAppRegistry.GAS_LIMIT_PERIOD(), 30 days);
assertEq(_kintoAppRegistry.GAS_LIMIT_THRESHOLD(), 1e16);
assertEq(
KintoAppRegistryHarness(address(_kintoAppRegistry)).exposed_baseURI(),
"https://kinto.xyz/metadata/kintoapp/"
);
}

/* ============ Upgrade Tests ============ */
Expand Down Expand Up @@ -102,7 +107,50 @@ contract KintoAppRegistryTest is SharedSetup {
assertEq(metadata.name, name);
}

function testUpdateApp(string memory name, address parentContract) public {
function testRegisterApp_RevertWhen_ChildrenIsWallet(string memory name, address parentContract) public {
uint256[4] memory appLimits = [uint256(0), uint256(0), uint256(0), uint256(0)];
address[] memory appContracts = new address[](1);
appContracts[0] = address(_kintoWallet);

// register app
vm.expectRevert("Wallets can not be registered");
_kintoAppRegistry.registerApp(name, parentContract, appContracts, appLimits);
}

function testRegisterApp_RevertWhen_AlreadyRegistered() public {
// register app
string memory name = "app";
address parentContract = address(_engenCredits);
uint256[4] memory appLimits = [uint256(0), uint256(0), uint256(0), uint256(0)];
address[] memory appContracts = new address[](0);

vm.prank(_owner);
_kintoAppRegistry.registerApp(name, parentContract, appContracts, appLimits);

// try to register again
vm.expectRevert("App already registered");
_kintoAppRegistry.registerApp(name, parentContract, appContracts, appLimits);
}

function testRegisterApp_RevertWhen_ParentIsChild() public {
// register app with child address 2
string memory name = "app";
address parentContract = address(_engenCredits);
uint256[4] memory appLimits = [uint256(0), uint256(0), uint256(0), uint256(0)];
address[] memory appContracts = new address[](1);
appContracts[0] = address(2);

vm.prank(_owner);
_kintoAppRegistry.registerApp(name, parentContract, appContracts, appLimits);

// registering app "app2" with parent address 2 should revert
parentContract = address(2);
appContracts = new address[](0);
vm.expectRevert("Parent contract already registered as a child");
_kintoAppRegistry.registerApp(name, parentContract, appContracts, appLimits);
}

function testUpdateMetadata(string memory name, address parentContract) public {
address[] memory appContracts = new address[](1);
appContracts[0] = address(8);

Expand Down Expand Up @@ -135,108 +183,95 @@ contract KintoAppRegistryTest is SharedSetup {
assertEq(_kintoAppRegistry.isSponsored(parentContract, address(8)), true);
}

function testRegisterApp_RevertWhen_ChildrenIsWallet(string memory name, address parentContract) public {
uint256[4] memory appLimits = [uint256(0), uint256(0), uint256(0), uint256(0)];
address[] memory appContracts = new address[](1);
appContracts[0] = address(_kintoWallet);
function testUpdateMetadata_RevertWhen_CallerIsNotDeveloper(string memory name, address parentContract) public {
registerApp(_owner, name, parentContract);

// register app
vm.expectRevert("Wallets can not be registered");
_kintoAppRegistry.registerApp(name, parentContract, appContracts, appLimits);
// update app
address[] memory appContracts = new address[](0);
vm.prank(_user);
vm.expectRevert("Only developer can update metadata");
_kintoAppRegistry.updateMetadata(
"test2", parentContract, appContracts, [uint256(1), uint256(1), uint256(1), uint256(1)]
);
}

/* ============ DSA Test ============ */

function testEnableDSA_WhenCallerIsOwner() public {
address parentContract = address(_engenCredits);
address[] memory appContracts = new address[](1);
appContracts[0] = address(8);
uint256[] memory appLimits = new uint256[](4);
appLimits[0] = _kintoAppRegistry.RATE_LIMIT_PERIOD();
appLimits[1] = _kintoAppRegistry.RATE_LIMIT_THRESHOLD();
appLimits[2] = _kintoAppRegistry.GAS_LIMIT_PERIOD();
appLimits[3] = _kintoAppRegistry.GAS_LIMIT_THRESHOLD();
registerApp(_owner, "app", address(_engenCredits));

vm.prank(_owner);
_kintoAppRegistry.registerApp(
"", parentContract, appContracts, [appLimits[0], appLimits[1], appLimits[2], appLimits[3]]
);
_kintoAppRegistry.enableDSA(address(_engenCredits));

vm.prank(_owner);
_kintoAppRegistry.enableDSA(parentContract);

IKintoAppRegistry.Metadata memory metadata = _kintoAppRegistry.getAppMetadata(parentContract);
IKintoAppRegistry.Metadata memory metadata = _kintoAppRegistry.getAppMetadata(address(_engenCredits));
assertEq(metadata.dsaEnabled, true);
}

function test_Revert_When_User_TriesToEnableDSA() public {
vm.startPrank(_user);
address parentContract = address(_engenCredits);
address[] memory appContracts = new address[](1);
appContracts[0] = address(8);
uint256[] memory appLimits = new uint256[](4);
appLimits[0] = _kintoAppRegistry.RATE_LIMIT_PERIOD();
appLimits[1] = _kintoAppRegistry.RATE_LIMIT_THRESHOLD();
appLimits[2] = _kintoAppRegistry.GAS_LIMIT_PERIOD();
appLimits[3] = _kintoAppRegistry.GAS_LIMIT_THRESHOLD();
_kintoAppRegistry.registerApp(
"", parentContract, appContracts, [appLimits[0], appLimits[1], appLimits[2], appLimits[3]]
);
function testEnableDSA_RevertWhen_CallerIsNotOwner() public {
registerApp(_owner, "app", address(_engenCredits));

vm.expectRevert("Ownable: caller is not the owner");
_kintoAppRegistry.enableDSA(parentContract);
_kintoAppRegistry.enableDSA(address(_engenCredits));
}

function testEnableDSA_RevertWhen_AlreadyEnabled() public {
registerApp(_owner, "app", address(_engenCredits));
vm.prank(_owner);
_kintoAppRegistry.enableDSA(address(_engenCredits));

vm.expectRevert("DSA already enabled");
_kintoAppRegistry.enableDSA(address(_engenCredits));
}

/* ============ Sponsored Contracts Test ============ */

function testAppCreatorCanSetSponsoredContracts() public {
vm.startPrank(_user);
address parentContract = address(_engenCredits);
address[] memory appContracts = new address[](1);
appContracts[0] = address(8);
uint256[] memory appLimits = new uint256[](4);
appLimits[0] = _kintoAppRegistry.RATE_LIMIT_PERIOD();
appLimits[1] = _kintoAppRegistry.RATE_LIMIT_THRESHOLD();
appLimits[2] = _kintoAppRegistry.GAS_LIMIT_PERIOD();
appLimits[3] = _kintoAppRegistry.GAS_LIMIT_THRESHOLD();
_kintoAppRegistry.registerApp(
"", parentContract, appContracts, [appLimits[0], appLimits[1], appLimits[2], appLimits[3]]
);
function testSetSponsoredContracts() public {
registerApp(_owner, "app", address(_engenCredits));

address[] memory contracts = new address[](2);
contracts[0] = address(8);
contracts[1] = address(9);

bool[] memory flags = new bool[](2);
flags[0] = false;
flags[1] = true;
_kintoAppRegistry.setSponsoredContracts(parentContract, contracts, flags);
assertEq(_kintoAppRegistry.isSponsored(parentContract, address(8)), true); // child contracts always sponsored
assertEq(_kintoAppRegistry.isSponsored(parentContract, address(9)), true);
assertEq(_kintoAppRegistry.isSponsored(parentContract, address(10)), false);
vm.stopPrank();

vm.prank(_owner);
_kintoAppRegistry.setSponsoredContracts(address(_engenCredits), contracts, flags);

assertEq(_kintoAppRegistry.isSponsored(address(_engenCredits), address(8)), false);
assertEq(_kintoAppRegistry.isSponsored(address(_engenCredits), address(9)), true);
assertEq(_kintoAppRegistry.isSponsored(address(_engenCredits), address(10)), false);
}

function test_Revert_When_NotCreator_TriesToSetSponsoredContracts() public {
vm.startPrank(_user);
address parentContract = address(_engenCredits);
address[] memory appContracts = new address[](1);
appContracts[0] = address(8);
uint256[] memory appLimits = new uint256[](4);
appLimits[0] = _kintoAppRegistry.RATE_LIMIT_PERIOD();
appLimits[1] = _kintoAppRegistry.RATE_LIMIT_THRESHOLD();
appLimits[2] = _kintoAppRegistry.GAS_LIMIT_PERIOD();
appLimits[3] = _kintoAppRegistry.GAS_LIMIT_THRESHOLD();
_kintoAppRegistry.registerApp(
"", parentContract, appContracts, [appLimits[0], appLimits[1], appLimits[2], appLimits[3]]
);
function testSetSponsoredContracts_RevertWhen_CallerIsNotCreator() public {
registerApp(_owner, "app", address(_engenCredits));

address[] memory contracts = new address[](2);
contracts[0] = address(8);
contracts[1] = address(9);

bool[] memory flags = new bool[](2);
flags[0] = false;
flags[1] = true;
vm.startPrank(_user2);

vm.prank(_user);
vm.expectRevert("Only developer can set sponsored contracts");
_kintoAppRegistry.setSponsoredContracts(parentContract, contracts, flags);
vm.stopPrank();
_kintoAppRegistry.setSponsoredContracts(address(_engenCredits), contracts, flags);
}

function testSetSponsoredContracts_RevertWhen_LengthMismatch() public {
registerApp(_owner, "app", address(_engenCredits));

address[] memory contracts = new address[](1);
contracts[0] = address(8);

bool[] memory flags = new bool[](2);
flags[0] = false;
flags[1] = true;

vm.expectRevert("Invalid input");
_kintoAppRegistry.setSponsoredContracts(address(_engenCredits), contracts, flags);
}

/* ============ Transfer Test ============ */
Expand All @@ -258,4 +293,17 @@ contract KintoAppRegistryTest is SharedSetup {
vm.expectRevert("Only mint transfers are allowed");
_kintoAppRegistry.safeTransferFrom(_user, _user2, tokenIdx);
}

/* ============ Supports Interface tests ============ */

function testSupportsInterface() public {
bytes4 InterfaceERC721Upgradeable = bytes4(keccak256("balanceOf(address)"))
^ bytes4(keccak256("ownerOf(uint256)")) ^ bytes4(keccak256("safeTransferFrom(address,address,uint256,bytes)"))
^ bytes4(keccak256("safeTransferFrom(address,address,uint256)"))
^ bytes4(keccak256("transferFrom(address,address,uint256)")) ^ bytes4(keccak256("approve(address,uint256)"))
^ bytes4(keccak256("setApprovalForAll(address,bool)")) ^ bytes4(keccak256("getApproved(uint256)"))
^ bytes4(keccak256("isApprovedForAll(address,address)"));

assertTrue(_kintoIDv1.supportsInterface(InterfaceERC721Upgradeable));
}
}
1 change: 1 addition & 0 deletions test/SharedSetup.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import "../src/sample/Counter.sol";

import "./harness/KintoWalletHarness.sol";
import "./harness/SponsorPaymasterHarness.sol";
import "./harness/KintoAppRegistryHarness.sol";
import {UserOp} from "./helpers/UserOp.sol";
import {AATestScaffolding} from "./helpers/AATestScaffolding.sol";

Expand Down
17 changes: 17 additions & 0 deletions test/harness/KintoAppRegistryHarness.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.18;

import "../../src/interfaces/IKintoEntryPoint.sol";
import "../../src/interfaces/IKintoID.sol";
import "../../src/interfaces/IKintoAppRegistry.sol";

import {KintoAppRegistry} from "../../src/apps/KintoAppRegistry.sol";

// Harness contract to expose internal functions for testing.
contract KintoAppRegistryHarness is KintoAppRegistry {
constructor(IKintoWalletFactory _walletFactory) KintoAppRegistry(_walletFactory) {}

function exposed_baseURI() public pure returns (string memory) {
return _baseURI();
}
}
5 changes: 5 additions & 0 deletions test/helpers/AATestScaffolding.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import "../helpers/UUPSProxy.sol";
import "../helpers/KYCSignature.sol";
import {KintoWalletHarness} from "../harness/KintoWalletHarness.sol";
import {SponsorPaymasterHarness} from "../harness/SponsorPaymasterHarness.sol";
import {KintoAppRegistryHarness} from "../harness/KintoAppRegistryHarness.sol";

abstract contract AATestScaffolding is KYCSignature {
IKintoEntryPoint _entryPoint;
Expand Down Expand Up @@ -361,6 +362,10 @@ abstract contract AATestScaffolding is KYCSignature {
SponsorPaymasterHarness _paymasterImpl = new SponsorPaymasterHarness(_entryPoint);
vm.prank(_paymaster.owner());
_paymaster.upgradeTo(address(_paymasterImpl));

KintoAppRegistryHarness _registryImpl = new KintoAppRegistryHarness(_walletFactory);
vm.prank(_kintoAppRegistry.owner());
_kintoAppRegistry.upgradeTo(address(_registryImpl));
}

////// helper methods to assert the revert reason on UserOperationRevertReason events ////
Expand Down

0 comments on commit b6d3d16

Please sign in to comment.