def test_info(): payload = { 'name': 'attractive-ed-asich', 'id': '0xfb3b68013fa494407b691b4b603d84c66076c0a5ac96a7d6b162d7341d74fa61', 'owner': '0x1111111111111111111111111111111111111111', 'part_of_node': 0, 'dkg_status': 3, 'is_deleted': False, 'first_run': False, 'repair_mode': False } resp_mock = response_mock( requests.codes.ok, json_data={'payload': payload, 'status': 'ok'} ) result = run_command_mock('node_cli.utils.helper.requests.get', resp_mock, info_, ['attractive-ed-asich']) assert result.output == ' Name Id Owner Part_of_node Dkg_status Is_deleted First_run Repair_mode\n--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\nattractive-ed-asich 0xfb3b68013fa494407b691b4b603d84c66076c0a5ac96a7d6b162d7341d74fa61 0x1111111111111111111111111111111111111111 0 3 False False False \n' # noqa assert result.exit_code == 0 payload = ['error'] resp_mock = response_mock( requests.codes.ok, json_data={'payload': payload, 'status': 'error'} ) result = run_command_mock('node_cli.utils.helper.requests.get', resp_mock, info_, ['schain not found']) assert result.output == f'Command failed with following errors:\n--------------------------------------------------\nerror\n--------------------------------------------------\nYou can find more info in {G_CONF_HOME}.skale/.skale-cli-log/debug-node-cli.log\n' # noqa assert result.exit_code == 3
def test_schains(config): resp_mock = response_mock( requests.codes.ok, json_data={'data': RESPONSE_DATA, 'res': 1} ) result = run_command_mock('core.helper.get_request', resp_mock, schains) assert result.exit_code == 0 assert result.output == " Name Status Started At Image \n-------------------------------------------------------------------------------------\nskale_schain_test Running Oct 08 2019 13:59:54 image-skale\nskale_schain_test2 Running (Jan 01 1 00:00:00) Oct 08 2019 13:59:54 image-skale\n" # noqa resp_mock = response_mock( requests.codes.ok, json_data={'data': RESPONSE_DATA, 'res': 0} ) result = run_command_mock('core.helper.get_request', resp_mock, schains) assert result.exit_code == 1 assert result.output == ('----------------------------------' '----------------\n') resp_mock = response_mock( requests.codes.ok, None ) result = run_command_mock('core.helper.get_request', resp_mock, schains) assert result.exit_code == 1 assert result.output == '' resp_mock = response_mock( -1, {'data': RESPONSE_DATA, 'res': 1} ) result = run_command_mock('core.helper.get_request', resp_mock, schains) assert result.exit_code == 0 assert result.output == 'Request failed, status code: -1\n'
def test_metrics(config): response_data = { 'bounties': [ ['2019-10-09 02:46:50', 4018775720164609053497, 0, 1], ['2019-10-09 03:47:00', 4018775720164609053497, 0, 1], ['2019-10-09 04:47:11', 4018775720164609053497, 0, 1], ['2019-10-09 05:47:21', 4018775720164609053497, 0, 1], ['2019-10-09 06:47:32', 4018775720164609053497, 0, 1] ] } resp_mock = response_mock( requests.codes.ok, json_data={'data': response_data, 'res': 1} ) result = run_command_mock('core.helper.get_request', resp_mock, first) assert result.exit_code == 0 # assert result.output == 'Please wait - collecting metrics from blockchain...\n Date Bounty Downtime Latency\n-----------------------------------------------------------------\n2019-10-09 02:46:50 4018775720164609053497 0 1 \n2019-10-09 03:47:00 4018775720164609053497 0 1 \n2019-10-09 04:47:11 4018775720164609053497 0 1 \n2019-10-09 05:47:21 4018775720164609053497 0 1 \n2019-10-09 06:47:32 4018775720164609053497 0 1 \n' # noqa result = run_command_mock('core.helper.get_request', resp_mock, first) assert result.exit_code == 0 # assert result.output == 'Please wait - collecting metrics from blockchain...\n Date Bounty Downtime Latency\n-----------------------------------------------------------------\n2019-10-09 02:46:50 4018775720164609053497 0 1 \n2019-10-09 03:47:00 4018775720164609053497 0 1 \n2019-10-09 04:47:11 4018775720164609053497 0 1 \n2019-10-09 05:47:21 4018775720164609053497 0 1 \n2019-10-09 06:47:32 4018775720164609053497 0 1 \n' # noqa for func in (first, last): resp_mock = response_mock( requests.codes.ok, json_data={'data': {'bounties': []}, 'res': 1} ) result = run_command_mock('core.helper.get_request', resp_mock, func) assert result.exit_code == 0
def test_ls(config): os.environ['TZ'] = 'Europe/London' time.tzset() response_data = [{ 'name': 'test_schain1', 'owner': '0x123', 'indexInOwnerList': 3, 'partOfNode': 0, 'lifetime': 5, 'startDate': 1570115385, 'deposit': 1000000000000000000, 'index': 3 }, { 'name': 'crazy_cats1', 'owner': '0x321', 'indexInOwnerList': 8, 'partOfNode': 0, 'lifetime': 5, 'startDate': 1570469410, 'deposit': 1000000000000000000, 'index': 8 }] resp_mock = response_mock(requests.codes.ok, json_data={ 'data': response_data, 'res': 1 }) result = run_command_mock('core.helper.get_request', resp_mock, ls) assert result.exit_code == 0 assert result.output == ' Name Owner Size Lifetime Created At Deposit \n-----------------------------------------------------------------------------------\ntest_schain1 0x123 0 5 Oct 03 2019 16:09:45 1000000000000000000\ncrazy_cats1 0x321 0 5 Oct 07 2019 18:30:10 1000000000000000000\n' # noqa
def test_node_info_node_about(config): response_data = { 'libraries': { 'javascript': 'N/A', 'python': '0.89.0' }, 'contracts': { 'token': '0x3', 'manager': '0x23' }, 'network': { 'endpoint': 'ws://0.0.0.0:8080' }, 'local_wallet': { 'address': '0xf', 'eth_balance_wei': '15', 'skale_balance_wei': '84312304', 'eth_balance': '2.424', 'skale_balance': '323.123' } } resp_mock = response_mock(requests.codes.ok, json_data={ 'data': response_data, 'res': 1 }) result = run_command_mock('core.core.get_request', resp_mock, node_about) assert result.exit_code == 0 assert result.output == "{'libraries': {'javascript': 'N/A', 'python': '0.89.0'}, 'contracts': {'token': '0x3', 'manager': '0x23'}, 'network': {'endpoint': 'ws://0.0.0.0:8080'}, 'local_wallet': {'address': '0xf', 'eth_balance_wei': '15', 'skale_balance_wei': '84312304', 'eth_balance': '2.424', 'skale_balance': '323.123'}}\n" # noqa
def test_ls(): os.environ['TZ'] = 'Europe/London' time.tzset() payload = [ { 'name': 'test_schain1', 'mainnetOwner': '0x123', 'indexInOwnerList': 3, 'partOfNode': 0, 'lifetime': 5, 'startDate': 1570115385, 'deposit': 1000000000000000000, 'index': 3, 'generation': 1, 'originator': '0x465' }, { 'name': 'crazy_cats1', 'mainnetOwner': '0x321', 'indexInOwnerList': 8, 'partOfNode': 0, 'lifetime': 5, 'startDate': 1570469410, 'deposit': 1000000000000000000, 'index': 8, 'generation': 0, 'originator': '0x0' } ] resp_mock = response_mock( requests.codes.ok, json_data={'payload': payload, 'status': 'ok'} ) result = run_command_mock('node_cli.utils.helper.requests.get', resp_mock, ls) assert result.exit_code == 0 assert result.output == ' Name Owner Size Lifetime Created At Deposit Generation Originator\n-------------------------------------------------------------------------------------------------------------\ntest_schain1 0x123 0 5 Oct 03 2019 16:09:45 1000000000000000000 1 0x465 \ncrazy_cats1 0x321 0 5 Oct 07 2019 18:30:10 1000000000000000000 0 0x0 \n' # noqa
def test_node_info_node_info_in_maintenance(): payload = { 'node_info': { 'name': 'test', 'ip': '0.0.0.0', 'publicIP': '1.1.1.1', 'port': 10001, 'publicKey': '0x7', 'start_date': 1570114466, 'leaving_date': 0, 'last_reward_date': 1570628924, 'second_address': 0, 'status': 3, 'id': 32, 'owner': '0x23', 'domain_name': 'skale.test' } } resp_mock = response_mock(requests.codes.ok, json_data={ 'payload': payload, 'status': 'ok' }) result = run_command_mock('node_cli.utils.helper.requests.get', resp_mock, node_info) assert result.exit_code == 0 assert result.output == '--------------------------------------------------\nNode info\nName: test\nID: 32\nIP: 0.0.0.0\nPublic IP: 1.1.1.1\nPort: 10001\nDomain name: skale.test\nStatus: In Maintenance\n--------------------------------------------------\n' # noqa
def test_node_info_node_info_not_created(): payload = { 'node_info': { 'name': 'test', 'ip': '0.0.0.0', 'publicIP': '1.1.1.1', 'port': 10001, 'publicKey': '0x7', 'start_date': 1570114466, 'leaving_date': 0, 'last_reward_date': 1570628924, 'second_address': 0, 'status': 5, 'id': 32, 'owner': '0x23', 'domain_name': 'skale.test' } } resp_mock = response_mock(requests.codes.ok, json_data={ 'payload': payload, 'status': 'ok' }) result = run_command_mock('node_cli.utils.helper.requests.get', resp_mock, node_info) assert result.exit_code == 0 assert result.output == 'This SKALE node is not registered on SKALE Manager yet\n'
def test_checks(): payload = [{ "name": "test_schain", "healthchecks": { "config_dir": True, "dkg": False, "config": False, "volume": False, "skaled_container": False, "ima_container": False, "firewall_rules": False, "rpc": False, "blocks": False } }] resp_mock = response_mock(requests.codes.ok, json_data={ 'payload': payload, 'status': 'ok' }) result = run_command_mock('node_cli.utils.helper.requests.get', resp_mock, schains) assert result.exit_code == 0 assert result.output == 'sChain Name Config directory DKG Config file Volume Container IMA Firewall RPC Blocks\n-------------------------------------------------------------------------------------------------------------\ntest_schain True False False False False False False False False \n' # noqa result = run_command_mock('node_cli.utils.helper.requests.get', resp_mock, schains, ['--json']) assert result.exit_code == 0 assert result.output == '[{"name": "test_schain", "healthchecks": {"config_dir": true, "dkg": false, "config": false, "volume": false, "skaled_container": false, "ima_container": false, "firewall_rules": false, "rpc": false, "blocks": false}}]\n' # noqa
def test_dkg(): os.environ['TZ'] = 'Europe/London' time.tzset() payload = [ { 'name': 'melodic-aldhibah', 'added_at': 1578497212.645233, 'dkg_status': 2, 'dkg_status_name': 'IN_PROGRESS', 'is_deleted': False } ] resp_mock = response_mock( requests.codes.ok, json_data={'payload': payload, 'status': 'ok'} ) result = run_command_mock('node_cli.utils.helper.requests.get', resp_mock, dkg) assert result.exit_code == 0 assert result.output == ' sChain Name DKG Status Added At sChain Status\n---------------------------------------------------------------------\nmelodic-aldhibah IN_PROGRESS Jan 08 2020 15:26:52 Exists \n' # noqa result = run_command_mock('node_cli.utils.helper.requests.get', resp_mock, dkg, ['--all']) assert result.exit_code == 0 assert result.output == ' sChain Name DKG Status Added At sChain Status\n---------------------------------------------------------------------\nmelodic-aldhibah IN_PROGRESS Jan 08 2020 15:26:52 Exists \n' # noqa
def test_show(resource_alloc_config): resp_mock = response_mock(requests.codes.created) write_json(RESOURCE_ALLOCATION_FILEPATH, TEST_CONFIG) result = run_command_mock('node_cli.utils.helper.post_request', resp_mock, show) assert result.output == json.dumps(TEST_CONFIG, indent=4) + '\n' assert result.exit_code == 0
def test_ls(): resp_mock = response_mock( requests.codes.ok, json_data={'data': RESPONSE_DATA, 'res': 1} ) result = run_command_mock('core.helper.get_request', resp_mock, ls) assert result.exit_code == 0 assert result.output == ' Name Status Started At Image \n-------------------------------------------------------------------------------------\nskale_schain_test Running Oct 08 2019 13:59:54 image-skale\nskale_schain_test2 Running (Jan 01 1 00:00:00) Oct 08 2019 13:59:54 image-skale\n' # noqa
def test_purge(config): params = ['--yes'] resp_mock = response_mock(requests.codes.created) with mock.patch('core.node.subprocess.run'): result = run_command_mock('core.node.post', resp_mock, purge_node, params) assert result.exit_code == 0 assert result.output == '' # noqa
def test_maintenance_on(): resp_mock = response_mock(requests.codes.ok, { 'status': 'ok', 'payload': None }) result = run_command_mock('node_cli.utils.helper.requests.post', resp_mock, set_node_in_maintenance, ['--yes']) assert result.exit_code == 0 assert result.output == 'Setting maintenance mode on...\nNode is successfully set in maintenance mode\n' # noqa
def test_maintenance_off(mocked_g_config): resp_mock = response_mock(requests.codes.ok, { 'status': 'ok', 'payload': None }) result = run_command_mock('node_cli.utils.helper.requests.post', resp_mock, remove_node_from_maintenance) assert result.exit_code == 0 assert result.output == 'Setting maintenance mode off...\nNode is successfully removed from maintenance mode\n' # noqa
def test_init_node(config): resp_mock = response_mock(requests.codes.created) with mock.patch('subprocess.run'), \ mock.patch('cli.node.install_host_dependencies'), \ mock.patch('core.node.prepare_host'), \ mock.patch('core.host.init_data_dir'): result = run_command_mock('core.node.post', resp_mock, init_node, ['--env-file', './tests/test-env']) assert result.exit_code == 0 assert result.output == '' # noqa
def test_wallet_send(): resp_mock = response_mock(requests.codes.ok, { 'status': 'ok', 'payload': None }) result = run_command_mock( 'node_cli.utils.helper.requests.post', resp_mock, send, ['0x00000000000000000000000000000000', '10', '--yes']) assert result.exit_code == 0 assert result.output == 'Funds were successfully transferred\n' # noqa
def test_get_schain_config(): response_data = { 'nodeInfo': { 'nodeID': 2, 'nodeName': 'testnet-1', 'basePort': 10011, 'httpRpcPort': 10009, 'httpsRpcPort': 11118, 'wsRpcPort': 10118, 'wssRpcPort': 13219, 'bindIP': '123.123.123.123' }, 'sChain': { 'schainID': 1, 'schainName': 'test1', 'nodes': [{ 'nodeID': 2, 'nodeName': 'testnet-1', 'basePort': 10011, 'httpRpcPort': 10013, 'httpsRpcPort': 10018, 'wsRpcPort': 10014, 'wssRpcPort': 10019, 'publicKey': 'public_key', 'owner': '0xe3213', 'schainIndex': 1, 'ip': '213.13.123.13', 'publicIP': '1.1.1.1' }, { 'nodeID': 0, 'nodeName': 'testnet-2', 'basePort': 10077, 'httpRpcPort': 10079, 'httpsRpcPort': 10084, 'wsRpcPort': 10080, 'wssRpcPort': 10085, 'publicKey': 'public_key352', 'owner': '0x323', 'schainIndex': 2, 'ip': '2.2.2.2', 'publicIP': '3.3.3.3' }] } } resp_mock = response_mock(requests.codes.ok, json_data={ 'data': response_data, 'res': 1 }) result = run_command_mock('core.helper.get_request', resp_mock, get_schain_config, ['test1']) assert result.exit_code == 0 assert result.output == "{'nodeInfo': {'basePort': 10011,\n 'bindIP': '123.123.123.123',\n 'httpRpcPort': 10009,\n 'httpsRpcPort': 11118,\n 'nodeID': 2,\n 'nodeName': 'testnet-1',\n 'wsRpcPort': 10118,\n 'wssRpcPort': 13219},\n 'sChain': {'nodes': [{'basePort': 10011,\n 'httpRpcPort': 10013,\n 'httpsRpcPort': 10018,\n 'ip': '213.13.123.13',\n 'nodeID': 2,\n 'nodeName': 'testnet-1',\n 'owner': '0xe3213',\n 'publicIP': '1.1.1.1',\n 'publicKey': 'public_key',\n 'schainIndex': 1,\n 'wsRpcPort': 10014,\n 'wssRpcPort': 10019},\n {'basePort': 10077,\n 'httpRpcPort': 10079,\n 'httpsRpcPort': 10084,\n 'ip': '2.2.2.2',\n 'nodeID': 0,\n 'nodeName': 'testnet-2',\n 'owner': '0x323',\n 'publicIP': '3.3.3.3',\n 'publicKey': 'public_key352',\n 'schainIndex': 2,\n 'wsRpcPort': 10080,\n 'wssRpcPort': 10085}],\n 'schainID': 1,\n 'schainName': 'test1'}}\n" # noqa
def test_generate(): safe_mkdir(NODE_DATA_PATH) resp_mock = response_mock(requests.codes.created) with mock.patch('node_cli.core.resources.get_disk_size', return_value=BIG_DISK_SIZE): result = run_command_mock('node_cli.utils.helper.post_request', resp_mock, generate, ['./tests/test-env', '--yes']) assert result.output == (f'Resource allocation file generated: ' f'{RESOURCE_ALLOCATION_FILEPATH}\n') assert result.exit_code == 0
def test_turn_off_maintenance_on(mocked_g_config): resp_mock = response_mock(requests.codes.ok, { 'status': 'ok', 'payload': None }) with mock.patch('subprocess.run', new=subprocess_run_mock), \ mock.patch('node_cli.core.node.turn_off_op'), \ mock.patch('node_cli.core.node.is_node_inited', return_value=True): result = run_command_mock('node_cli.utils.helper.requests.post', resp_mock, _turn_off, ['--maintenance-on', '--yes']) assert result.exit_code == 0 assert result.output == 'Setting maintenance mode on...\nNode is successfully set in maintenance mode\n' # noqa
def test_register_with_no_alloc(mocked_g_config): resp_mock = response_mock(requests.codes.ok, { 'status': 'ok', 'payload': None }) result = run_command_mock('node_cli.utils.helper.requests.post', resp_mock, register_node, ['--name', 'test-node', '-d', 'skale.test'], input='0.0.0.0\n') assert result.exit_code == 8 print(repr(result.output)) assert result.output == f'Enter node public IP: 0.0.0.0\nCommand failed with following errors:\n--------------------------------------------------\nNode hasn\'t been inited before.\nYou should run < skale node init >\n--------------------------------------------------\nYou can find more info in {G_CONF_HOME}.skale/.skale-cli-log/debug-node-cli.log\n' # noqa
def test_node_signature(): signature_sample = '0x1231231231' response_data = { 'status': 'ok', 'payload': { 'signature': signature_sample } } resp_mock = response_mock(requests.codes.ok, json_data=response_data) result = run_command_mock('node_cli.utils.helper.requests.get', resp_mock, signature, ['1']) assert result.exit_code == 0 assert result.output == f'Signature: {signature_sample}\n'
def test_set_domain_name(): resp_mock = response_mock(requests.codes.ok, { 'status': 'ok', 'payload': None }) with mock.patch('node_cli.utils.decorators.is_node_inited', return_value=True): result = run_command_mock('node_cli.utils.helper.requests.post', resp_mock, _set_domain_name, ['-d', 'skale.test', '--yes']) assert result.exit_code == 0 assert result.output == 'Setting new domain name: skale.test\nDomain name successfully changed\n' # noqa
def test_wallet_send_with_error(): resp_mock = response_mock( requests.codes.ok, { 'status': 'error', 'payload': ['Strange error'] }, ) result = run_command_mock( 'node_cli.utils.helper.requests.post', resp_mock, send, ['0x00000000000000000000000000000000', '10', '--yes']) assert result.exit_code == 3 assert result.output == f'Command failed with following errors:\n--------------------------------------------------\nStrange error\n--------------------------------------------------\nYou can find more info in {G_CONF_HOME}.skale/.skale-cli-log/debug-node-cli.log\n' # noqa
def test_register_node_with_default_port(resource_alloc, mocked_g_config): resp_mock = response_mock(requests.codes.ok, { 'status': 'ok', 'payload': None }) with mock.patch('node_cli.utils.decorators.is_node_inited', return_value=True): result = run_command_mock('node_cli.utils.helper.requests.post', resp_mock, register_node, ['--name', 'test-node', '-d', 'skale.test'], input='0.0.0.0\n') assert result.exit_code == 0 assert result.output == 'Enter node public IP: 0.0.0.0\nNode registered in SKALE manager.\nFor more info run < skale node info >\n' # noqa
def test_repair(): os.environ['TZ'] = 'Europe/London' time.tzset() payload = [] resp_mock = response_mock( requests.codes.ok, json_data={'payload': payload, 'status': 'ok'} ) result = run_command_mock('node_cli.utils.helper.requests.post', resp_mock, repair, ['test-schain', '--yes']) assert result.output == 'Schain has been set for repair\n' assert result.exit_code == 0 payload = ['error'] resp_mock = response_mock( requests.codes.ok, json_data={'payload': payload, 'status': 'error'} ) result = run_command_mock('node_cli.utils.helper.requests.post', resp_mock, repair, ['test-schain', '--yes']) print(repr(result.output)) assert result.exit_code == 3 assert result.output == f'Command failed with following errors:\n--------------------------------------------------\nerror\n--------------------------------------------------\nYou can find more info in {G_CONF_HOME}.skale/.skale-cli-log/debug-node-cli.log\n' # noqa
def test_exit_status(): payload = { 'status': 'ACTIVE', 'data': [{'name': 'test', 'status': 'ACTIVE'}], 'exit_time': 0 } resp_mock = response_mock( requests.codes.ok, json_data={'payload': payload, 'status': 'ok'} ) result = run_command_mock( 'node_cli.utils.helper.requests.get', resp_mock, status, ['--format', 'json']) assert result.exit_code == 0 assert result.output == "{'status': 'ACTIVE', 'data': [{'name': 'test', 'status': 'ACTIVE'}], 'exit_time': 0}\n" # noqa
def test_update_node(config): params = ['--env-file', './tests/test-env', '--yes'] resp_mock = response_mock(requests.codes.created) with mock.patch('subprocess.run'), \ mock.patch('cli.node.install_host_dependencies'), \ mock.patch('core.node.get_flask_secret_key'), \ mock.patch('core.node.save_env_params'), \ mock.patch('core.host.init_data_dir'): result = run_command_mock('core.node.post', resp_mock, update_node, params, input='/dev/sdp') assert result.exit_code == 0 assert result.output == ''
def test_init_node(no_resource_file): # todo: write new init node test resp_mock = response_mock(requests.codes.created) assert not os.path.isfile(RESOURCE_ALLOCATION_FILEPATH) env_filepath = './tests/test-env' with mock.patch('subprocess.run', new=subprocess_run_mock), \ mock.patch('node_cli.core.resources.get_disk_size', return_value=BIG_DISK_SIZE), \ mock.patch('node_cli.core.host.prepare_host'), \ mock.patch('node_cli.core.host.init_data_dir'), \ mock.patch('node_cli.core.node.init_op'), \ mock.patch('node_cli.core.node.is_base_containers_alive', return_value=True), \ mock.patch('node_cli.utils.helper.post_request', resp_mock): init(env_filepath) assert os.path.isfile(RESOURCE_ALLOCATION_FILEPATH)
def test_dump(config): archive_filename = 'skale-logs-dump-2019-10-08-17:40:00.tar.gz' resp_mock = response_mock(requests.codes.ok, headers={ 'Content-Disposition': f'attachment; filename="{archive_filename}"' }, raw=BytesIO()) with mock.patch('requests.get') as req_get_mock: req_get_mock.return_value.__enter__.return_value = resp_mock result = run_command(dump, ['.']) assert result.exit_code == 0 assert result.output == f'File {archive_filename} downloaded\n' if os.path.exists(archive_filename): os.remove(archive_filename)