Gheorghe Pinzaru e8fca7ce68
Add interactive dismiss and new input UI
New input UI

Inverse panel height calculation

Remove old chat input

Better animations

fix for pasting text

Add buttons accessibility

Fix dark mode

Update react navigation to fix the keyboard issues

Force close bottom sheet

Unmount android bottom sheet when not visible

Reset bottom sheet height android

more fixes

more fixes

Add hidden audio icon

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-07-20 12:21:47 +03:00

1099 lines
55 KiB
Python

import re
from tests import marks, bootnode_address, mailserver_address, camera_access_error_text, \
photos_access_error_text, test_dapp_url, test_dapp_name, mailserver_ams, mailserver_gc, \
mailserver_hk, used_fleet, common_password
from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase
from tests.users import transaction_senders, basic_user, ens_user, ens_user_ropsten
from views.sign_in_view import SignInView
@marks.all
@marks.account
class TestProfileSingleDevice(SingleDeviceTestCase):
@marks.testrail_id(5302)
@marks.high
@marks.skip
def test_set_profile_picture(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
profile_view.edit_profile_picture(file_name='sauce_logo.png')
profile_view.home_button.click()
sign_in_view.profile_button.click()
profile_view.swipe_down()
if not profile_view.profile_picture.is_element_image_equals_template('sauce_logo_profile.png'):
self.driver.fail('Profile picture was not updated')
@marks.testrail_id(5741)
@marks.high
def test_mobile_data_usage_popup_continue_syncing(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
sign_in_view.just_fyi("Enable mobile network to see popup and enable syncing")
sign_in_view.toggle_mobile_data()
if not sign_in_view.element_by_text_part("Sync using mobile data?").is_element_displayed():
self.driver.fail('No popup about Mobile data is shown')
sign_in_view.wait_for_element_starts_with_text('Continue syncing').click()
sign_in_view.just_fyi("Check that selected option is stored in Profile")
profile_view = sign_in_view.profile_button.click()
profile_view.sync_settings_button.click()
profile_view.element_by_text('Mobile data').click()
if not profile_view.use_mobile_data.attribute_value('checked'):
self.errors.append("Use mobile data option is enabled after 'Continue syncing' selected")
if profile_view.ask_me_when_on_mobile_network.attribute_value('checked'):
self.errors.append("'Ask me when on mobile network' option not enabled even it was checked when 'Continue"
"syncing' selected!")
sign_in_view.just_fyi("Check that can join public chat and send message")
chat_name = sign_in_view.get_random_chat_name()
home = profile_view.get_back_to_home_view()
chat = home.join_public_chat(chat_name)
message = 'test message'
chat.chat_message_input.send_keys(message)
chat.send_message_button.click()
if not chat.chat_element_by_text(message).is_element_displayed():
self.errors.append("Message was not sent!")
self.errors.verify_no_errors()
@marks.testrail_id(6228)
@marks.high
def test_mobile_data_usage_popup_stop_syncing(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
offline_banner_text = "No Wi-fi, message syncing disabled."
sign_in_view.just_fyi("Enable mobile network to see popup and stop syncing")
sign_in_view.toggle_mobile_data()
sign_in_view.wait_for_element_starts_with_text('Stop syncing').click()
if not sign_in_view.wait_for_element_starts_with_text(offline_banner_text, 60):
self.driver.fail('No popup about offline history is shown')
sign_in_view.element_by_text_part(offline_banner_text).click()
for item in offline_banner_text, "Start syncing", "Go to settings":
if not sign_in_view.element_by_text(item).is_element_displayed():
self.driver.fail("%s is not shown" % item)
sign_in_view.just_fyi("Start syncing in offline popup")
sign_in_view.element_by_text("Start syncing").click()
sign_in_view.element_by_text_part(offline_banner_text).wait_for_invisibility_of_element(10)
if sign_in_view.element_by_text_part(offline_banner_text).is_element_displayed():
self.driver.fail("Popup about offline history is shown")
@marks.testrail_id(6229)
@marks.high
def test_mobile_data_usage_settings(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
sign_in_view.just_fyi("Check default preferences")
profile_view.sync_settings_button.click()
profile_view.element_by_text('Mobile data').click()
if profile_view.use_mobile_data.text != 'OFF':
self.errors.append("Mobile data is enabled by default")
if profile_view.ask_me_when_on_mobile_network.text != "ON":
self.errors.append("'Ask me when on mobile network' is not enabled by default")
sign_in_view.just_fyi("Disable 'ask me when on mobile network' and check that it is not shown")
profile_view.ask_me_when_on_mobile_network.click()
sign_in_view.toggle_mobile_data()
if sign_in_view.element_by_text("Start syncing").is_element_displayed(20):
self.errors.append("Popup is shown, but 'ask me when on mobile network' is disabled")
sign_in_view.just_fyi("Check 'Restore default' setting")
profile_view.element_by_text('Restore Defaults').click()
if profile_view.use_mobile_data.attribute_value("checked"):
self.errors.append("Mobile data is enabled by default")
if not profile_view.ask_me_when_on_mobile_network.attribute_value("checked"):
self.errors.append("'Ask me when on mobile network' is not enabled by default")
self.errors.verify_no_errors()
@marks.testrail_id(5454)
@marks.critical
@marks.skip
# TODO: waiting for better times - no profile picture for now
def test_user_can_remove_profile_picture(self):
signin_view = SignInView(self.driver)
home_view = signin_view.create_user()
profile_view = home_view.profile_button.click()
profile_view.edit_profile_picture('sauce_logo.png')
profile_view.swipe_down()
if not profile_view.profile_picture.is_element_image_equals_template('sauce_logo_profile.png'):
self.driver.fail('Profile picture was not updated')
profile_view.remove_profile_picture()
profile_view.swipe_down()
if profile_view.profile_picture.is_element_image_equals_template('default_icon_profile.png'):
self.driver.fail('Profile picture was not deleted')
@marks.testrail_id(5323)
@marks.critical
def test_share_contact_code_and_wallet_address(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
profile_view.share_my_profile_button.click()
public_key = profile_view.public_key_text.text
profile_view.share_button.click()
profile_view.share_via_messenger()
if not profile_view.element_by_text_part(public_key).is_element_present():
self.errors.append("Can't share public key")
for _ in range(2):
profile_view.click_system_back_button()
profile_view.close_share_popup()
wallet = profile_view.wallet_button.click()
wallet.set_up_wallet()
wallet.accounts_status_account.click()
request = wallet.receive_transaction_button.click()
address = wallet.address_text.text
request.share_button.click()
wallet.share_via_messenger()
if not wallet.element_by_text_part(address).is_element_present():
self.errors.append("Can't share address")
self.errors.verify_no_errors()
@marks.testrail_id(5375)
@marks.high
def test_copy_contact_code_and_wallet_address(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
profile_view.share_my_profile_button.click()
public_key = profile_view.public_key_text.text
profile_view.public_key_text.long_press_element()
profile_view.copy_text()
profile_view.close_share_popup()
home = profile_view.home_button.click()
chat = home.add_contact(transaction_senders['M']['public_key'])
chat.chat_message_input.click()
chat.paste_text()
input_text = chat.chat_message_input.text
if input_text not in public_key or len(input_text) < 1:
self.errors.append('Public key was not copied')
chat.chat_message_input.clear()
chat.get_back_to_home_view()
wallet = home.wallet_button.click()
wallet.set_up_wallet()
wallet.accounts_status_account.click()
wallet.receive_transaction_button.click()
address = wallet.address_text.text
share_view = home.get_send_transaction_view()
share_view.share_button.click()
share_view.element_by_text('Copy').click()
wallet.get_back_to_home_view()
wallet.home_button.click()
home.get_chat(transaction_senders['M']['username']).click()
chat.chat_message_input.click()
chat.paste_text()
if chat.chat_message_input.text != address:
self.errors.append('Wallet address was not copied')
self.errors.verify_no_errors()
@marks.testrail_id(5502)
@marks.critical
def test_can_add_existing_ens(self):
sign_in = SignInView(self.driver)
home = sign_in.recover_access(ens_user['passphrase'])
home.just_fyi('switching to Mainnet')
profile = home.profile_button.click()
profile.switch_network('Mainnet with upstream RPC')
home.profile_button.click()
dapp_view = profile.ens_usernames_button.click()
dapp_view.just_fyi('check if your name can be added via "ENS usernames" in Profile')
dapp_view.element_by_text('Get started').click()
dapp_view.ens_name.set_value(ens_user['ens'])
if not dapp_view.element_by_text_part('is owned by you').is_element_displayed():
self.errors.append('Owned username is not shown in ENS Dapp.')
dapp_view.check_ens_name.click()
if not dapp_view.element_by_text_part('Username added').is_element_displayed():
self.errors.append('No message "Username added" after resolving own username')
dapp_view.element_by_text('Ok, got it').click()
dapp_view.just_fyi('check that after adding username is shown in "ENS usernames" and profile')
if not dapp_view.element_by_text(ens_user['ens']).is_element_displayed():
self.errors.append('No ENS name is shown in own "ENS usernames" after adding')
dapp_view.back_button.click()
if not dapp_view.element_by_text('@%s' % ens_user['ens']).is_element_displayed():
self.errors.append('No ENS name is shown in own profile after adding')
if not dapp_view.element_by_text('%s.stateofus.eth' % ens_user['ens']).is_element_displayed():
self.errors.append('No ENS name is shown in own profile after adding')
profile.share_my_profile_button.click()
if profile.ens_name_in_share_chat_key_text.text != '%s.stateofus.eth' % ens_user['ens']:
self.errors.append('No ENS name is shown on tapping on share icon in Profile')
profile.close_share_popup()
self.errors.verify_no_errors()
@marks.testrail_id(5475)
@marks.low
@marks.skip
# TODO: skip until profile picture change feature is enabled
def test_change_profile_picture_several_times(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
for file_name in ['sauce_logo.png', 'sauce_logo_red.png', 'saucelabs_sauce.png']:
profile_view.edit_profile_picture(file_name=file_name)
profile_view.swipe_down()
if not profile_view.profile_picture.is_element_image_equals_template(
file_name.replace('.png', '_profile.png')):
self.driver.fail('Profile picture was not updated')
@marks.testrail_id(6239)
@marks.medium
def test_backup_recovery_phrase(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
if sign_in_view.profile_button.counter.text != '1':
self.errors.append('Profile button counter is not shown')
profile_view = sign_in_view.profile_button.click()
profile_view.logout()
sign_in_view.sign_in()
if sign_in_view.profile_button.counter.text != '1':
self.errors.append('Profile button counter is not shown after re-login')
sign_in_view.profile_button.click()
profile_view.privacy_and_security_button.click()
profile_view.backup_recovery_phrase_button.click()
recovery_phrase = profile_view.backup_recovery_phrase()
if sign_in_view.profile_button.counter.is_element_displayed():
self.errors.append('Profile button counter is shown after recovery phrase backup')
profile_view.backup_recovery_phrase_button.click()
if not profile_view.backup_recovery_phrase_button.is_element_displayed():
self.driver.fail('Back up seed phrase option is available after seed phrase backed up!')
profile_view.back_button.click()
profile_view.logout()
recover_view = sign_in_view.access_key_button.click()
recover_view.enter_seed_phrase_button.click()
recover_view.seedphrase_input.click()
recover_view.seedphrase_input.set_value(' '.join(recovery_phrase.values()))
recover_view.next_button.click()
recover_view.element_by_text('UNLOCK').click()
sign_in_view.password_input.set_value(common_password)
chats_view = sign_in_view.sign_in_button.click()
chats_view.plus_button.click()
if not chats_view.start_new_chat_button.is_element_displayed():
self.errors.append("Can't proceed using account after it's re-recover twice.")
self.errors.verify_no_errors()
@marks.testrail_id(6296)
@marks.high
def test_recover_account_from_new_user_seedphrase(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
profile_view.privacy_and_security_button.click()
profile_view.backup_recovery_phrase_button.click()
profile_view.ok_continue_button.click()
recovery_phrase = " ".join(profile_view.get_recovery_phrase().values())
profile_view.back_button.click()
profile_view.back_button.click()
public_key = profile_view.get_public_key_and_username()
wallet_view = profile_view.wallet_button.click()
wallet_view.set_up_wallet()
address = wallet_view.get_wallet_address()
sign_in_view.profile_button.click()
profile_view.logout()
self.driver.reset()
sign_in_view.accept_agreements()
sign_in_view.recover_access(recovery_phrase)
wallet_view = sign_in_view.wallet_button.click()
wallet_view.set_up_wallet()
if wallet_view.get_wallet_address() != address:
self.driver.fail("Seed phrase displayed in new accounts for back up does not recover respective address")
profile_view = wallet_view.profile_button.click()
if profile_view.get_public_key_and_username() != public_key:
self.driver.fail("Seed phrase displayed in new accounts for back up does not recover respective public key")
@marks.testrail_id(5433)
@marks.medium
def test_invite_friends(self):
sign_in_view = SignInView(self.driver)
home = sign_in_view.create_user()
home.invite_friends_button.click()
home.share_via_messenger()
home.find_text_part("Get Status at http://status.im")
home.click_system_back_button()
home.plus_button.click()
home.chats_menu_invite_friends_button.click()
home.share_via_messenger()
home.find_text_part("Get Status at http://status.im")
@marks.testrail_id(6312)
@marks.medium
def test_add_remove_contact_via_contacts_view(self):
sign_in_view = SignInView(self.driver)
home = sign_in_view.create_user()
home.just_fyi('Check empty contacts view')
profile = home.profile_button.click()
profile.switch_network()
home.profile_button.click()
profile.contacts_button.click()
for element in [profile.invite_friends_in_contact_button, profile.add_new_contact_button]:
if not element.is_element_displayed():
self.driver.fail('No expected element on contacts view')
users = {
'scanning_ens_with_stateofus_domain_deep_link': {
'contact_code': 'https://join.status.im/u/%s.stateofus.eth' % ens_user_ropsten['ens'],
'username': ens_user_ropsten['username'],
},
'scanning_public_key': {
'contact_code': transaction_senders['A']['public_key'],
'username': transaction_senders['A']['username'],
},
'pasting_public_key': {
'contact_code': basic_user['public_key'],
'username': basic_user['username'],
},
'pasting_ens_ahother_domain': {
'contact_code': ens_user['ens_another_domain'],
'username': '@%s' % ens_user['ens_another_domain'],
},
}
home.just_fyi('Add contactx and check that they appear in Contacts view')
for key in users:
contact_view = profile.add_new_contact_button.click()
sign_in_view.just_fyi('Checking %s case' % key)
if 'scanning' in key:
contact_view.scan_contact_code_button.click()
if contact_view.allow_button.is_element_displayed():
contact_view.allow_button.click()
contact_view.enter_qr_edit_box.set_value(users[key]['contact_code'])
contact_view.ok_button.click()
else:
contact_view.public_key_edit_box.click()
contact_view.public_key_edit_box.send_keys(users[key]['contact_code'])
contact_view.confirm_until_presence_of_element(profile.add_new_contact_button)
if not profile.element_by_text(users[key]['username']).is_element_displayed():
self.errors.append('In %s case username not found in contact view after scanning' % key)
home.just_fyi('Remove contact and check that it disappeared')
user_to_remove = '@%s' % ens_user['ens_another_domain']
profile.element_by_text(user_to_remove).click()
from views.chat_view import ChatView
profile_user_to_remove = ChatView(self.driver)
profile_user_to_remove.remove_from_contacts.click()
profile_user_to_remove.back_button.click()
if profile.element_by_text(user_to_remove).is_element_displayed():
self.errors.append('Removed user is still shown in contact view')
self.errors.verify_no_errors()
@marks.testrail_id(5431)
@marks.medium
def test_add_custom_network(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
profile_view.add_custom_network()
sign_in_view.sign_in()
profile_view = sign_in_view.profile_button.click()
profile_view.advanced_button.click()
profile_view.network_settings_button.scroll_to_element(10, 'up')
profile_view.find_text_part('custom_ropsten')
@marks.logcat
@marks.critical
@marks.testrail_id(5419)
def test_logcat_backup_recovery_phrase(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
profile_view.privacy_and_security_button.click()
profile_view.backup_recovery_phrase_button.click()
profile_view.ok_continue_button.click()
recovery_phrase = profile_view.get_recovery_phrase()
profile_view.next_button.click()
word_number = profile_view.recovery_phrase_word_number.number
profile_view.recovery_phrase_word_input.set_value(recovery_phrase[word_number])
profile_view.next_button.click()
word_number_1 = profile_view.recovery_phrase_word_number.number
profile_view.recovery_phrase_word_input.set_value(recovery_phrase[word_number_1])
profile_view.done_button.click()
profile_view.yes_button.click()
values_in_logcat = profile_view.find_values_in_logcat(passphrase1=recovery_phrase[word_number],
passphrase2=recovery_phrase[word_number_1])
if len(values_in_logcat) == 2:
self.driver.fail(values_in_logcat)
@marks.testrail_id(5391)
@marks.high
def test_need_help_section(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
profile_view.help_button.click()
base_web_view = profile_view.faq_button.click()
base_web_view.open_in_webview()
base_web_view.find_full_text('Frequently Asked Questions')
base_web_view.click_system_back_button()
profile_view.submit_bug_button.click()
base_web_view.find_full_text('Welcome to Gmail')
base_web_view.click_system_back_button()
profile_view.request_a_feature_button.click()
profile_view.find_full_text('#status')
@marks.testrail_id(5382)
@marks.high
@marks.battery_consumption
def test_contact_profile_view(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
home_view = sign_in_view.get_home_view()
home_view.add_contact(basic_user['public_key'])
chat_view = home_view.get_chat_view()
chat_view.chat_options.click_until_presence_of_element(chat_view.view_profile_button)
chat_view.view_profile_button.click()
for text in basic_user['username'], 'Remove from contacts', 'Send message', 'Block this user':
if not chat_view.element_by_text(text).scroll_to_element():
self.errors.append('%s is not visible' % text)
self.errors.verify_no_errors()
@marks.testrail_id(5368)
@marks.high
def test_log_level_and_fleet(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
profile_view.advanced_button.click()
for text in 'INFO', used_fleet:
if not profile_view.element_by_text(text).is_element_displayed():
self.errors.append('%s is not selected by default' % text)
self.errors.verify_no_errors()
@marks.testrail_id(5468)
@marks.medium
@marks.skip
# TODO: skip until profile picture change feature is enabled
def test_deny_camera_access_changing_profile_photo(self):
sign_in = SignInView(self.driver)
sign_in.create_user()
profile = sign_in.profile_button.click()
profile.profile_picture.click()
profile.capture_button.click()
for _ in range(2):
profile.deny_button.click()
profile.element_by_text(camera_access_error_text).wait_for_visibility_of_element(3)
profile.ok_button.click()
profile.profile_picture.click()
profile.capture_button.click()
profile.deny_button.wait_for_visibility_of_element(2)
@marks.testrail_id(5469)
@marks.medium
@marks.skip
# TODO: skip until profile picture change feature is enabled
def test_deny_device_storage_access_changing_profile_photo(self):
sign_in = SignInView(self.driver)
sign_in.create_user()
profile = sign_in.profile_button.click()
profile.profile_picture.click()
profile.select_from_gallery_button.click()
profile.deny_button.click()
profile.element_by_text(photos_access_error_text, element_type='text').wait_for_visibility_of_element(3)
profile.ok_button.click()
profile.profile_picture.click()
profile.select_from_gallery_button.click()
profile.deny_button.wait_for_visibility_of_element(2)
@marks.testrail_id(5299)
@marks.high
def test_user_can_switch_network(self):
signin_view = SignInView(self.driver)
home_view = signin_view.create_user()
network_name = 'Mainnet with upstream RPC'
profile = home_view.profile_button.click()
profile.switch_network(network_name)
profile = home_view.profile_button.click()
if not profile.current_active_network == network_name:
self.driver.fail('Oops! Wrong network selected!')
@marks.testrail_id(5453)
@marks.medium
def test_privacy_policy_is_accessible(self):
signin_view = SignInView(self.driver)
no_link_found_error_msg = 'Could not find privacy policy link at'
no_link_open_error_msg = 'Could not open our privacy policy from'
if not signin_view.privacy_policy_link.is_element_displayed():
self.driver.fail('{} Sign in view!'.format(no_link_found_error_msg))
base_web_view = signin_view.privacy_policy_link.click()
base_web_view.open_in_webview()
if not base_web_view.policy_summary.is_element_displayed():
self.errors.append('{} Sign in view!'.format(no_link_open_error_msg))
base_web_view.click_system_back_button()
home_view = signin_view.create_user()
profile = home_view.profile_button.click()
about_view = profile.about_button.click()
about_view.privacy_policy_button.click()
if not base_web_view.policy_summary.is_element_displayed():
self.errors.append('{} Profile about view!'.format(no_link_open_error_msg))
self.errors.verify_no_errors()
@marks.testrail_id(5738)
@marks.high
def test_dapps_permissions(self):
sign_in_view = SignInView(self.driver)
home_view = sign_in_view.create_user()
account_name = 'Status account'
home_view.just_fyi('open Status Test Dapp, allow all and check permissions in Profile')
home_view.open_status_test_dapp()
home_view.cross_icon.click()
profile_view = home_view.profile_button.click()
profile_view.privacy_and_security_button.click()
profile_view.dapp_permissions_button.click()
profile_view.element_by_text(test_dapp_name).click()
if not profile_view.element_by_text(account_name).is_element_displayed():
self.errors.append('Wallet permission was not granted')
if not profile_view.element_by_text('Chat key').is_element_displayed():
self.errors.append('Contact code permission was not granted')
profile_view.just_fyi('revoke access and check that they are asked second time')
profile_view.revoke_access_button.click()
profile_view.back_button.click()
dapp_view = profile_view.dapp_tab_button.click()
dapp_view.open_url(test_dapp_url)
if not dapp_view.element_by_text_part(account_name).is_element_displayed():
self.errors.append('Wallet permission is not asked')
if dapp_view.allow_button.is_element_displayed():
dapp_view.allow_button.click(times_to_click=1)
if not dapp_view.element_by_text_part('to your profile').is_element_displayed():
self.errors.append('Profile permission is not asked')
self.errors.verify_no_errors()
@marks.testrail_id(5428)
@marks.low
def test_version_format(self):
sign_in_view = SignInView(self.driver)
home_view = sign_in_view.create_user()
profile_view = home_view.profile_button.click()
profile_view.about_button.click()
app_version = profile_view.app_version_text.text
node_version = profile_view.node_version_text.text
if not re.search(r'\d{1}[.]\d{1,2}[.]\d{1,2}\s[(]\d*[)]', app_version):
self.errors.append("App version %s didn't match expected format" % app_version)
if not re.search(r'StatusIM\/v.*\/android-\d{3}\/go\d{1}[.]\d{1,}', node_version):
self.errors.append("Node version %s didn't match expected format" % node_version)
profile_view.app_version_text.click()
profile_view.back_button.click()
profile_view.home_button.click()
chat = home_view.join_public_chat(home_view.get_random_chat_name())
message_input = chat.chat_message_input
message_input.paste_text_from_clipboard()
if message_input.text != app_version:
self.errors.append('Version number was not copied to clipboard')
self.errors.verify_no_errors()
@marks.testrail_id(5766)
@marks.medium
@marks.flaky
def test_use_pinned_mailserver(self):
sign_in_view = SignInView(self.driver)
home_view = sign_in_view.create_user()
profile_view = home_view.profile_button.click()
profile_view.just_fyi('pin mailserver')
profile_view.sync_settings_button.click()
mailserver_1 = profile_view.return_mailserver_name(mailserver_gc, used_fleet)
mailserver_2 = profile_view.return_mailserver_name(mailserver_ams, used_fleet)
# TODO: temporary to avoid issue 9269 - should be disabled after fix
mailserver = mailserver_1 if profile_view.element_by_text(mailserver_2).is_element_present() else mailserver_2
profile_view.mail_server_button.click()
profile_view.mail_server_auto_selection_button.click()
profile_view.element_by_text(mailserver).click()
profile_view.confirm_button.click()
profile_view.just_fyi('check that mailserver is pinned')
profile_view.back_button.click()
if not profile_view.element_by_text(mailserver).is_element_displayed():
self.errors.append('"%s" mailserver is not pinned' % mailserver)
profile_view.get_back_to_home_view()
profile_view.just_fyi('relogin and check that settings are preserved')
home_view.relogin()
home_view.profile_button.click()
profile_view.sync_settings_button.click()
if not profile_view.element_by_text(mailserver).is_element_displayed():
self.errors.append('"%s" mailserver is not pinned' % mailserver)
profile_view.mail_server_button.click()
profile_view.mail_server_auto_selection_button.click()
profile_view.element_by_text(mailserver).click()
if profile_view.confirm_button.is_element_displayed():
self.errors.append('can select mailserver with "Autoselection" switched on')
self.errors.verify_no_errors()
@marks.testrail_id(6219)
@marks.medium
def test_set_primary_ens_custom_domain(self):
sign_in_view = SignInView(self.driver)
ens_not_stateofus = ens_user['ens_another_domain']
ens_stateofus = ens_user['ens']
home_view = sign_in_view.recover_access(ens_user['passphrase'])
home_view.just_fyi('add 2 ENS names in Profile')
profile_view = home_view.profile_button.click()
dapp_view = profile_view.connect_existing_status_ens(ens_stateofus)
profile_view.element_by_text("Add username").click()
profile_view.element_by_text_part("another domain").click()
dapp_view.ens_name.set_value(ens_not_stateofus)
dapp_view.check_ens_name.click_until_presence_of_element(dapp_view.element_by_text('Ok, got it'))
dapp_view.element_by_text('Ok, got it').click()
home_view.just_fyi('check that by default %s ENS is set' % ens_stateofus)
dapp_view.element_by_text('Primary username').click()
message_to_check = 'Your messages are displayed to others with'
if not dapp_view.element_by_text('%s\n@%s.stateofus.eth' % (message_to_check, ens_stateofus)).is_element_displayed():
self.errors.append('%s ENS username is not set as primary by default' % ens_stateofus)
home_view.just_fyi('check view in chat settings ENS from other domain: %s after set new primary ENS' % ens_not_stateofus)
dapp_view.set_primary_ens_username(ens_user['ens_another_domain']).click()
if profile_view.username_in_ens_chat_settings_text.text != '@' + ens_not_stateofus:
self.errors.append('ENS username %s is not shown in ENS username Chat Settings after enabling' % ens_not_stateofus)
self.errors.verify_no_errors()
@marks.all
@marks.account
class TestProfileMultipleDevice(MultipleDeviceTestCase):
@marks.testrail_id(5432)
@marks.medium
def test_custom_bootnodes(self):
self.create_drivers(2)
sign_in_1, sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
home_1, home_2 = sign_in_1.create_user(), sign_in_2.create_user()
public_key = home_2.get_public_key_and_username()
profile_1, profile_2 = home_1.profile_button.click(), home_2.profile_button.click()
username_1, username_2 = profile_1.default_username_text.text, profile_2.default_username_text.text
profile_1.just_fyi('Add custom bootnode, enable bootnodes and check validation')
profile_1.advanced_button.click()
profile_1.bootnodes_button.click()
profile_1.add_bootnode_button.click()
profile_1.specify_name_input.set_value('test')
profile_1.bootnode_address_input.set_value('invalid_bootnode_address')
if not profile_1.element_by_text_part('Invalid format').is_element_displayed():
self.errors.append('Validation message about invalid format of bootnode is not shown')
profile_1.save_button.click()
if profile_1.add_bootnode_button.is_element_displayed():
self.errors.append('User was navigated to another screen when tapped on disabled "Save" button')
profile_1.bootnode_address_input.clear()
profile_1.bootnode_address_input.set_value(bootnode_address)
profile_1.save_button.click()
profile_1.enable_bootnodes.click()
profile_1.home_button.click()
profile_1.just_fyi('Add contact and send first message')
chat_1 = home_1.add_contact(public_key)
message = 'test message'
chat_1.chat_message_input.send_keys(message)
chat_1.send_message_button.click()
profile_2.home_button.click()
chat_2 = home_2.get_chat(username_1).click()
chat_2.chat_element_by_text(message).wait_for_visibility_of_element()
chat_2.add_to_contacts.click()
profile_1.just_fyi('Disable custom bootnodes')
chat_1.profile_button.click()
profile_1.enable_bootnodes.click()
profile_1.home_button.click()
profile_1.just_fyi('Send message and check that it is received after disabling bootnodes')
home_1.get_chat(username_2).click()
message_1 = 'new message'
chat_1.chat_message_input.send_keys(message_1)
chat_1.send_message_button.click()
for chat in chat_1, chat_2:
if not chat.chat_element_by_text(message_1).is_element_displayed():
self.errors.append('Message was not received after enabling bootnodes!')
self.errors.verify_no_errors()
@marks.testrail_id(5436)
@marks.medium
@marks.flaky
def test_add_switch_delete_custom_mailserver(self):
self.create_drivers(2)
sign_in_1, sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
home_1, home_2 = sign_in_1.create_user(), sign_in_2.create_user()
public_key = home_2.get_public_key_and_username()
home_2.get_back_to_home_view()
profile_1 = home_1.profile_button.click()
username_1 = profile_1.default_username_text.text
profile_1.just_fyi('disable autoselection')
profile_1.sync_settings_button.click()
profile_1.mail_server_button.click()
mailserver_1 = profile_1.return_mailserver_name(mailserver_hk, used_fleet)
mailserver_2 = profile_1.return_mailserver_name(mailserver_ams, used_fleet)
# TODO: temporary pin mailserver to avoid issue 9269 - should be disabled after fix
mailserver = mailserver_1 if profile_1.element_by_text(mailserver_2).is_element_present() else mailserver_2
profile_1.mail_server_auto_selection_button.click()
profile_1.element_by_text(mailserver).click()
profile_1.confirm_button.click()
profile_1.just_fyi('add custom mailserver (check address/name validation) and connect to it')
profile_1.plus_button.click()
server_name = 'test'
profile_1.save_button.click()
if profile_1.element_by_text(mailserver_ams).is_element_displayed():
self.errors.append('Could add custom mailserver with empty address and name')
profile_1.specify_name_input.set_value(server_name)
profile_1.mail_server_address_input.set_value(mailserver_address[:-3])
profile_1.save_button.click()
if profile_1.element_by_text(mailserver_2).is_element_displayed():
self.errors.append('could add custom mailserver with invalid address')
profile_1.mail_server_address_input.clear()
profile_1.mail_server_address_input.set_value(mailserver_address)
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()
profile_1.just_fyi('start chat with user2 and check that all messages are delivered')
chat_1 = home_1.add_contact(public_key)
message = 'test message'
chat_1.chat_message_input.send_keys(message)
chat_1.send_message_button.click()
chat_2 = home_2.get_chat(username_1).click()
chat_2.chat_element_by_text(message).wait_for_visibility_of_element()
message_1 = 'new message'
chat_2.chat_message_input.send_keys(message_1)
chat_2.send_message_button.click()
chat_1.chat_element_by_text(message_1).wait_for_visibility_of_element()
profile_1.just_fyi('delete custom mailserver')
chat_1.profile_button.click()
profile_1.sync_settings_button.click()
profile_1.mail_server_button.click()
profile_1.element_by_text(mailserver).scroll_to_element()
profile_1.element_by_text(mailserver).click()
profile_1.confirm_button.click()
profile_1.element_by_text(server_name).scroll_to_element()
profile_1.element_by_text(server_name).click()
profile_1.mail_server_delete_button.scroll_to_element()
profile_1.mail_server_delete_button.click()
profile_1.mail_server_confirm_delete_button.click()
if profile_1.element_by_text(server_name).is_element_displayed():
self.errors.append('Deleted custom mailserver is shown')
profile_1.get_back_to_home_view()
profile_1.relogin()
chat_1.profile_button.click()
profile_1.sync_settings_button.click()
profile_1.mail_server_button.click()
if profile_1.element_by_text(server_name).is_element_displayed():
self.errors.append('Deleted custom mailserver is shown after relogin')
self.errors.verify_no_errors()
@marks.testrail_id(5767)
@marks.medium
@marks.flaky
def test_can_not_connect_to_mailserver(self):
self.create_drivers(2)
sign_in_1, sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
home_1, home_2 = sign_in_1.create_user(), sign_in_2.create_user()
profile_1 = home_1.profile_button.click()
profile_1.just_fyi('add non-working mailserver and connect to it')
profile_1.sync_settings_button.click()
profile_1.mail_server_button.click()
profile_1.plus_button.click()
server_name = 'test'
profile_1.specify_name_input.set_value(server_name)
profile_1.mail_server_address_input.set_value(mailserver_address.replace('4','5'))
profile_1.save_button.click()
profile_1.mail_server_auto_selection_button.click()
profile_1.mail_server_by_name(server_name).click()
profile_1.mail_server_connect_button.click()
profile_1.confirm_button.click()
if not profile_1.element_by_text_part('Error connecting').is_element_displayed(30):
sign_in_1.driver.fail("No popup with 'Error connecting' is shown")
profile_1.element_by_text('CANCEL').click()
# TODO: blocked by 10065
# profile_1.home_button.click()
# home_2.just_fyi('send several messages to public channel')
# public_chat_name = home_2.get_random_chat_name()
# message = 'test_message'
# public_chat_2 = home_2.join_public_chat(public_chat_name)
# public_chat_2.chat_message_input.send_keys(message)
# public_chat_2.send_message_button.click()
# public_chat_2.back_button.click()
#
# profile_1.just_fyi('join same public chat and try to reconnect via "Tap to reconnect" and check "Connecting"')
# profile_1.home_button.click()
# home_1.join_public_chat(public_chat_name)
# public_chat_1 = home_1.get_chat_view()
# chat_state = 'Could not connect to mailserver. Tap to reconnect'
# public_chat_1.element_by_text(chat_state).click()
# if not public_chat_1.element_by_text_part('Connecting').is_element_displayed():
# self.errors.append("Indicator doesn't show 'Connecting'")
# profile_1.just_fyi('check that can RETRY to connect')
# for _ in range(2):
# public_chat_1.element_by_text('RETRY').wait_for_element(30)
# public_chat_1.element_by_text('RETRY').click()
#
# profile_1.just_fyi('check that can pick another mailserver and receive messages')
# public_chat_1.element_by_text('PICK ANOTHER').is_element_displayed(30)
# public_chat_1.element_by_text_part('PICK ANOTHER').click()
# mailserver = profile_1.return_mailserver_name(mailserver_ams, used_fleet)
# profile_1.element_by_text(mailserver).click()
# profile_1.confirm_button.click()
# profile_1.home_button.click()
# if not public_chat_1.chat_element_by_text(message).is_element_displayed(30):
# self.errors.append("Chat history wasn't fetched")
self.errors.verify_no_errors()
@marks.testrail_id(5762)
@marks.high
def test_pair_devices_sync_one_to_one_contacts_public_chat(self):
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
device_1_home = device_1.create_user()
device_1_home.profile_button.click()
device_1_profile = device_1_home.get_profile_view()
device_1_profile.privacy_and_security_button.click()
device_1_profile.backup_recovery_phrase_button.click()
device_1_profile.ok_continue_button.click()
recovery_phrase = device_1_profile.get_recovery_phrase()
device_1_profile.back_button.click()
device_1_profile.get_back_to_home_view()
device_1_name = 'device_%s' % device_1.driver.number
device_2_name = 'device_%s' % device_2.driver.number
message_before_sync = 'sent before sync'
message_after_sync = 'sent after sync'
public_chat_before_sync = 'before-pairing'
public_chat_after_sync = 'after-pairing'
device_1.just_fyi('add contact, start 1-1 chat with basic user')
device_1_chat = device_1_home.add_contact(basic_user['public_key'])
device_1_chat.chat_message_input.send_keys(message_before_sync)
device_1_chat.send_message_button.click()
device_1.just_fyi('join public chat')
device_1_chat.get_back_to_home_view()
device_1_public_chat = device_1_home.join_public_chat(public_chat_before_sync)
device_2.just_fyi('go to profile > Devices, set device name, discover device 2 to device 1')
device_2_home = device_2.recover_access(passphrase=' '.join(recovery_phrase.values()))
device_2_profile = device_2_home.get_profile_view()
device_2_profile.discover_and_advertise_device(device_2_name)
device_1_profile.discover_and_advertise_device(device_1_name)
device_1_profile.get_toggle_device_by_name(device_2_name).click()
device_1_profile.sync_all_button.click()
device_1_profile.sync_all_button.wait_for_visibility_of_element(15)
device_2.just_fyi('check that contact is appeared in Contact list')
device_2_profile.back_button.click()
device_2_profile.back_button.click()
device_2_profile.contacts_button.scroll_to_element(9, 'up')
device_2_profile.contacts_button.click()
if not device_2_profile.element_by_text(basic_user['username']).is_element_displayed():
self.errors.append('"%s" is not found in Contacts after initial sync' % basic_user['username'])
device_1.just_fyi('send message to 1-1 chat with basic user and add another contact')
device_1_profile.home_button.click()
device_1_public_chat.back_button.click()
device_1_home.get_chat(basic_user['username']).click()
device_1_chat.chat_message_input.send_keys(message_after_sync)
device_1_chat.send_message_button.click()
device_1_chat.back_button.click()
device_1_home.add_contact(transaction_senders['A']['public_key'])
device_2.just_fyi('check that messages appeared in 1-1 chat, public chats and new contacts are synced')
# TODO: blocked by 9805
# if not device_2_profile.element_by_text(transaction_senders['A']['username']).is_element_displayed(60):
# self.errors.append(
# '"%s" is not found in Contacts after adding when devices are paired' % transaction_senders['A'][
# 'username'])
device_2_profile.home_button.click()
if not device_2_home.element_by_text_part(public_chat_before_sync).is_element_displayed():
self.errors.append(
'"%s" is not found in Home after initial sync when devices are paired' % public_chat_before_sync)
chat = device_2_home.get_chat(basic_user['username']).click()
if chat.chat_element_by_text(message_before_sync).is_element_displayed():
self.errors.append('"%s" message sent before pairing is synced' % message_before_sync)
if not chat.chat_element_by_text(message_after_sync).is_element_displayed():
self.errors.append('"%s" message in 1-1 is not synced' % message_after_sync)
device_1.just_fyi('add new public chat and check that it will be synced with device2')
device_1_chat.get_back_to_home_view()
device_1_home.join_public_chat(public_chat_after_sync)
device_2_home = chat.get_back_to_home_view()
if not device_2_home.element_by_text_part(public_chat_after_sync).is_element_displayed(20):
self.errors.append(
'"%s" public chat is not synced after adding when devices are paired' % public_chat_after_sync)
self.errors.verify_no_errors()
@marks.testrail_id(5680)
@marks.high
@marks.skip
# TODO: skip until edit userpic is enabled back
def test_pair_devices_sync_name_photo_public_group_chats(self):
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
device_1_home = device_1.create_user()
device_1_home.profile_button.click()
device_1_profile = device_1_home.get_profile_view()
device_1_profile.privacy_and_security_button.click()
device_1_profile.backup_recovery_phrase_button.click()
recovery_phrase = device_1_profile.backup_recovery_phrase()
device_1_profile.back_button.click()
device_1_profile.get_back_to_home_view()
device_1_name = 'device_%s' % device_1.driver.number
device_2_name = 'device_%s' % device_2.driver.number
public_chat_before_sync_name = 'b-public-%s' % device_1_home.get_random_chat_name()
public_chat_after_sync_name = 'a-public-%s' % device_1_home.get_random_chat_name()
group_chat_name = 'group-%s' % device_1_home.get_random_chat_name()
message_after_sync = 'sent after sync'
device_1.just_fyi('join public chat, create group chat, edit user picture')
device_1_public_chat = device_1_home.join_public_chat(public_chat_before_sync_name)
device_1_public_chat.back_button.click()
device_1_one_to_one = device_1_home.add_contact(basic_user['public_key'])
device_1_one_to_one.back_button.click()
device_1_group_chat = device_1_home.create_group_chat([basic_user['username']], group_chat_name)
device_1_group_chat.back_button.click()
device_1_home.profile_button.click()
device_1_profile = device_1_home.get_profile_view()
device_1_profile.edit_profile_picture('sauce_logo.png')
device_2.just_fyi('go to profile > Devices, set device name, discover device 2 to device 1')
device_2_home = device_2.recover_access(passphrase=' '.join(recovery_phrase.values()))
device_2_profile = device_2_home.get_profile_view()
device_2_profile.discover_and_advertise_device(device_2_name)
device_1.just_fyi('enable pairing of `device 2` and sync')
device_1_profile.discover_and_advertise_device(device_1_name)
device_1_profile.get_toggle_device_by_name(device_2_name).click()
device_1_profile.sync_all_button.click()
device_1_profile.sync_all_button.wait_for_visibility_of_element(15)
device_2.just_fyi('check that public chat and profile details are updated')
device_2_home = device_2_profile.get_back_to_home_view()
if not device_2_home.element_by_text('#%s' % public_chat_before_sync_name).is_element_displayed():
self.errors.append('Public chat "%s" doesn\'t appear after initial sync'
% public_chat_before_sync_name)
device_2_home.home_button.click()
device_2_home.profile_button.click()
if not device_2_profile.profile_picture.is_element_image_equals_template('sauce_logo_profile.png'):
self.errors.append('Profile picture was not updated after initial sync')
device_2_profile.home_button.click()
device_1.just_fyi('send message to group chat, and join to new public chat')
device_1_home = device_1_profile.get_back_to_home_view()
device_1_public_chat = device_1_home.join_public_chat(public_chat_after_sync_name)
device_1_public_chat.back_button.click()
device_1_home.element_by_text(group_chat_name).click()
device_1_group_chat.chat_message_input.send_keys(message_after_sync)
device_1_group_chat.send_message_button.click()
device_1_group_chat.back_button.click()
device_2.just_fyi('check that message in group chat is shown, public chats are synced')
if not device_2_home.element_by_text('#%s' % public_chat_after_sync_name).is_element_displayed():
self.errors.append('Public chat "%s" doesn\'t appear on other device when devices are paired'
% public_chat_before_sync_name)
device_2_home.element_by_text(group_chat_name).click()
device_2_group_chat = device_2_home.get_chat_view()
if not device_2_group_chat.chat_element_by_text(message_after_sync).is_element_displayed():
self.errors.append('"%s" message in group chat is not synced' % message_after_sync)
self.errors.verify_no_errors()
@marks.testrail_id(6226)
@marks.critical
def test_ens_in_public_and_1_1_chats(self):
self.create_drivers(2)
device_1, device_2 = self.drivers[0], self.drivers[1]
sign_in_1, sign_in_2 = SignInView(device_1), SignInView(device_2)
user_1 = ens_user
home_1 = sign_in_1.recover_access(user_1['passphrase'])
home_2 = sign_in_2.create_user()
home_1.just_fyi('switching to mainnet and add ENS')
profile_1 = sign_in_1.profile_button.click()
profile_1.switch_network('Mainnet with upstream RPC')
home_1.profile_button.click()
dapp_view_1 = profile_1.ens_usernames_button.click()
dapp_view_1.element_by_text('Get started').click()
dapp_view_1.ens_name.set_value(ens_user['ens'])
expected_text = 'This user name is owned by you and connected with your chat key.'
if not dapp_view_1.wait_for_element_starts_with_text(expected_text):
sign_in_1.driver.fail("No %s is shown" % expected_text)
dapp_view_1.check_ens_name.click_until_presence_of_element(dapp_view_1.element_by_text('Ok, got it'))
dapp_view_1.element_by_text('Ok, got it').click()
home_1.just_fyi('check ENS name wallet address and public key')
profile_1.element_by_text(user_1['ens']).click()
for text in ('10 SNT, deposit unlocked', user_1['address'].lower(), user_1['public_key'] ):
if not profile_1.element_by_text_part(text).is_element_displayed():
self.errors.append('%s text is not shown' % text)
dapp_view_1.get_back_to_home_view()
profile_1.home_button.click()
home_2.just_fyi('joining same public chat, set ENS name and check it in chat from device2')
chat_name = home_1.get_random_chat_name()
chat_2 = home_2.join_public_chat(chat_name)
chat_1 = home_1.join_public_chat(chat_name)
chat_1.get_back_to_home_view()
home_1.profile_button.click()
profile_1.element_by_text('Your ENS name').click()
if profile_1.username_in_ens_chat_settings_text.text != '@' + user_1['ens']:
self.errors.append('ENS username is not shown in ENS usernames Chat Settings after enabling')
profile_1.back_button.click()
profile_1.home_button.click()
home_1.get_chat('#' + chat_name).click()
message_text_2 = 'message test text 1'
chat_1.send_message(message_text_2)
if not chat_2.wait_for_element_starts_with_text('@' + user_1['ens']):
self.errors.append('ENS username is not shown in public chat')
home_2.just_fyi('check that ENS name is shown in 1-1 chat without adding user as contact in header, profile, options')
chat_2.get_back_to_home_view()
chat_2_one_to_one = home_2.add_contact(ens_user['public_key'], False)
if chat_2_one_to_one.user_name_text.text != '@' + user_1['ens']:
self.errors.append('ENS username is not shown in 1-1 chat header')
chat_2_one_to_one.chat_options.click()
if not chat_2_one_to_one.element_by_text('@' + user_1['ens']).is_element_displayed():
self.errors.append('ENS username is not shown in 1-1 chat options')
chat_2_one_to_one.view_profile_button.click()
if not chat_2_one_to_one.element_by_text('@' + user_1['ens']).is_element_displayed():
self.errors.append('ENS username is not shown in user profile')
home_2.just_fyi('add user to contacts and check that ENS name is shown in contact')
chat_2_one_to_one.profile_add_to_contacts.click()
profile_2 = chat_2_one_to_one.profile_button.click()
profile_2.contacts_button.click()
if not profile_2.element_by_text('@' + user_1['ens']).is_element_displayed():
self.errors.append('ENS username is not shown in contacts')
self.errors.verify_no_errors()