[ISSUE #2225] Added rate test and transactions history verification

This commit is contained in:
yevh-berdnyk 2017-10-23 23:46:49 +03:00 committed by Anton Danchenko
parent 8b2fa695af
commit 7256ddafa9
5 changed files with 181 additions and 39 deletions

View File

@ -1,5 +1,3 @@
def set_password_as_new_user(*args):
for view in args:
view.request_password_icon.click()
@ -7,7 +5,8 @@ def set_password_as_new_user(*args):
view.confirm()
view.chat_request_input.send_keys("qwerty1234")
view.confirm()
view.find_full_text("Tap here to validate your phone number & I\'ll find your friends.")
view.find_full_text(
"Here is your signing phrase. You will use it to verify your transactions. Write it down and keep it safe!")
def recover_access(home, passphrase, password, username):
@ -21,4 +20,3 @@ def recover_access(home, passphrase, password, username):
login.password_input.send_keys(password)
login.sign_in_button.click()
login.find_full_text('Chats', 60)

View File

@ -1,5 +1,8 @@
from datetime import datetime
import pytest
from tests.basetestcase import SingleDeviceTestCase
from views.base_view import get_ethereum_price_in_usd, verify_transaction_in_ropsten
from views.home import HomeView
from tests.preconditions import set_password_as_new_user, recover_access
from tests import transaction_users
@ -50,7 +53,8 @@ class TestWallet(SingleDeviceTestCase):
wallet = chats.wallet_button.click()
wallet.send_button.click()
wallet.amount_edit_box.click()
wallet.send_as_keyevent('0,1')
amount = '0,00%s' % datetime.now().strftime('%f')[:3]
wallet.send_as_keyevent(amount)
wallet.confirm()
wallet.chose_recipient_button.click()
wallet.deny_button.click()
@ -62,13 +66,40 @@ class TestWallet(SingleDeviceTestCase):
chats.sign_later_button.click()
wallet.yes_button.click()
wallet.ok_button_apk.click()
wallet.transactions_icon.click()
wallet.unsigned_tab.click()
wallet.sign_button.click()
tr_view = wallet.transactions_button.click()
tr_view.unsigned_tab.click()
tr_view.sign_button.click()
chats.sign_transaction_button.click()
chats.enter_password_input.send_keys(transaction_users[sender]['password'])
chats.sign_transaction_button.click()
chats.got_it_button.click()
chats.verify_balance_is_updated(initial_balance_recipient, recipient_address)
if test == 'sign_later':
tr_view.history_tab.click()
else:
chats.wallet_button.click()
tr_view = wallet.transactions_button.click()
transaction = tr_view.transactions_table.find_transaction(amount=amount.replace(',', '.'))
details_view = transaction.click()
transaction_hash = details_view.get_transaction_hash()
verify_transaction_in_ropsten(address=transaction_users[sender]['address'], transaction_hash=transaction_hash)
@pytest.mark.wallet
def test_balance_and_eth_rate(self):
errors = list()
home = HomeView(self.driver)
recover_access(home,
passphrase=transaction_users['A_USER']['passphrase'],
password=transaction_users['A_USER']['password'],
username=transaction_users['A_USER']['username'])
chats = home.get_chats()
address = transaction_users['A_USER']['address']
balance = chats.get_balance(address) / 1000000000000000000
eth_rate = get_ethereum_price_in_usd()
wallet = chats.wallet_button.click()
wallet_balance = wallet.get_eth_value()
if wallet_balance != balance:
errors.append('Balance %s is not equal to the expected %s' % (wallet_balance, balance))
wallet.verify_eth_rate(eth_rate, errors)
assert not errors, 'errors occurred:\n{}'.format('\n'.join(errors))

View File

@ -6,7 +6,6 @@ import requests
class BackButton(BaseButton):
def __init__(self, driver):
super(BackButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@content-desc='toolbar-back-button']")
@ -19,14 +18,12 @@ class BackButton(BaseButton):
class DenyButton(BaseButton):
def __init__(self, driver):
super(DenyButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Deny']")
class ContactsButton(BaseButton):
def __init__(self, driver):
super(ContactsButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Contacts']")
@ -37,7 +34,6 @@ class ContactsButton(BaseButton):
class WalletButton(BaseButton):
def __init__(self, driver):
super(WalletButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Wallet']")
@ -48,35 +44,56 @@ class WalletButton(BaseButton):
class YesButton(BaseButton):
def __init__(self, driver):
super(YesButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Yes']")
class NoButton(BaseButton):
def __init__(self, driver):
super(NoButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='No']")
class OkButtonAPK(BaseButton):
def __init__(self, driver):
super(OkButtonAPK, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='OK']")
class ContinueButtonAPK(BaseButton):
def __init__(self, driver):
super(ContinueButtonAPK, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Continue']")
class BaseViewObject(object):
def get_ethereum_price_in_usd() -> float:
url = 'https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD'
return float(requests.request('GET', url).json()['USD'])
def get_transactions(address: str) -> dict:
url = 'http://ropsten.etherscan.io/api?module=account&action=txlist&address=0x%s&sort=desc' % address
return requests.request('GET', url=url).json()['result']
def is_transaction_successful(transaction_hash: str) -> int:
url = "https://ropsten.etherscan.io/api?module=transaction&action=getstatus&txhash=%s" % transaction_hash
return not int(requests.request('GET', url=url).json()['result']['isError'])
def verify_transaction_in_ropsten(address: str, transaction_hash: str):
transactions = get_transactions(address=address)
for transaction in transactions:
if transaction['hash'] == transaction_hash:
logging.info('Transaction is found in Ropsten network')
if not is_transaction_successful(transaction_hash=transaction_hash):
pytest.fail('Transaction is not successful')
return
pytest.fail('Transaction was not found via Ropsten API')
class BaseViewObject(object):
def __init__(self, driver):
self.driver = driver

View File

@ -0,0 +1,80 @@
import time
import pytest
from selenium.common.exceptions import NoSuchElementException
from views.base_element import BaseElement, BaseButton, BaseText
from views.base_view import BaseViewObject
class TransactionTable(BaseElement):
def __init__(self, driver):
super(TransactionTable, self).__init__(driver)
self.driver = driver
self.locator = self.Locator.xpath_selector("//android.support.v4.view.ViewPager")
class TransactionElement(BaseButton):
def __init__(self, driver, amount):
super(TransactionTable.TransactionElement, self).__init__(driver)
self.driver = driver
self.locator = self.Locator.xpath_selector(
"(//android.widget.TextView[contains(@text,'%s ETH')])" % amount)
class TransactionDetailsViewObject(BaseViewObject):
def __init__(self, driver):
super(TransactionTable.TransactionElement.TransactionDetailsViewObject, self).__init__(driver)
self.driver = driver
self.locators = dict(transaction_hash="//android.widget.TextView[@text='Hash']/following-sibling::*[1]")
class DetailsTextElement(BaseText):
def __init__(self, driver, locator):
super(TransactionTable.TransactionElement.TransactionDetailsViewObject.DetailsTextElement,
self).__init__(driver)
self.locator = self.Locator.xpath_selector(locator)
def get_transaction_hash(self) -> str:
return self.DetailsTextElement(driver=self.driver, locator=self.locators['transaction_hash']).text
def navigate(self):
return self.TransactionDetailsViewObject(self.driver)
def get_transaction_element(self, amount: str):
return self.TransactionElement(self.driver, amount=amount)
def find_transaction(self, amount: str) -> TransactionElement:
for i in range(18):
try:
element = self.get_transaction_element(amount=amount)
element.find_element()
return element
except NoSuchElementException:
time.sleep(10)
self.driver.swipe(500, 500, 500, 1000)
pytest.fail('Transaction was not found on Wallet/Transaction screen')
class HistoryTab(BaseButton):
def __init__(self, driver):
super(HistoryTab, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='HISTORY']")
class UnsignedTab(BaseButton):
def __init__(self, driver):
super(UnsignedTab, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='UNSIGNED']")
class SignButton(BaseButton):
def __init__(self, driver):
super(UnsignedTab.SignButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='SIGN']")
class TransactionsViewObject(BaseViewObject):
def __init__(self, driver):
super(TransactionsViewObject, self).__init__(driver)
self.driver = driver
self.history_tab = HistoryTab(self.driver)
self.unsigned_tab = UnsignedTab(self.driver)
self.sign_button = UnsignedTab.SignButton(self.driver)
self.transactions_table = TransactionTable(self.driver)

View File

@ -1,6 +1,7 @@
import logging
from views.base_view import BaseViewObject
import pytest
from views.base_element import *
from views.base_element import BaseButton, BaseEditBox, BaseText
class SendButton(BaseButton):
@ -14,7 +15,7 @@ class AmountEditBox(BaseEditBox, BaseButton):
def __init__(self, driver):
super(AmountEditBox, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='0.000']")
self.locator = self.Locator.xpath_selector("//*[@text='Amount']/..//android.widget.EditText")
class ChooseRecipientButton(BaseButton):
@ -24,35 +25,36 @@ class ChooseRecipientButton(BaseButton):
self.locator = self.Locator.xpath_selector("//*[@text='Choose recipient...']")
class TransactionsIcon(BaseButton):
class TransactionsButton(BaseButton):
def __init__(self, driver):
super(TransactionsIcon, self).__init__(driver)
super(TransactionsButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('(//android.view.ViewGroup[@content-desc="icon"])[4]')
class UnsignedTab(BaseButton):
def __init__(self, driver):
super(UnsignedTab, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='UNSIGNED']")
class SignButton(BaseButton):
def __init__(self, driver):
super(UnsignedTab.SignButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='SIGN']")
def navigate(self):
from views.transactions import TransactionsViewObject
return TransactionsViewObject(self.driver)
class ChooseFromContactsButton(BaseButton):
def __init__(self, driver):
super(ChooseFromContactsButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Choose From Contacts']")
class WalletViewObject(BaseViewObject):
class EthAssetText(BaseText):
def __init__(self, driver):
super(EthAssetText, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='ETH']/../android.widget.TextView[1]")
class UsdTotalValueText(BaseText):
def __init__(self, driver):
super(UsdTotalValueText, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='USD']/../android.widget.TextView[1]")
class WalletViewObject(BaseViewObject):
def __init__(self, driver):
super(WalletViewObject, self).__init__(driver)
self.driver = driver
@ -61,6 +63,20 @@ class WalletViewObject(BaseViewObject):
self.amount_edit_box = AmountEditBox(self.driver)
self.chose_recipient_button = ChooseRecipientButton(self.driver)
self.chose_from_contacts_button = ChooseFromContactsButton(self.driver)
self.unsigned_tab = UnsignedTab(self.driver)
self.sign_button = UnsignedTab.SignButton(self.driver)
self.transactions_icon = TransactionsIcon(self.driver)
self.transactions_button = TransactionsButton(self.driver)
self.eth_asset = EthAssetText(self.driver)
self.usd_total_value = UsdTotalValueText(self.driver)
def get_usd_total_value(self):
return float(self.usd_total_value.text)
def get_eth_value(self):
return float(self.eth_asset.text)
def verify_eth_rate(self, expected_rate: int, errors: list):
usd = self.get_usd_total_value()
eth = self.get_eth_value()
current_rate = usd / eth
if round(current_rate, 2) != expected_rate:
errors.append('Current ETH rate %s is not equal to the expected %s' % (current_rate, expected_rate))
logging.info('Current ETH rate %s is ok' % current_rate)