async def test_fallback_to_second_if_first_failed(): rs = jsonrpc.async_client.RequestWithBackups(backups=["backup"]) client = AsyncClient("primary", rs=rs) # primary will fail immediately, backup is slow but success client._send_http_request = gen_metadata_response(client, fail="primary", snap="backup") metadata = await client.get_metadata() assert metadata.script_hash_allow_list == ["backup"]
async def test_raises_error_if_primary_and_backup_both_failed(): async with AsyncClient("url", rs=jsonrpc.async_client.RequestWithBackups(backups=["url"])) as client: with pytest.raises(aiohttp.InvalidURL): assert await client.get_currencies() async with AsyncClient("url", rs=jsonrpc.async_client.RequestWithBackups(backups=["url"], fallback=True)) as client: with pytest.raises(aiohttp.InvalidURL): assert await client.get_currencies()
async def test_fallback_to_backups_when_primary_failed(): client = AsyncClient( "primary", rs=jsonrpc.async_client.RequestWithBackups(backups=["backup"], fallback=True), ) client._send_http_request = gen_metadata_response(client, fail="primary") for _ in range(10): metadata = await client.get_metadata() assert metadata.script_hash_allow_list == ["backup"]
async def test_fallback_strategy_always_returns_primary_response_if_it_successes(): client = AsyncClient( "primary", rs=jsonrpc.async_client.RequestWithBackups(backups=["backup"], fallback=True), ) client._send_http_request = gen_metadata_response(client) for _ in range(10): metadata = await client.get_metadata() assert metadata.script_hash_allow_list == ["primary"]
async def test_first_success_strategy_returns_first_completed_success_response(): rs = jsonrpc.async_client.RequestWithBackups(backups=["backup"]) client = AsyncClient("primary", rs=rs) client._send_http_request = gen_metadata_response(client, snap="primary") metadata = await client.get_metadata() assert metadata.script_hash_allow_list == ["backup"] client._send_http_request = gen_metadata_response(client, snap="backup") metadata = await client.get_metadata() assert metadata.script_hash_allow_list == ["primary"]
async def test_submit_ignores_stale_resposne_error(client: AsyncClient): account = await Faucet(client).gen_account() script = stdlib.encode_rotate_dual_attestation_info_script( new_url="http://localhost".encode("utf-8"), new_key=account.compliance_public_key_bytes ) txn = account.sign(create_transaction(account, script, 0)) state = client.get_last_known_state() client._last_known_server_state.version = state.version + 1_000_000_000 await client.submit(txn) client._last_known_server_state = state ret = await client.wait_for_transaction(txn) assert ret
async def test_handle_stale_response_error(client: AsyncClient): last = (await client.get_metadata()).version for i in range(0, 20): metadata = await client.get_metadata() assert metadata.version >= last assert client.get_last_known_state().version == metadata.version last = metadata.version
async def test_get_last_known_state(client: AsyncClient): metadata = await client.get_metadata() assert metadata is not None state = client.get_last_known_state() assert state is not None assert metadata.chain_id == state.chain_id assert metadata.version == state.version assert metadata.timestamp == state.timestamp_usecs
def create_client() -> AsyncClient: """Create an `AsyncClient` initialized with Testnet JSON-RPC URL""" return AsyncClient(os.getenv("DIEM_JSON_RPC_URL") or JSON_RPC_URL)
async def test_invalid_server_url(): async with AsyncClient("url") as client: with pytest.raises(aiohttp.InvalidURL): await client.get_currencies()
async def test_update_last_known_state(client: AsyncClient): assert client.get_last_known_state() is not None client.update_last_known_state(2, 2, 2) assert client.get_last_known_state() is not None assert client.get_last_known_state().chain_id == 2 assert client.get_last_known_state().version == 2 assert client.get_last_known_state().timestamp_usecs == 2 # chain id mismatch will raise invalid server response instead of # stale response error with pytest.raises(jsonrpc.InvalidServerResponse): client.update_last_known_state(1, 1, 1) with pytest.raises(jsonrpc.StaleResponseError): client.update_last_known_state(2, 1, 2) with pytest.raises(jsonrpc.StaleResponseError): client.update_last_known_state(2, 2, 1) with pytest.raises(jsonrpc.StaleResponseError): client.update_last_known_state(2, 1, 1) client.update_last_known_state(2, 2, 2) assert client.get_last_known_state().chain_id == 2 assert client.get_last_known_state().version == 2 assert client.get_last_known_state().timestamp_usecs == 2 client.update_last_known_state(2, 3, 3) assert client.get_last_known_state().chain_id == 2 assert client.get_last_known_state().version == 3 assert client.get_last_known_state().timestamp_usecs == 3
async def test_get_account_state_with_proof(client: AsyncClient): state_proof = await client.get_account_state_with_proof(DD_ADDRESS) assert state_proof is not None assert isinstance(state_proof, jsonrpc.AccountStateWithProof) assert state_proof.version == client.get_last_known_state().version