Add test for ursula run when a config file in a non-default location is specified - ensure that migration is run on it.

pull/3465/head
derekpierre 2024-03-25 09:28:47 -04:00
parent 5e1911def2
commit 51125a1a7c
No known key found for this signature in database
1 changed files with 118 additions and 0 deletions

View File

@ -0,0 +1,118 @@
import json
import pytest
from nucypher.blockchain.eth.actors import Operator
from nucypher.blockchain.eth.trackers.dkg import ActiveRitualTracker
from nucypher.cli.commands import ursula
from nucypher.cli.main import nucypher_cli
from nucypher.config.base import CharacterConfiguration
from tests.constants import FAKE_PASSWORD_CONFIRMED, MOCK_IP_ADDRESS
@pytest.fixture
def v4_config_file(tempfile_path, ursula_test_config):
config_dictionary = {
"federated_only": None,
"checksum_address": None,
"keystore_path": None,
"domain": str(ursula_test_config.domain),
"learn_on_same_thread": False,
"abort_on_learning_error": False,
"start_learning_now": False,
"save_metadata": False,
"node_storage": {"storage_type": ":memory:"},
"lonely": False,
"eth_provider_uri": ursula_test_config.eth_endpoint,
"poa": None,
"light": False,
"signer_uri": ursula_test_config.signer_uri,
"gas_strategy": "fast",
"max_gas_price": None,
"operator_address": ursula_test_config.operator_address,
"rest_host": MOCK_IP_ADDRESS,
"rest_port": ursula_test_config.rest_port,
"db_filepath": "/root/.local/share/nucypher/ursula.db",
"availability_check": False,
"payment_method": "SubscriptionManager",
"payment_provider": ursula_test_config.polygon_endpoint,
"payment_network": str(
ursula_test_config.domain
), # doesn't really matter what this is
"version": 4,
}
json.dump(config_dictionary, open(tempfile_path, "w"))
return tempfile_path
def test_ursula_run_specified_config_file(
testerchain,
click_runner,
mocker,
ursulas,
monkeypatch,
v4_config_file,
):
# migration spy
migration_spy = mocker.spy(ursula, "migrate")
# Mock DKG
mocker.patch.object(ActiveRitualTracker, "start", autospec=True)
# Mock Teacher Resolution
from nucypher.characters.lawful import Ursula
teacher = ursulas[0]
mocker.patch.object(Ursula, "from_teacher_uri", return_value=teacher)
# don't try unlocking keystore
mocker.patch("nucypher.cli.utils.unlock_nucypher_keystore", return_value=True)
# Mock worker qualification
staking_provider = ursulas[1]
def set_staking_provider_address(operator, *args, **kwargs):
operator.checksum_address = staking_provider.checksum_address
return True
monkeypatch.setattr(Operator, "block_until_ready", set_staking_provider_address)
# mock creation of non-dev ursula
mocker.patch(
"nucypher.cli.commands.ursula.make_cli_character", return_value=ursulas[1]
)
# skip preflight since not in dev mode
mocker.patch("nucypher.characters.lawful.validate_operator_ip", return_value=None)
# manual teacher
run_args = (
"ursula",
"run",
"--dry-run",
"--debug",
"--config-file",
str(v4_config_file.absolute()),
"--teacher",
teacher.rest_url(),
"--no-ip-checkup",
)
assert migration_spy.call_count == 0
result = click_runner.invoke(
nucypher_cli, run_args, catch_exceptions=False, input=FAKE_PASSWORD_CONFIRMED
)
# check that migration was indeed called
assert migration_spy.call_count == 1
# check that migration worked - updated to latest version
with open(v4_config_file.absolute(), "r") as file:
contents = file.read()
config = json.loads(contents)
config_version = config["version"]
assert config_version > 4, "migrated to newer version"
assert config_version == CharacterConfiguration.VERSION
assert result.exit_code == 0, result.output