new e2e+fixes

Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
This commit is contained in:
Churikova Tetiana 2020-10-06 16:48:08 +02:00
parent bdbc48764e
commit f3ed1e370a
No known key found for this signature in database
GPG Key ID: 0D4EA7B33B47E6D8
11 changed files with 166 additions and 31 deletions

6
.github/CODEOWNERS vendored
View File

@ -28,8 +28,8 @@ desktop/ @vkjr
modules/react-native-desktop*/ @vkjr modules/react-native-desktop*/ @vkjr
modules/react-native-desktop*/ @vkjr modules/react-native-desktop*/ @vkjr
/doc @oskarth @yenda @jeluard /doc @oskarth @yenda @jeluard
/deployment @vkjr /deployment @vkjr
/test/appium/ @antdanchenko @churik /test/appium/ @churik

View File

@ -227,15 +227,17 @@
:align-items :center :height 40 :margin-vertical 8} :align-items :center :height 40 :margin-vertical 8}
[quo/text (i18n/label :t/address-or-ens-name)]] [quo/text (i18n/label :t/address-or-ens-name)]]
[quo/text-input [quo/text-input
{:multiline true {:multiline true
:default-value resolved-address :default-value resolved-address
:height 70 :height 70
:editable false}]] :editable false
:accessibility-label :fav-address}]]
[react/view {:height 16}] [react/view {:height 16}]
[quo/list-header (i18n/label :t/name-optional)] [quo/list-header (i18n/label :t/name-optional)]
[react/view {:padding-horizontal 16} [react/view {:padding-horizontal 16}
[quo/text-input {:show-cancel false [quo/text-input {:show-cancel false
:on-change-text #(reset! fav-name %)}]]] :accessibility-label :fav-name
:on-change-text #(reset! fav-name %)}]]]
[toolbar/toolbar [toolbar/toolbar
{:show-border? true {:show-border? true
:center :center

View File

@ -32,13 +32,19 @@ class NetworkApi(object):
return requests.request('GET', url=method, headers=self.headers).json()['result'] return requests.request('GET', url=method, headers=self.headers).json()['result']
except TypeError as e: except TypeError as e:
self.log("Check response from etherscan API. Returned values do not match expected. %s" % e) self.log("Check response from etherscan API. Returned values do not match expected. %s" % e)
except JSONDecodeError as e:
self.log(str(e))
pass
def get_token_transactions(self, address: str) -> List[dict]: def get_token_transactions(self, address: str) -> List[dict]:
method = self.network_url + 'module=account&action=tokentx&address=0x%s&sort=desc&apikey=%s' % (address, self.api_key) method = self.network_url + 'module=account&action=tokentx&address=0x%s&sort=desc&apikey=%s' % (address, self.api_key)
try: try:
return requests.request('GET', url=method, headers=self.headers).json()['result'] return requests.request('GET', url=method, headers=self.headers).json()['result']
except TypeError as e: except TypeError as e:
self.log("Check response from etherscan API. Returned values do not match expected. %s" % e) self.log("Check response from etherscan API. Returned values do not match expected. %s" % str(e))
except JSONDecodeError as e:
self.log(str(e))
pass
def is_transaction_successful(self, transaction_hash: str) -> int: def is_transaction_successful(self, transaction_hash: str) -> int:
method = self.network_url + 'module=transaction&action=getstatus&txhash=%s' % transaction_hash method = self.network_url + 'module=transaction&action=getstatus&txhash=%s' % transaction_hash

View File

@ -450,6 +450,7 @@ class TestProfileSingleDevice(SingleDeviceTestCase):
@marks.critical @marks.critical
@marks.testrail_id(5419) @marks.testrail_id(5419)
@marks.flaky
def test_logcat_backup_recovery_phrase(self): def test_logcat_backup_recovery_phrase(self):
sign_in_view = SignInView(self.driver) sign_in_view = SignInView(self.driver)
sign_in_view.create_user() sign_in_view.create_user()
@ -806,15 +807,16 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase):
profile_1.mail_server_address_input.clear() profile_1.mail_server_address_input.clear()
profile_1.mail_server_address_input.set_value(mailserver_address) profile_1.mail_server_address_input.set_value(mailserver_address)
profile_1.save_button.click() profile_1.save_button.click()
profile_1.mail_server_by_name(server_name).click()
profile_1.mail_server_connect_button.click()
profile_1.confirm_button.click()
if profile_1.element_by_text_part("Error connecting").is_element_displayed(40):
profile_1.retry_to_connect_to_mailserver()
profile_1.get_back_to_home_view()
profile_1.home_button.click()
# TODO: disabled due to 10065 # TODO: disabled due to 10065
# profile_1.mail_server_by_name(server_name).click()
# profile_1.mail_server_connect_button.click()
# profile_1.confirm_button.click()
# if profile_1.element_by_text_part("Error connecting").is_element_displayed(40):
# profile_1.retry_to_connect_to_mailserver()
# profile_1.get_back_to_home_view()
# profile_1.home_button.click()
# profile_1.just_fyi('start chat with user2 and check that all messages are delivered') # profile_1.just_fyi('start chat with user2 and check that all messages are delivered')
# chat_1 = home_1.add_contact(public_key) # chat_1 = home_1.add_contact(public_key)
# message = 'test message' # message = 'test message'

View File

@ -21,7 +21,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase):
home_1, home_2 = device_1_sign_in.get_home_view(), device_2_sign_in.get_home_view() home_1, home_2 = device_1_sign_in.get_home_view(), device_2_sign_in.get_home_view()
profile_2 = home_2.profile_button.click() profile_2 = home_2.profile_button.click()
device_2_username = profile_2.default_username_text.text device_2_username = profile_2.default_username_text.text
profile_2.switch_network('Mainnet with upstream RPC') profile_2.switch_network()
chat_2 = home_2.add_contact(sender['public_key']) chat_2 = home_2.add_contact(sender['public_key'])
chat_2.send_message("Hey there!") chat_2.send_message("Hey there!")

View File

@ -2,7 +2,6 @@ from tests import marks, connection_not_secure_text, connection_is_secure_text,
from tests.base_test_case import SingleDeviceTestCase from tests.base_test_case import SingleDeviceTestCase
from views.sign_in_view import SignInView from views.sign_in_view import SignInView
from views.dapps_view import DappsView from views.dapps_view import DappsView
from time import sleep
class TestBrowsing(SingleDeviceTestCase): class TestBrowsing(SingleDeviceTestCase):
@ -73,15 +72,19 @@ class TestBrowsing(SingleDeviceTestCase):
def test_open_blocked_site(self): def test_open_blocked_site(self):
home_view = SignInView(self.driver).create_user() home_view = SignInView(self.driver).create_user()
daap_view = home_view.dapp_tab_button.click() daap_view = home_view.dapp_tab_button.click()
dapp_detail = daap_view.open_url('https://www.cryptokitties.domainname') for url in ('metamask.site', 'https://www.cryptokitties.domainname'):
dapp_detail.find_text_part('This site is blocked') dapp_detail = daap_view.open_url(url)
if dapp_detail.browser_refresh_page_button.is_element_displayed(): dapp_detail.find_text_part('This site is blocked')
self.driver.fail("Refresh button is present in blocked site") if dapp_detail.browser_refresh_page_button.is_element_displayed():
dapp_detail.go_back_button.click() self.errors.append("Refresh button is present in blocked site")
daap_view.element_by_text("Browser").click() dapp_detail.go_back_button.click()
dapp_detail.continue_anyway_button.click() daap_view.element_by_text("Browser").click()
if not dapp_detail.element_by_text("Unable to load page").is_element_displayed(): dapp_detail.continue_anyway_button.click()
self.driver.fail("Failed to open Dapp after 'Continue anyway' tapped") if dapp_detail.element_by_text('This site is blocked').is_element_displayed():
self.errors.append("Failed to open Dapp after 'Continue anyway' tapped for %s" % url)
daap_view.cross_icon.click()
self.errors.verify_no_errors()
#TODO: waiting mode #TODO: waiting mode
@marks.testrail_id(6300) @marks.testrail_id(6300)

View File

@ -479,6 +479,90 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase):
self.errors.verify_no_errors() self.errors.verify_no_errors()
@marks.testrail_id(6328)
@marks.medium
def test_send_transaction_set_recipient_options(self):
sender = wallet_users['D']
sign_in_view = SignInView(self.driver)
sign_in_view.recover_access(sender['passphrase'])
home_view = sign_in_view.get_home_view()
nickname = 'my_some_nickname'
account_name = 'my_acc_name'
account_address = '0x8c2E3Cd844848E79cFd4671cE45C12F210b630d7'
recent_add_to_fav_name = 'my_Recent_STT'
recent_add_to_fav_address = '0xc039f82eceda458b63a0f327b7b0c20def5903d7'
basic_add_to_fav_name = 'my_basic_address'
home_view.just_fyi('Add new account and new ENS contact for recipient')
chat = home_view.add_contact(ens_user_ropsten['ens'])
chat.chat_options.click()
chat.view_profile_button.click_until_presence_of_element(chat.remove_from_contacts)
chat.set_nickname(nickname)
wallet_view = home_view.wallet_button.click()
wallet_view.set_up_wallet()
wallet_view.add_account(account_name=account_name)
wallet_view.accounts_status_account.click()
send_transaction = wallet_view.send_transaction_button.click()
send_transaction.just_fyi('Set one of my accounts')
send_transaction.chose_recipient_button.click()
send_transaction.element_by_text('My accounts').click()
send_transaction.element_by_text(account_name).click()
if send_transaction.enter_recipient_address_text.text != \
send_transaction.get_formatted_recipient_address(account_address):
self.errors.append('Added account is not resolved as recipient')
send_transaction.just_fyi('Set contact')
send_transaction.chose_recipient_button.click()
send_transaction.element_by_text('Contacts').click()
send_transaction.element_by_text(nickname).scroll_and_click()
send_transaction.recipient_done.click()
if send_transaction.enter_recipient_address_text.text != \
send_transaction.get_formatted_recipient_address(ens_user_ropsten['address']):
self.errors.append('ENS from contact is not resolved as recipient')
send_transaction.just_fyi('Set contract address from recent and check smart contract error')
send_transaction.chose_recipient_button.click()
send_transaction.element_by_text('Recent').click()
send_transaction.element_by_text('↑ 0 ETHro').click()
if not send_transaction.element_by_text_part('is a smart contract').is_element_displayed():
self.driver.fail('No warning is shown at attempt to set as recipient smart contract')
send_transaction.ok_button.click()
send_transaction.element_by_text('↑ 2 STT').scroll_and_click()
send_transaction.add_to_favorites(recent_add_to_fav_name)
send_transaction.just_fyi('Scan code, add it to favorites and recheck that it is preserved')
send_transaction.scan_qr_code_button.click()
send_transaction.allow_button.click(1)
wallet_view.enter_qr_edit_box.set_value(basic_user['address'])
wallet_view.ok_button.click()
send_transaction.add_to_favorites(basic_add_to_fav_name)
send_transaction.element_by_text('Favourites').scroll_and_click()
for name in (recent_add_to_fav_name, basic_add_to_fav_name):
if not send_transaction.element_by_text(name).is_element_displayed():
self.errors.append('%s was not added to Favourites' % name)
send_transaction.element_by_text(recent_add_to_fav_name).click()
if str(send_transaction.enter_recipient_address_text.text).lower() != \
send_transaction.get_formatted_recipient_address(recent_add_to_fav_address):
self.errors.append('Recent address that was added to favourites was not resolved correctly')
send_transaction.just_fyi('Check search and set address from search')
send_transaction.chose_recipient_button.click()
send_transaction.search_by_keyword(ens_user_ropsten['ens'][:2])
if not send_transaction.element_by_text('@' + ens_user_ropsten['ens']).is_element_displayed():
self.errors.append('ENS address from contacts is not shown in search')
send_transaction.cancel_button.click()
send_transaction.search_by_keyword('my')
for name in (nickname, account_name, recent_add_to_fav_name, basic_add_to_fav_name):
if not send_transaction.element_by_text(name).is_element_displayed():
self.errors.append('%s is not shown in search when searching by namepart' % name)
send_transaction.element_by_text(basic_add_to_fav_name).click()
if send_transaction.enter_recipient_address_text.text!= send_transaction.get_formatted_recipient_address('0x' + basic_user['address']):
self.errors.append('QR scanned address that was added to favourites was not resolved correctly')
self.errors.verify_no_errors()
@marks.testrail_id(5437) @marks.testrail_id(5437)
@marks.medium @marks.medium
def test_validation_amount_errors(self): def test_validation_amount_errors(self):

View File

@ -18,6 +18,7 @@ ens_user['address'] = '0x1eE3058Bd300246B4B20E687Efc9Eba81FF7814b'
ens_user_ropsten = dict() ens_user_ropsten = dict()
ens_user_ropsten['ens'] = 'nastya' ens_user_ropsten['ens'] = 'nastya'
ens_user_ropsten['username'] = 'Thoughtful Stupendous Graywolf' ens_user_ropsten['username'] = 'Thoughtful Stupendous Graywolf'
ens_user_ropsten['address'] = '0x58d8c3D70ce4FA4b9fb10a665C8712238746F2ff'
dummy_user = dict() dummy_user = dict()
dummy_user['username'] = "Vain Wordy Hagfish" dummy_user['username'] = "Vain Wordy Hagfish"

View File

@ -125,6 +125,10 @@ class BaseElement(object):
raise NoSuchElementException( raise NoSuchElementException(
"Device %s: '%s' is not found on the screen" % (self.driver.number, self.name)) from None "Device %s: '%s' is not found on the screen" % (self.driver.number, self.name)) from None
def scroll_and_click(self):
self.scroll_to_element()
self.click()
def is_element_present(self, sec=5): def is_element_present(self, sec=5):
try: try:
self.driver.info('Wait for %s' % self.name) self.driver.info('Wait for %s' % self.name)

View File

@ -652,6 +652,8 @@ class BaseView(object):
def close_share_popup(self): def close_share_popup(self):
TouchAction(self.driver).tap(None, 255, 104, 1).perform() TouchAction(self.driver).tap(None, 255, 104, 1).perform()
time.sleep(3)
def get_public_key_and_username(self, return_username=False): def get_public_key_and_username(self, return_username=False):
profile_view = self.profile_button.click() profile_view = self.profile_button.click()

View File

@ -196,19 +196,39 @@ class ValidationErrorOnSendTransaction(BaseButton):
super(ValidationErrorOnSendTransaction, self).__init__(driver) super(ValidationErrorOnSendTransaction, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='%s']/../*[@content-desc='icon']" % field) self.locator = self.Locator.xpath_selector("//*[@text='%s']/../*[@content-desc='icon']" % field)
class ValidationIconOnSendTransaction(BaseButton): class ValidationIconOnSendTransaction(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(ValidationIconOnSendTransaction, self).__init__(driver) super(ValidationIconOnSendTransaction, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[@content-desc="custom-gas-fee"]/../android.view.ViewGroup//*[@content-desc="icon"]') self.locator = self.Locator.xpath_selector('//*[@content-desc="custom-gas-fee"]/../android.view.ViewGroup//*[@content-desc="icon"]')
class ShareButton(BaseButton): class ShareButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(ShareButton, self).__init__(driver) super(ShareButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('share-address-button') self.locator = self.Locator.accessibility_id('share-address-button')
class RecipientAddToFavoritesButton(BaseButton):
def __init__(self, driver):
super(RecipientAddToFavoritesButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('participant-add-to-favs')
class RecipientDoneButton(BaseButton):
def __init__(self, driver):
super(RecipientDoneButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('participant-done')
class NewFavoriteNameInput(BaseEditBox):
def __init__(self, driver):
super(NewFavoriteNameInput, self).__init__(driver)
self.locator = self.Locator.accessibility_id('fav-name')
class NewFavoriteAddFavorite(BaseButton):
def __init__(self, driver):
super(NewFavoriteAddFavorite, self).__init__(driver)
self.locator = self.Locator.accessibility_id('add-fav')
class OnboardingMessage(BaseElement): class OnboardingMessage(BaseElement):
def __init__(self, driver): def __init__(self, driver):
@ -335,6 +355,12 @@ class SendTransactionView(BaseView):
self.select_button = SelectButton(self.driver) self.select_button = SelectButton(self.driver)
self.request_transaction_button = RequestTransactionButtonBottomSheet(self.driver) self.request_transaction_button = RequestTransactionButtonBottomSheet(self.driver)
# Elements on set recipient screen
self.recipient_add_to_favorites = RecipientAddToFavoritesButton(self.driver)
self.recipient_done = RecipientDoneButton(self.driver)
self.new_favorite_name_input = NewFavoriteNameInput(self.driver)
self.new_favorite_add_favorite = NewFavoriteAddFavorite(self.driver)
def complete_onboarding(self): def complete_onboarding(self):
if self.onboarding_message.is_element_displayed(): if self.onboarding_message.is_element_displayed():
from views.wallet_view import WalletView from views.wallet_view import WalletView
@ -395,3 +421,8 @@ class SendTransactionView(BaseView):
data['gas_price'] = self.gas_price_input.text data['gas_price'] = self.gas_price_input.text
self.cancel_button.click() self.cancel_button.click()
return data return data
def add_to_favorites(self, name):
self.recipient_add_to_favorites.click()
self.new_favorite_name_input.set_value(name)
self.new_favorite_add_favorite.click()