Files
status-react/test/appium/support/api/network_api.py
T

86 lines
3.6 KiB
Python
Raw Normal View History

import logging
2024-04-02 17:59:56 +03:00
import time
from datetime import datetime
2024-04-02 17:59:56 +03:00
from json import JSONDecodeError
from os import environ
2018-10-11 23:28:52 +03:00
from typing import List
import pytest
import pytz
import requests
2024-04-02 17:59:56 +03:00
from selenium.common import TimeoutException
2019-11-29 13:48:07 +02:00
import tests
2022-03-31 17:34:34 +02:00
2024-04-02 17:59:56 +03:00
class NetworkApi:
def __init__(self):
self.network_url = 'http://api-sepolia.arbiscan.io/api'
2020-02-24 13:53:16 +01:00
self.api_key = environ.get('ETHERSCAN_API_KEY')
2020-04-13 22:03:00 +03:00
def log(self, text: str):
tests.test_suite_data.current_test.testruns[-1].steps.append(text)
logging.info(text)
2024-04-02 17:59:56 +03:00
def send_etherscan_request(self, params):
params['apikey'] = self.api_key
try:
response = requests.get(url=self.network_url, params=params).json()
if response:
return response['result']
except TypeError as e:
self.log("Check response from etherscan API. Returned values do not match expected. %s" % str(e))
except JSONDecodeError as e:
self.log("No valid JSON response from Etherscan: %s " % str(e))
pass
2022-09-08 16:27:38 +02:00
def get_token_transactions(self, address: str) -> List[dict]:
2024-04-02 17:59:56 +03:00
params = {'module': 'account', 'action': 'tokentx', 'address': address, 'sort': 'desc'}
return self.send_etherscan_request(params)
2022-09-08 16:27:38 +02:00
def get_transactions(self, address: str) -> List[dict]:
params = {'module': 'account', 'action': 'txlist', 'address': address, 'page': 1, 'offset': 10, 'sort': 'desc'}
2024-04-02 17:59:56 +03:00
return self.send_etherscan_request(params)
2022-09-08 16:27:38 +02:00
2024-04-02 17:59:56 +03:00
def get_balance(self, address: str):
params = {'module': 'account', 'action': 'balance', 'address': address, 'tag': 'latest'}
balance = self.send_etherscan_request(params)
2022-09-08 16:27:38 +02:00
if balance:
self.log('Balance is %s Gwei' % balance)
return int(balance) / 1000000000000000000
2022-09-08 16:27:38 +02:00
else:
self.log('Cannot extract balance!')
def wait_for_confirmation_of_transaction(self, address, tx_time, confirmations=7, token=False):
expected_tx_timestamp = datetime.strptime(tx_time, "%Y-%m-%dT%H:%M:%S%z").replace(tzinfo=pytz.UTC)
start_time = time.time()
2021-01-25 17:35:40 +01:00
if token:
token_info = "token transaction"
else:
token_info = "ETH transaction"
self.log('Waiting for %s of %s to have %s confirmations' % (token_info, address, confirmations))
2021-06-08 12:58:26 +02:00
while round(time.time() - start_time, ndigits=2) < 600: # should be < idleTimeout capability
if token:
transaction = self.get_token_transactions(address)[0]
else:
transaction = self.get_transactions(address)[0]
tx_timestamp = datetime.fromtimestamp(int(transaction['timeStamp'])).replace(tzinfo=pytz.UTC)
if tx_timestamp > expected_tx_timestamp:
if int(transaction['confirmations']) >= confirmations:
return
time.sleep(20)
2020-10-28 20:39:02 +01:00
self.log(
'Expected amount of confirmations is %s, in fact %s' % (confirmations, transaction['confirmations']))
pytest.fail('The last transaction was not confirmed, address is %s, still has %s confirmations' % (
address, int(transaction['confirmations'])))
def wait_for_balance_to_be(self, address: str, expected_balance: int):
expected_balance = round(expected_balance, 4)
2024-04-02 17:59:56 +03:00
for _ in range(5):
balance = round(self.get_balance(address), 4)
if balance == expected_balance:
2024-04-02 17:59:56 +03:00
return
2024-08-05 16:49:47 +03:00
time.sleep(20)
raise TimeoutException(
'balance is not updated on Etherscan, it is %s but expected to be %s' % (balance, expected_balance))