From 698e90a62cc0c2049138798390c5b3463ef8ba59 Mon Sep 17 00:00:00 2001 From: Anton Danchenko Date: Tue, 26 Sep 2017 13:50:34 +0300 Subject: [PATCH] added 'recover access' and 'send transaction in group chat' tests --- test/appium/tests/__init__.py | 24 +++++++ test/appium/tests/basetestcase.py | 1 + test/appium/tests/conftest.py | 3 +- test/appium/tests/preconditions.py | 18 ++++- test/appium/tests/test_sanity.py | 112 ++++++++++++++++++----------- test/appium/views/base_view.py | 12 ++-- test/appium/views/chats.py | 9 ++- test/appium/views/home.py | 14 ++-- test/appium/views/login.py | 28 +++++++- 9 files changed, 164 insertions(+), 57 deletions(-) diff --git a/test/appium/tests/__init__.py b/test/appium/tests/__init__.py index 63727a34d8..ea4d1d66e7 100644 --- a/test/appium/tests/__init__.py +++ b/test/appium/tests/__init__.py @@ -17,4 +17,28 @@ class TestData(object): def __init__(self): self.name = None + +basic_user = {'password': "qwerty", + 'passphrase': "level acquire claim tide company believe duck embody consider dune century mountain", + 'username': "Silky Heavenly Zethusspinipes"} + +transaction_users = { + 'A_USER': {'password': "qwerty", + 'passphrase': "pet letter very ozone shop humor " + "shuffle bounce convince soda hint brave", + 'public_key': '0x040e016b940e067997be8d91298d893ff2bc3580504b4ccb155ea03d183b85f1' + '8e771a763d99f60fec70edf637eb6bad9f96d3e8a544168d3ad144f83b4cf7625c', + 'address': '67a50ef1d26de6d65dbfbb88172ac1e7017e766d', + 'username': 'Evergreen Handsome Cottontail'}, + + 'B_USER': {'password': "qwerty", + 'passphrase': "resemble soap taxi meat reason " + "inflict dilemma calm warrior key gloom again", + 'public_key': '0x0406b17e5cdfadb2a05e84508b1a2916def6395e6295f57e92b85f915d40bca3' + 'f4a7e4c6d6b25afa840dd042fac83d3f856181d553f34f1c2b12878e774adde099', + 'address': '3d672407a7e1250bbff85b7cfdb456f5015164db', + 'username': 'Brief Organic Xenops' + }, + } + tests_data = TestData() diff --git a/test/appium/tests/basetestcase.py b/test/appium/tests/basetestcase.py index edf1580e9c..44cd69e448 100644 --- a/test/appium/tests/basetestcase.py +++ b/test/appium/tests/basetestcase.py @@ -39,6 +39,7 @@ class AbstractTestCase: desired_caps['name'] = tests_data.name desired_caps['build'] = pytest.config.getoption('build') desired_caps['idleTimeout'] = 1000 + desired_caps['commandTimeout'] = 600 return desired_caps def get_public_url(self, driver): diff --git a/test/appium/tests/conftest.py b/test/appium/tests/conftest.py index 3eba1185ae..c79f288fb9 100644 --- a/test/appium/tests/conftest.py +++ b/test/appium/tests/conftest.py @@ -2,10 +2,9 @@ from tests import tests_data import time import requests import re -import shutil from datetime import datetime from os import environ -from io import BytesIO, StringIO +from io import BytesIO from sauceclient import SauceClient storage = 'http://artifacts.status.im:8081/artifactory/nightlies-local/' diff --git a/test/appium/tests/preconditions.py b/test/appium/tests/preconditions.py index 6f07ad4a8d..83d6fab8df 100644 --- a/test/appium/tests/preconditions.py +++ b/test/appium/tests/preconditions.py @@ -3,8 +3,22 @@ def set_password_as_new_user(*args): for view in args: view.request_password_icon.click() - view.type_message_edit_box.send_keys("qwerty1234") + view.chat_request_input.send_keys("qwerty1234") view.confirm() - view.type_message_edit_box.send_keys("qwerty1234") + view.chat_request_input.send_keys("qwerty1234") view.confirm() view.find_full_text("Tap here to enter your phone number & I\'ll find your friends") + + +def recover_access(chats, passphrase, password, username): + chats.back_button.click() + chats.profile_button.click() + login = chats.switch_users_button.click() + login.recover_access_button.click() + login.passphrase_input.send_keys(passphrase) + login.password_input.send_keys(password) + login.confirm_recover_access.click() + recovered_user = login.element_by_text(username, 'button') + recovered_user.click() + login.password_input.send_keys(password) + login.sign_in_button.click() diff --git a/test/appium/tests/test_sanity.py b/test/appium/tests/test_sanity.py index 9345979d9c..2fc0dd3368 100644 --- a/test/appium/tests/test_sanity.py +++ b/test/appium/tests/test_sanity.py @@ -1,49 +1,29 @@ import pytest from tests.basetestcase import SingleDeviceTestCase from views.home import HomeView -from tests.preconditions import set_password_as_new_user +from tests.preconditions import set_password_as_new_user, recover_access +from tests import basic_user, transaction_users @pytest.mark.sanity class TestSanity(SingleDeviceTestCase): - def test_transaction(self): + def test_recover_access(self): home = HomeView(self.driver) set_password_as_new_user(home) chats = home.get_chats() - chats.wait_for_syncing_complete() chats.back_button.click() chats.profile_button.click() - profile = chats.profile_icon.click() - - sender_address = profile.profile_address_text.text - recipient_key = '0x040e016b940e067997be8d91298d893ff2bc3580504b4ccb155ea03d183b85f1' \ - '8e771a763d99f60fec70edf637eb6bad9f96d3e8a544168d3ad144f83b4cf7625c' - recipient_address = '67a50ef1d26de6d65dbfbb88172ac1e7017e766d' - - profile.get_donate(sender_address) - initial_balance = profile.get_balance(recipient_address) - - profile.back_button.click() - chats.plus_button.click() - chats.add_new_contact.click() - chats.public_key_edit_box.send_keys(recipient_key) - chats.confirm() - chats.confirm_public_key_button.click() - - chats.send_funds_button.click() - chats.first_recipient_button.click() - chats.send_int_as_keyevent(0) - chats.send_dot_as_keyevent() - chats.send_int_as_keyevent(1) - chats.send_message_button.click() - chats.confirm_transaction_button.click() - chats.password_input.send_keys('qwerty1234') - chats.confirm_button.click() - chats.got_it_button.click() - chats.find_full_text('0.1') - chats.find_full_text('Sent', 60) - chats.verify_balance_is_updated(initial_balance, recipient_address) + login = chats.switch_users_button.click() + login.recover_access_button.click() + login.passphrase_input.send_keys(basic_user['passphrase']) + login.password_input.send_keys(basic_user['password']) + login.confirm_recover_access.click() + recovered_user = login.element_by_text(basic_user['username'], 'button') + recovered_user.click() + login.password_input.send_keys(basic_user['password']) + login.sign_in_button.click() + home.find_full_text('Chats', 10) @pytest.mark.parametrize("verification", ["invalid", "valid"]) def test_sign_in(self, verification): @@ -65,23 +45,75 @@ class TestSanity(SingleDeviceTestCase): login.sign_in_button.click() home.find_full_text(verifications[verification]["outcome"], 10) - @pytest.mark.parametrize("verification", ["short", "mismatch", "valid"]) + @pytest.mark.parametrize("verification", ["short", "mismatch"]) def test_password(self, verification): - verifications = {"short": {"input": "qwe1", "outcome": "Password should be not less then 6 symbols."}, - "valid": - {"input": "qwerty1234", - "outcome": "Tap here to enter your phone number & I\'ll find your friends"}, "mismatch": {"input": "mismatch1234", "outcome": "Password confirmation doesn\'t match password."}} home = HomeView(self.driver) home.request_password_icon.click() - home.type_message_edit_box.send_keys(verifications[verification]["input"]) + home.chat_request_input.send_keys(verifications[verification]["input"]) home.confirm() if 'short' not in verification: - home.type_message_edit_box.send_keys(verifications["valid"]["input"]) + home.chat_request_input.send_keys("qwerty1234") home.confirm() home.find_full_text(verifications[verification]["outcome"]) + + @pytest.mark.parametrize("test, recipient, sender", [('group_chat', 'A_USER', 'B_USER'), + ('one_to_one_chat', 'B_USER', 'A_USER')], + ids=['group_chat', 'one_to_one_chat']) + def test_send_transaction(self, test, recipient, sender): + home = HomeView(self.driver) + set_password_as_new_user(home) + chats = home.get_chats() + recover_access(chats, + transaction_users[sender]['passphrase'], + transaction_users[sender]['password'], + transaction_users[sender]['username']) + chats.wait_for_syncing_complete() + + sender_address = transaction_users[sender]['address'] + recipient_address = transaction_users[recipient]['address'] + recipient_key = transaction_users[recipient]['public_key'] + initial_balance_recipient = chats.get_balance(recipient_address) + + if chats.get_balance(sender_address) < 1000000000000000000: + chats.get_donate(sender_address) + + chats.plus_button.click() + chats.add_new_contact.click() + chats.public_key_edit_box.send_keys(recipient_key) + chats.confirm() + chats.confirm_public_key_button.click() + + if test == 'group_chat': + user_name = chats.user_name_text.text + chats.back_button.click() + chats.new_group_chat_button.click() + user_contact = chats.element_by_text(user_name, 'button') + user_contact.scroll_to_element() + user_contact.click() + chats.next_button.click() + chats.name_edit_box.send_keys('chat_send_transaction') + chats.save_button.click() + + chats.send_funds_button.click() + chats.first_recipient_button.click() + chats.send_int_as_keyevent(0) + chats.send_dot_as_keyevent() + chats.send_int_as_keyevent(1) + chats.send_message_button.click() + chats.confirm_transaction_button.wait_for_element(60) + chats.confirm_transaction_button.click() + chats.password_input.send_keys(transaction_users[sender]['password']) + chats.confirm_button.click() + chats.got_it_button.click() + + chats.find_full_text('0.1') + chats.find_full_text('Sent', 60) + if test == 'group_chat': + chats.find_full_text('to ' + transaction_users[recipient]['username'], 60) + chats.verify_balance_is_updated(initial_balance_recipient, recipient_address) diff --git a/test/appium/views/base_view.py b/test/appium/views/base_view.py index 2a7a40b845..3c5dc80b4d 100644 --- a/test/appium/views/base_view.py +++ b/test/appium/views/base_view.py @@ -32,6 +32,7 @@ class BaseViewObject(object): def send_int_as_keyevent(self, integer): keys = {0: 7, 1: 8, 2: 9, 3: 10, 4: 11, 5: 12, 6: 13, 7: 14, 8: 15, 9: 16} + time.sleep(2) self.driver.keyevent(keys[integer]) def send_dot_as_keyevent(self): @@ -66,16 +67,16 @@ class BaseViewObject(object): def get_balance(self, address): url = 'http://ropsten.etherscan.io/api?module=account&action=balance&address=0x%s&tag=latest' % address - return requests.request('GET', url).json()["result"] + return int(requests.request('GET', url).json()["result"]) def get_donate(self, address, wait_time=300): + initial_balance = self.get_balance(address) response = requests.request('GET', 'http://46.101.129.137:3001/donate/0x%s' % address).json() counter = 0 while True: if counter == wait_time: - logging.info("Donation was not received during %s seconds!" % wait_time) - break - elif self.get_balance(address) != '1000000000000000000': + pytest.fail("Donation was not received during %s seconds!" % wait_time) + elif self.get_balance(address) == initial_balance: counter += 10 time.sleep(10) logging.info('Waiting %s seconds for donation' % counter) @@ -87,8 +88,7 @@ class BaseViewObject(object): counter = 0 while True: if counter == wait_time: - logging.info('Balance is not changed during %s seconds, funds were not received!') - break + pytest.fail('Balance is not changed during %s seconds, funds were not received!' % wait_time) elif initial_balance == self.get_balance(recipient_address): counter += 10 time.sleep(10) diff --git a/test/appium/views/chats.py b/test/appium/views/chats.py index e39603a56a..a07d652d72 100644 --- a/test/appium/views/chats.py +++ b/test/appium/views/chats.py @@ -28,9 +28,14 @@ class SwitchUsersButton(BaseButton): super(SwitchUsersButton, self).__init__(driver) self.locator = self.Locator.xpath_selector("//android.widget.TextView[@text='SWITCH USERS']") + def click(self): + time.sleep(2) + self.find_element().click() + logging.info('Tap on %s' % self.name) + return self.navigate() + def navigate(self): from views.login import LoginView - time.sleep(2) return LoginView(self.driver) @@ -143,7 +148,7 @@ class SendMessageButton(BaseButton): self.locator = self.Locator.accessibility_id("send-message-button") def click(self): - time.sleep(30) + time.sleep(10) self.find_element().click() logging.info('Tap on %s' % self.name) diff --git a/test/appium/views/home.py b/test/appium/views/home.py index 3c3ce67ea7..20f3b2f731 100644 --- a/test/appium/views/home.py +++ b/test/appium/views/home.py @@ -17,12 +17,12 @@ class ContinueButtonAPK(BaseButton): self.locator = self.Locator.xpath_selector("//*[@text='Continue']") -class TypeMessageEditBox(BaseEditBox): +class ChatRequestInput(BaseEditBox): def __init__(self, driver): - super(TypeMessageEditBox, self).__init__(driver) + super(ChatRequestInput, self).__init__(driver) self.locator = \ - self.Locator.xpath_selector("//*[@content-desc!='chat-message-input']") + self.Locator.xpath_selector("//android.widget.EditText[@content-desc!='chat-message-input']") class RequestPasswordIcon(BaseButton): @@ -31,6 +31,12 @@ class RequestPasswordIcon(BaseButton): super(RequestPasswordIcon, self).__init__(driver) self.locator = self.Locator.xpath_selector("//*[@content-desc='request-password']") + def click(self): + self.wait_for_element(60) + self.find_element().click() + logging.info('Tap on %s' % self.name) + return self.navigate() + class HomeView(BaseViewObject): @@ -45,5 +51,5 @@ class HomeView(BaseViewObject): except (NoSuchElementException, TimeoutException): pass - self.type_message_edit_box = TypeMessageEditBox(driver) + self.chat_request_input = ChatRequestInput(driver) self.request_password_icon = RequestPasswordIcon(driver) diff --git a/test/appium/views/login.py b/test/appium/views/login.py index 9221a3b6dc..3efc842827 100644 --- a/test/appium/views/login.py +++ b/test/appium/views/login.py @@ -14,7 +14,7 @@ class PasswordInput(BaseEditBox): def __init__(self, driver): super(PasswordInput, self).__init__(driver) - self.locator = self.Locator.xpath_selector("//android.widget.EditText") + self.locator = self.Locator.xpath_selector("//android.widget.TextView[@text='Password']") class SignInButton(BaseButton): @@ -24,6 +24,28 @@ class SignInButton(BaseButton): self.locator = self.Locator.xpath_selector("//android.widget.TextView[@text='Sign in']") +class RecoverAccessButton(BaseButton): + + def __init__(self, driver): + super(RecoverAccessButton, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//android.widget.TextView[@text='Recover access']") + + +class PassphraseInput(BaseEditBox): + + def __init__(self, driver): + super(PassphraseInput, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//android.widget.TextView[@text='Passphrase']") + + +class ConfirmRecoverAccess(BaseButton): + + def __init__(self, driver): + super(ConfirmRecoverAccess, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//android.widget.TextView[@text='RECOVER ACCESS']") + + + class LoginView(BaseViewObject): def __init__(self, driver): @@ -33,3 +55,7 @@ class LoginView(BaseViewObject): self.first_account_button = FirstAccountButton(self.driver) self.password_input = PasswordInput(self.driver) self.sign_in_button = SignInButton(self.driver) + + self.recover_access_button = RecoverAccessButton(self.driver) + self.passphrase_input = PassphraseInput(self.driver) + self.confirm_recover_access = ConfirmRecoverAccess(self.driver)