mirror of https://github.com/nucypher/nucypher.git
120 lines
3.9 KiB
Python
120 lines
3.9 KiB
Python
import pytest
|
|
from nucypher_core.ferveo import Keypair, Validator
|
|
|
|
from nucypher.blockchain.economics import EconomicsFactory
|
|
from nucypher.blockchain.eth.actors import Operator
|
|
from nucypher.blockchain.eth.agents import ContractAgency
|
|
from nucypher.blockchain.eth.interfaces import BlockchainInterfaceFactory
|
|
from nucypher.blockchain.eth.registry import InMemoryContractRegistry
|
|
from nucypher.crypto.ferveo import dkg
|
|
from nucypher.crypto.powers import TransactingPower
|
|
from nucypher.network.nodes import Teacher
|
|
from tests.mock.interfaces import MockBlockchain, MockEthereumClient
|
|
|
|
|
|
def pytest_addhooks(pluginmanager):
|
|
pluginmanager.set_blocked('ape_test')
|
|
|
|
|
|
@pytest.fixture(scope='module')
|
|
def test_registry():
|
|
return InMemoryContractRegistry()
|
|
|
|
|
|
@pytest.fixture(scope='function')
|
|
def mock_ethereum_client(mocker):
|
|
web3_mock = mocker.Mock()
|
|
mock_client = MockEthereumClient(w3=web3_mock)
|
|
return mock_client
|
|
|
|
|
|
@pytest.fixture(scope='module', autouse=True)
|
|
def mock_transacting_power(module_mocker):
|
|
module_mocker.patch.object(TransactingPower, 'unlock')
|
|
|
|
|
|
@pytest.fixture(scope='module', autouse=True)
|
|
def mock_contract_agency(module_mocker, application_economics):
|
|
|
|
# Patch
|
|
module_mocker.patch.object(EconomicsFactory, 'get_economics', return_value=application_economics)
|
|
|
|
from tests.mock.agents import MockContractAgency
|
|
|
|
# Monkeypatch # TODO: Use better tooling for this monkeypatch?
|
|
get_agent = ContractAgency.get_agent
|
|
get_agent_by_name = ContractAgency.get_agent_by_contract_name
|
|
ContractAgency.get_agent = MockContractAgency.get_agent
|
|
ContractAgency.get_agent_by_contract_name = MockContractAgency.get_agent_by_contract_name
|
|
|
|
# Test
|
|
yield MockContractAgency()
|
|
|
|
# Restore the monkey patching
|
|
ContractAgency.get_agent = get_agent
|
|
ContractAgency.get_agent_by_contract_name = get_agent_by_name
|
|
|
|
|
|
@pytest.fixture(scope='session', autouse=True)
|
|
def mock_operator_bonding(session_mocker):
|
|
session_mocker.patch.object(Teacher, '_operator_is_bonded', autospec=True)
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def testerchain(mock_testerchain, module_mocker) -> MockBlockchain:
|
|
def always_use_mock(*a, **k):
|
|
return mock_testerchain
|
|
|
|
module_mocker.patch.object(
|
|
BlockchainInterfaceFactory, "get_interface", always_use_mock
|
|
)
|
|
return mock_testerchain
|
|
|
|
|
|
@pytest.fixture(scope="module", autouse=True)
|
|
def staking_providers(testerchain, test_registry, monkeymodule):
|
|
def faked(self, *args, **kwargs):
|
|
return testerchain.stake_providers_accounts[
|
|
testerchain.ursulas_accounts.index(self.transacting_power.account)
|
|
]
|
|
|
|
Operator.get_staking_provider_address = faked
|
|
return testerchain.stake_providers_accounts
|
|
|
|
|
|
@pytest.fixture(scope="module", autouse=True)
|
|
def mock_substantiate_stamp(module_mocker, monkeymodule):
|
|
fake_signature = b"\xb1W5?\x9b\xbaix>'\xfe`\x1b\x9f\xeb*9l\xc0\xa7\xb9V\x9a\x83\x84\x04\x97\x0c\xad\x99\x86\x81W\x93l\xc3\xbde\x03\xcd\"Y\xce\xcb\xf7\x02z\xf6\x9c\xac\x84\x05R\x9a\x9f\x97\xf7\xa02\xb2\xda\xa1Gv\x01"
|
|
from nucypher.characters.lawful import Ursula
|
|
|
|
module_mocker.patch.object(Ursula, "_substantiate_stamp", autospec=True)
|
|
module_mocker.patch.object(Ursula, "operator_signature", fake_signature)
|
|
module_mocker.patch.object(Teacher, "validate_operator")
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def random_transcript(get_random_checksum_address):
|
|
ritual_id = 0
|
|
num_shares = 4
|
|
threshold = 3
|
|
validators = []
|
|
for i in range(0, num_shares):
|
|
validators.append(
|
|
Validator(
|
|
address=get_random_checksum_address(),
|
|
public_key=Keypair.random().public_key(),
|
|
)
|
|
)
|
|
|
|
validators.sort(key=lambda x: x.address) # must be sorte
|
|
|
|
transcript = dkg.generate_transcript(
|
|
ritual_id=ritual_id,
|
|
me=validators[0],
|
|
shares=num_shares,
|
|
threshold=threshold,
|
|
nodes=validators,
|
|
)
|
|
|
|
return transcript
|