import pytest import requests from pyhmy import blockchain from pyhmy.rpc import exceptions test_epoch_number = 0 genesis_block_number = 0 test_block_number = 1 test_block_hash = None fake_shard = "http://example.com" address = "one155jp2y76nazx8uw5sa94fr0m4s5aj8e5xm6fu3" def _test_blockchain_rpc(fn, *args, **kwargs): if not callable(fn): pytest.fail(f"Invalid function: {fn}") try: response = fn(*args, **kwargs) except Exception as e: if isinstance( e, exceptions.RPCError ) and "does not exist/is not available" in str(e): pytest.skip(f"{str(e)}") pytest.fail(f"Unexpected error: {e.__class__} {e}") return response def test_get_node_metadata(setup_blockchain): metadata = _test_blockchain_rpc(blockchain.get_node_metadata) assert isinstance(metadata, dict) def test_get_sharding_structure(setup_blockchain): sharding_structure = _test_blockchain_rpc(blockchain.get_sharding_structure) assert isinstance(sharding_structure, list) assert len(sharding_structure) > 0 def test_get_leader_address(setup_blockchain): leader = _test_blockchain_rpc(blockchain.get_leader_address) assert isinstance(leader, str) assert "one1" in leader def test_get_block_number(setup_blockchain): current_block_number = _test_blockchain_rpc(blockchain.get_block_number) assert isinstance(current_block_number, int) def test_get_current_epoch(setup_blockchain): current_epoch = _test_blockchain_rpc(blockchain.get_current_epoch) assert isinstance(current_epoch, int) def tset_get_gas_price(setup_blockchain): gas = _test_blockchain_rpc(blockchain.get_gas_price) assert isinstance(gas, int) def test_get_num_peers(setup_blockchain): peers = _test_blockchain_rpc(blockchain.get_num_peers) assert isinstance(peers, int) def test_get_latest_header(setup_blockchain): header = _test_blockchain_rpc(blockchain.get_latest_header) assert isinstance(header, dict) def test_get_latest_chain_headers(setup_blockchain): header_pair = _test_blockchain_rpc(blockchain.get_latest_chain_headers) assert isinstance(header_pair, dict) def test_get_block_by_number(setup_blockchain): global test_block_hash block = _test_blockchain_rpc(blockchain.get_block_by_number, test_block_number) assert isinstance(block, dict) assert "hash" in block.keys() test_block_hash = block["hash"] def test_get_block_by_hash(setup_blockchain): if not test_block_hash: pytest.skip("Failed to get reference block hash") block = _test_blockchain_rpc(blockchain.get_block_by_hash, test_block_hash) assert isinstance(block, dict) def test_get_block_transaction_count_by_number(setup_blockchain): tx_count = _test_blockchain_rpc( blockchain.get_block_transaction_count_by_number, test_block_number ) assert isinstance(tx_count, int) def test_get_block_transaction_count_by_hash(setup_blockchain): if not test_block_hash: pytest.skip("Failed to get reference block hash") tx_count = _test_blockchain_rpc( blockchain.get_block_transaction_count_by_hash, test_block_hash ) assert isinstance(tx_count, int) def test_get_blocks(setup_blockchain): blocks = _test_blockchain_rpc( blockchain.get_blocks, genesis_block_number, test_block_number ) assert isinstance(blocks, list) assert len(blocks) == (test_block_number - genesis_block_number + 1) def test_get_block_signers(setup_blockchain): block_signers = _test_blockchain_rpc( blockchain.get_block_signers, test_block_number ) assert isinstance(block_signers, list) assert len(block_signers) > 0 def test_get_validators(setup_blockchain): validators = _test_blockchain_rpc(blockchain.get_validators, test_epoch_number) assert isinstance(validators, dict) assert "validators" in validators.keys() assert len(validators["validators"]) > 0 def test_get_shard(setup_blockchain): shard = _test_blockchain_rpc(blockchain.get_shard) assert isinstance(shard, int) assert shard == 0 def test_get_staking_epoch(setup_blockchain): staking_epoch = _test_blockchain_rpc(blockchain.get_staking_epoch) assert isinstance(staking_epoch, int) def test_get_prestaking_epoch(setup_blockchain): prestaking_epoch = _test_blockchain_rpc(blockchain.get_prestaking_epoch) assert isinstance(prestaking_epoch, int) def test_get_bad_blocks(setup_blockchain): # TODO: Remove skip when RPC is fixed pytest.skip("Known error with hmyv2_getCurrentBadBlocks") bad_blocks = _test_blockchain_rpc(blockchain.get_bad_blocks) assert isinstance(bad_blocks, list) def test_get_validator_keys(setup_blockchain): keys = _test_blockchain_rpc(blockchain.get_validator_keys, test_epoch_number) assert isinstance(keys, list) assert len(keys) > 0 def test_get_block_signers_keys(setup_blockchain): keys = _test_blockchain_rpc(blockchain.get_block_signers_keys, test_block_number) assert isinstance(keys, list) assert len(keys) > 0 def test_chain_id(setup_blockchain): chain_id = _test_blockchain_rpc(blockchain.chain_id) assert isinstance(chain_id, int) def test_get_peer_info(setup_blockchain): peer_info = _test_blockchain_rpc(blockchain.get_peer_info) assert isinstance(peer_info, dict) def test_protocol_version(setup_blockchain): protocol_version = _test_blockchain_rpc(blockchain.protocol_version) assert isinstance(protocol_version, int) def test_is_last_block(setup_blockchain): is_last_block = _test_blockchain_rpc(blockchain.is_last_block, 0) assert isinstance(is_last_block, bool) assert not is_last_block def test_epoch_last_block(setup_blockchain): epoch_last_block = _test_blockchain_rpc(blockchain.epoch_last_block, 0) assert isinstance(epoch_last_block, int) def test_get_circulating_supply(setup_blockchain): circulating_supply = _test_blockchain_rpc(blockchain.get_circulating_supply) assert isinstance(circulating_supply, str) def test_get_total_supply(setup_blockchain): total_supply = _test_blockchain_rpc(blockchain.get_total_supply) assert isinstance(total_supply, str) or total_supply == None def test_get_last_cross_links(setup_blockchain): last_cross_links = _test_blockchain_rpc(blockchain.get_last_cross_links) assert isinstance(last_cross_links, list) def test_get_gas_price(setup_blockchain): gas_price = _test_blockchain_rpc(blockchain.get_gas_price) assert isinstance(gas_price, int) def test_get_version(setup_blockchain): version = _test_blockchain_rpc(blockchain.get_version) assert isinstance(version, int) def test_get_header_by_number(setup_blockchain): header_pair = _test_blockchain_rpc(blockchain.get_header_by_number, 0) assert isinstance(header_pair, dict) def test_get_block_staking_transaction_count_by_number(setup_blockchain): tx_count = _test_blockchain_rpc( blockchain.get_block_staking_transaction_count_by_number, test_block_number ) assert isinstance(tx_count, int) def test_get_block_staking_transaction_count_by_hash(setup_blockchain): if not test_block_hash: pytest.skip("Failed to get reference block hash") tx_count = _test_blockchain_rpc( blockchain.get_block_staking_transaction_count_by_hash, test_block_hash ) assert isinstance(tx_count, int) def test_is_block_signer(setup_blockchain): is_signer = _test_blockchain_rpc( blockchain.is_block_signer, test_block_number, address ) assert isinstance(is_signer, bool) def test_get_signed_blocks(setup_blockchain): signed_blocks = _test_blockchain_rpc(blockchain.get_signed_blocks, address) assert isinstance(signed_blocks, int) def test_in_sync(setup_blockchain): in_sync = _test_blockchain_rpc(blockchain.in_sync) assert isinstance(in_sync, bool) def test_beacon_in_sync(setup_blockchain): beacon_in_sync = _test_blockchain_rpc(blockchain.beacon_in_sync) assert isinstance(beacon_in_sync, bool) def test_errors(): with pytest.raises(exceptions.RPCError): blockchain.chain_id(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_node_metadata(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_peer_info(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.protocol_version(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_shard(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_staking_epoch(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_prestaking_epoch(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_sharding_structure(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_leader_address(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.is_last_block(0, fake_shard) with pytest.raises(exceptions.RPCError): blockchain.epoch_last_block(0, fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_circulating_supply(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_total_supply(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_block_number(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_current_epoch(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_last_cross_links(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_gas_price(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_num_peers(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_version(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_latest_header(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_header_by_number(0, fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_latest_chain_headers(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_block_by_number(0, endpoint=fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_block_by_hash("", endpoint=fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_block_transaction_count_by_number(0, fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_block_transaction_count_by_hash("", fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_block_staking_transaction_count_by_number(0, fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_block_staking_transaction_count_by_hash("", fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_blocks(0, 1, endpoint=fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_block_signers(0, fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_block_signers_keys(0, fake_shard) with pytest.raises(exceptions.RPCError): blockchain.is_block_signer(0, "", fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_signed_blocks("", fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_validators(1, fake_shard) with pytest.raises(exceptions.RPCError): blockchain.get_validator_keys(0, fake_shard) with pytest.raises(exceptions.RPCError): blockchain.in_sync(fake_shard) with pytest.raises(exceptions.RPCError): blockchain.beacon_in_sync(fake_shard)