Skip to content

Commit 1651716

Browse files
test: Add extra tests for Indexing Agreements
1 parent a7fb875 commit 1651716

File tree

18 files changed

+446
-67
lines changed

18 files changed

+446
-67
lines changed

packages/horizon/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
"build": "hardhat compile",
2727
"test": "forge test",
2828
"test:deployment": "SECURE_ACCOUNTS_DISABLE_PROVIDER=true hardhat test test/deployment/*.ts",
29-
"test:integration": "./scripts/integration"
29+
"test:integration": "./scripts/integration",
30+
"test:coverage": "forge coverage --no-match-coverage \"test/*|contracts/mocks/*\"",
31+
"test:coverage:lcov": "forge coverage --no-match-coverage \"test/*|contracts/mocks/*\" --report lcov"
3032
},
3133
"devDependencies": {
3234
"@defi-wonderland/natspec-smells": "^1.1.6",
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity 0.8.27;
3+
4+
import { Test } from "forge-std/Test.sol";
5+
6+
import { ProvisionManager } from "../../../../contracts/data-service/utilities/ProvisionManager.sol";
7+
import { IHorizonStakingTypes } from "../../../../contracts/interfaces/internal/IHorizonStakingTypes.sol";
8+
import { PartialControllerMock } from "../../mocks/PartialControllerMock.t.sol";
9+
import { HorizonStakingMock } from "../../mocks/HorizonStakingMock.t.sol";
10+
import { ProvisionManagerImpl } from "./ProvisionManagerImpl.t.sol";
11+
12+
contract ProvisionManagerTest is Test {
13+
ProvisionManagerImpl internal _provisionManager;
14+
HorizonStakingMock internal _horizonStakingMock;
15+
16+
function setUp() public {
17+
_horizonStakingMock = new HorizonStakingMock();
18+
19+
PartialControllerMock.Entry[] memory entries = new PartialControllerMock.Entry[](1);
20+
entries[0] = PartialControllerMock.Entry({ name: "Staking", addr: address(_horizonStakingMock) });
21+
_provisionManager = new ProvisionManagerImpl(address(new PartialControllerMock(entries)));
22+
}
23+
24+
/* solhint-disable graph/func-name-mixedcase */
25+
26+
function test_OnlyValidProvision(address serviceProvider) public {
27+
vm.expectRevert(
28+
abi.encodeWithSelector(ProvisionManager.ProvisionManagerProvisionNotFound.selector, serviceProvider)
29+
);
30+
_provisionManager.onlyValidProvision_(serviceProvider);
31+
32+
IHorizonStakingTypes.Provision memory provision;
33+
provision.createdAt = 1;
34+
35+
_horizonStakingMock.setProvision(serviceProvider, address(_provisionManager), provision);
36+
37+
_provisionManager.onlyValidProvision_(serviceProvider);
38+
}
39+
40+
function test_OnlyAuthorizedForProvision(address serviceProvider, address sender) public {
41+
vm.expectRevert(
42+
abi.encodeWithSelector(ProvisionManager.ProvisionManagerNotAuthorized.selector, serviceProvider, sender)
43+
);
44+
vm.prank(sender);
45+
_provisionManager.onlyAuthorizedForProvision_(serviceProvider);
46+
47+
_horizonStakingMock.setIsAuthorized(serviceProvider, address(_provisionManager), sender, true);
48+
vm.prank(sender);
49+
_provisionManager.onlyAuthorizedForProvision_(serviceProvider);
50+
}
51+
52+
/* solhint-enable graph/func-name-mixedcase */
53+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity 0.8.27;
3+
4+
import { ProvisionManager } from "../../../../contracts/data-service/utilities/ProvisionManager.sol";
5+
import { GraphDirectory } from "../../../../contracts/utilities/GraphDirectory.sol";
6+
7+
contract ProvisionManagerImpl is GraphDirectory, ProvisionManager {
8+
constructor(address controller) GraphDirectory(controller) {}
9+
10+
function onlyValidProvision_(address serviceProvider) public view onlyValidProvision(serviceProvider) {}
11+
12+
function onlyAuthorizedForProvision_(
13+
address serviceProvider
14+
) public view onlyAuthorizedForProvision(serviceProvider) {}
15+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity 0.8.27;
3+
4+
import { Test } from "forge-std/Test.sol";
5+
6+
import { StakeClaims } from "../../../contracts/data-service/libraries/StakeClaims.sol";
7+
8+
contract StakeClaimsTest is Test {
9+
/* solhint-disable graph/func-name-mixedcase */
10+
11+
function test_BuildStakeClaimId(address dataService, address serviceProvider, uint256 nonce) public pure {
12+
bytes32 id = StakeClaims.buildStakeClaimId(dataService, serviceProvider, nonce);
13+
bytes32 expectedId = keccak256(abi.encodePacked(dataService, serviceProvider, nonce));
14+
assertEq(id, expectedId, "StakeClaim ID does not match expected value");
15+
}
16+
17+
/* solhint-enable graph/func-name-mixedcase */
18+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity 0.8.27;
3+
4+
import { IHorizonStakingTypes } from "../../../contracts/interfaces/internal/IHorizonStakingTypes.sol";
5+
6+
contract HorizonStakingMock {
7+
mapping(address => mapping(address => IHorizonStakingTypes.Provision)) public provisions;
8+
mapping(address => mapping(address => mapping(address => bool))) public authorizations;
9+
10+
function setProvision(
11+
address serviceProvider,
12+
address verifier,
13+
IHorizonStakingTypes.Provision memory provision
14+
) external {
15+
provisions[serviceProvider][verifier] = provision;
16+
}
17+
18+
function getProvision(
19+
address serviceProvider,
20+
address verifier
21+
) external view returns (IHorizonStakingTypes.Provision memory) {
22+
return provisions[serviceProvider][verifier];
23+
}
24+
25+
function isAuthorized(address serviceProvider, address verifier, address operator) external view returns (bool) {
26+
return authorizations[serviceProvider][verifier][operator];
27+
}
28+
29+
function setIsAuthorized(address serviceProvider, address verifier, address operator, bool authorized) external {
30+
authorizations[serviceProvider][verifier][operator] = authorized;
31+
}
32+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity 0.8.27;
3+
4+
import { PartialControllerMock } from "./PartialControllerMock.t.sol";
5+
6+
contract InvalidControllerMock is PartialControllerMock {
7+
constructor() PartialControllerMock(new PartialControllerMock.Entry[](0)) {}
8+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity 0.8.27;
3+
4+
import { Test } from "forge-std/Test.sol";
5+
6+
import { ControllerMock } from "../../../contracts/mocks/ControllerMock.sol";
7+
8+
contract PartialControllerMock is ControllerMock, Test {
9+
struct Entry {
10+
string name;
11+
address addr;
12+
}
13+
14+
address private _invalidContractAddress;
15+
16+
Entry[] private _contracts;
17+
18+
constructor(Entry[] memory contracts) ControllerMock(address(0)) {
19+
for (uint256 i = 0; i < contracts.length; i++) {
20+
_contracts.push(Entry({ name: contracts[i].name, addr: contracts[i].addr }));
21+
}
22+
_invalidContractAddress = makeAddr("invalidContractAddress");
23+
}
24+
25+
function getContractProxy(bytes32 data) external view override returns (address) {
26+
for (uint256 i = 0; i < _contracts.length; i++) {
27+
if (keccak256(abi.encodePacked(_contracts[i].name)) == data) {
28+
return _contracts[i].addr;
29+
}
30+
}
31+
return _invalidContractAddress;
32+
}
33+
}

packages/horizon/test/unit/payments/recurring-collector/RecurringCollectorAuthorizableTest.t.sol

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,10 @@ import { IAuthorizable } from "../../../../contracts/interfaces/IAuthorizable.so
55
import { RecurringCollector } from "../../../../contracts/payments/collectors/RecurringCollector.sol";
66

77
import { AuthorizableTest } from "../../../unit/utilities/Authorizable.t.sol";
8-
import { RecurringCollectorControllerMock } from "./RecurringCollectorControllerMock.t.sol";
8+
import { InvalidControllerMock } from "../../mocks/InvalidControllerMock.t.sol";
99

1010
contract RecurringCollectorAuthorizableTest is AuthorizableTest {
1111
function newAuthorizable(uint256 thawPeriod) public override returns (IAuthorizable) {
12-
return
13-
new RecurringCollector(
14-
"RecurringCollector",
15-
"1",
16-
address(new RecurringCollectorControllerMock(address(1))),
17-
thawPeriod
18-
);
12+
return new RecurringCollector("RecurringCollector", "1", address(new InvalidControllerMock()), thawPeriod);
1913
}
2014
}

packages/horizon/test/unit/payments/recurring-collector/RecurringCollectorControllerMock.t.sol

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity 0.8.27;
3+
4+
import { IRecurringCollector } from "../../../../contracts/interfaces/IRecurringCollector.sol";
5+
6+
import { RecurringCollectorSharedTest } from "./shared.t.sol";
7+
8+
contract RecurringCollectorBaseTest is RecurringCollectorSharedTest {
9+
/*
10+
* TESTS
11+
*/
12+
13+
/* solhint-disable graph/func-name-mixedcase */
14+
15+
function test_RecoverRCASigner(FuzzyTestAccept memory fuzzyTestAccept) public view {
16+
uint256 signerKey = boundKey(fuzzyTestAccept.unboundedSignerKey);
17+
IRecurringCollector.SignedRCA memory signedRCA = _recurringCollectorHelper.generateSignedRCA(
18+
fuzzyTestAccept.rca,
19+
signerKey
20+
);
21+
22+
assertEq(
23+
_recurringCollector.recoverRCASigner(signedRCA),
24+
vm.addr(signerKey),
25+
"Recovered RCA signer does not match"
26+
);
27+
}
28+
29+
function test_RecoverRCAUSigner(FuzzyTestUpdate memory fuzzyTestUpdate) public view {
30+
uint256 signerKey = boundKey(fuzzyTestUpdate.fuzzyTestAccept.unboundedSignerKey);
31+
IRecurringCollector.SignedRCAU memory signedRCAU = _recurringCollectorHelper.generateSignedRCAU(
32+
fuzzyTestUpdate.rcau,
33+
signerKey
34+
);
35+
36+
assertEq(
37+
_recurringCollector.recoverRCAUSigner(signedRCAU),
38+
vm.addr(signerKey),
39+
"Recovered RCAU signer does not match"
40+
);
41+
}
42+
43+
/* solhint-enable graph/func-name-mixedcase */
44+
}

0 commit comments

Comments
 (0)