Added atomic tests for chats and sigh in

Signed-off-by: yevh-berdnyk <ie.berdnyk@gmail.com>
This commit is contained in:
yevh-berdnyk 2018-06-21 18:40:27 +02:00
parent 73dab568ff
commit 8bf083cf88
No known key found for this signature in database
GPG Key ID: E9B425FDFC4DEA9C
13 changed files with 325 additions and 17 deletions

View File

View File

@ -0,0 +1,46 @@
from tests import marks, transaction_users, common_password
from tests.base_test_case import MultipleDeviceTestCase
from views.sign_in_view import SignInView
@marks.chat
@marks.transaction
class TestCommands(MultipleDeviceTestCase):
@marks.skip
@marks.testrail_case_id(3697)
def test_network_mismatch_for_send_request_commands(self):
recipient = transaction_users['C_USER']
sender = self.senders['d_user'] = transaction_users['D_USER']
self.create_drivers(2)
device_1_sign_in, device_2_sign_in = SignInView(self.drivers[0]), SignInView(self.drivers[1])
for user_details in (sender, device_1_sign_in), (recipient, device_2_sign_in):
user_details[1].recover_access(passphrase=user_details[0]['passphrase'],
password=user_details[0]['password'])
device_1_home, device_2_home = device_1_sign_in.get_home_view(), device_2_sign_in.get_home_view()
device_2_profile = device_2_home.profile_button.click()
device_2_profile.switch_network('Mainnet with upstream RPC')
device_2_sign_in.click_account_by_position(0)
device_2_sign_in.sign_in()
device_1_chat = device_1_home.add_contact(recipient['public_key'])
amount_1 = device_1_chat.get_unique_amount()
device_1_chat.send_transaction_in_1_1_chat(amount_1, common_password, wallet_set_up=True)
assert device_1_chat.chat_element_by_text(amount_1).status.text == 'Sent'
device_2_chat = device_2_home.get_chat_with_user(sender['username']).click()
chat_element_1 = device_2_chat.chat_element_by_text(amount_1)
chat_element_1.wait_for_visibility_of_element(120)
assert chat_element_1.status.text == 'Network mismatch'
assert chat_element_1.contains_text('On testnet')
amount_2 = device_1_chat.get_unique_amount()
device_1_chat.request_transaction_in_1_1_chat(amount_2)
assert device_1_chat.chat_element_by_text(amount_2).status.text == 'Sent'
chat_element_2 = device_2_chat.chat_element_by_text(amount_2)
chat_element_2.wait_for_visibility_of_element(120)
assert chat_element_2.status.text == 'Network mismatch'
assert chat_element_2.contains_text('On testnet')
assert chat_element_2.contains_text('Transaction Request')

View File

@ -0,0 +1,147 @@
import random
import string
import pytest
from tests import marks, get_current_time
from tests.base_test_case import MultipleDeviceTestCase
from views.sign_in_view import SignInView
@marks.all
@marks.chat
class TestMessagesOneToOneChat(MultipleDeviceTestCase):
@marks.skip
@marks.testrail_case_id(764)
def test_text_message_1_1_chat(self):
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
for sign_in in device_1, device_2:
sign_in.create_user()
device_1_home, device_2_home = device_1.get_home_view(), device_2.get_home_view()
device_2_public_key = device_2_home.get_public_key()
device_2_home.home_button.click()
device_1_chat = device_1_home.add_contact(device_2_public_key)
message = 'hello'
device_1_chat.chat_message_input.send_keys(message)
device_1_chat.send_message_button.click()
device_2_home.element_by_text(message, 'button').click()
if device_1_chat.chat_element_by_text(message).status.text != 'Seen':
pytest.fail("'Seen' status is shown under the sent text message")
@marks.skip
@marks.testrail_case_id(772)
def test_offline_messaging_1_1_chat(self):
self.create_drivers(2, offline_mode=True)
device_1, device_2 = self.drivers[0], self.drivers[1]
sign_in_1, sign_in_2 = SignInView(device_1), SignInView(device_2)
sign_in_1.create_user()
username_2 = sign_in_2.create_user()
home_1, home_2 = sign_in_1.get_home_view(), sign_in_2.get_home_view()
public_key_1 = home_1.get_public_key()
home_1.home_button.click()
device_1.set_network_connection(1) # airplane mode on primary device
chat_2 = home_2.add_contact(public_key_1)
message_1 = 'test message'
chat_2.chat_message_input.send_keys(message_1)
chat_2.send_message_button.click()
device_2.set_network_connection(1) # airplane mode on secondary device
device_1.set_network_connection(2) # turning on WiFi connection on primary device
chat_element = home_1.get_chat_with_user(username_2)
chat_element.wait_for_visibility_of_element(20)
chat_1 = chat_element.click()
chat_1.chat_element_by_text(message_1).wait_for_visibility_of_element(2)
device_2.set_network_connection(2) # turning on WiFi connection on secondary device
device_1.set_network_connection(1) # airplane mode on primary device
chat_2.element_by_text('Connecting to peers...').wait_for_invisibility_of_element(60)
message_2 = 'one more message'
chat_2.chat_message_input.send_keys(message_2)
chat_2.send_message_button.click()
device_1.set_network_connection(2) # turning on WiFi connection on primary device
chat_1 = chat_element.click()
chat_1.chat_element_by_text(message_2).wait_for_visibility_of_element(180)
@marks.testrail_case_id(3701)
def test_resend_message_offline(self):
self.create_drivers(2, offline_mode=True)
device_1, device_2 = self.drivers[0], self.drivers[1]
sign_in_1, sign_in_2 = SignInView(device_1), SignInView(device_2)
username_1 = 'user_%s' % get_current_time()
sign_in_1.create_user(username_1)
sign_in_2.create_user()
home_1, home_2 = sign_in_1.get_home_view(), sign_in_2.get_home_view()
public_key_2 = home_2.get_public_key()
home_2.home_button.click()
device_1.set_network_connection(1) # airplane mode on primary device
chat_1 = home_1.add_contact(public_key_2)
message = 'test message'
chat_1.chat_message_input.send_keys(message)
chat_1.send_message_button.click()
progress_time = chat_1.chat_element_by_text(message).progress_bar.measure_time_while_element_is_shown()
if not 9 < progress_time < 11:
self.errors.append('Progress indicator is shown during %s seconds' % progress_time)
device_1.set_network_connection(2) # turning on WiFi connection
chat_1.element_by_text('Not sent. Tap for options').click()
if not chat_1.element_by_text('Delete message').is_element_displayed():
self.errors.append("'Delete message' button is not shown for not sent message")
chat_1.connection_status.wait_for_invisibility_of_element(60)
chat_1.element_by_text('Resend').click()
if chat_1.chat_element_by_text(message).status.text != 'Sent':
self.errors.append("Message status is not 'Sent' after resending the message")
chat_2 = home_2.get_chat_with_user(username_1).click()
if not chat_2.chat_element_by_text(message).is_element_displayed(10):
self.errors.append("Message with text '%s' is not received" % message)
self.verify_no_errors()
@marks.testrail_case_id(3710)
def test_messaging_in_different_networks(self):
self.create_drivers(2, offline_mode=True)
device_1, device_2 = self.drivers[0], self.drivers[1]
sign_in_1, sign_in_2 = SignInView(device_1), SignInView(device_2)
username_1 = 'user_%s' % get_current_time()
sign_in_1.create_user(username_1)
sign_in_2.create_user()
home_1, home_2 = sign_in_1.get_home_view(), sign_in_2.get_home_view()
public_key_2 = home_2.get_public_key()
profile_2 = home_2.get_profile_view()
profile_2.switch_network('Mainnet with upstream RPC')
sign_in_2.click_account_by_position(0)
sign_in_2.sign_in()
chat_1 = home_1.add_contact(public_key_2)
message = 'test message'
chat_1.chat_message_input.send_keys(message)
chat_1.send_message_button.click()
chat_2 = home_2.get_chat_with_user(username_1).click()
chat_2.chat_element_by_text(message).wait_for_visibility_of_element()
public_chat_name = ''.join(random.choice(string.ascii_lowercase) for _ in range(7))
chat_1.get_back_to_home_view()
home_1.join_public_chat(public_chat_name)
chat_2.get_back_to_home_view()
home_2.join_public_chat(public_chat_name)
chat_1.chat_message_input.send_keys(message)
chat_1.send_message_button.click()
chat_2.chat_element_by_text(message).wait_for_visibility_of_element()

View File

@ -0,0 +1,33 @@
import random
import string
from tests import marks
from tests.base_test_case import MultipleDeviceTestCase
from views.sign_in_view import SignInView
@marks.chat
class TestMessagesPublicChat(MultipleDeviceTestCase):
@marks.skip
@marks.testrail_case_id(1383)
def test_public_chat(self):
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
users = list()
chats = list()
chat_name = ''.join(random.choice(string.ascii_lowercase) for _ in range(7))
for sign_in in device_1, device_2:
users.append(sign_in.create_user())
home = sign_in.get_home_view()
chats.append(home.join_public_chat(chat_name))
chat_1, chat_2 = chats[0], chats[1]
if chat_1.connection_status.text != 'Fetching messages...':
self.errors.append("'Fetching messages...' status is not shown")
message = 'hello'
chat_1.chat_message_input.send_keys(message)
chat_1.send_message_button.click()
chat_2.verify_message_is_under_today_text(message, self.errors)

View File

@ -0,0 +1,24 @@
from tests import marks
from tests.base_test_case import MultipleDeviceTestCase
from views.sign_in_view import SignInView
@marks.all
@marks.sign_in
class TestSignIn(MultipleDeviceTestCase):
@marks.testrail_case_id(1432)
def test_offline_login(self):
self.create_drivers(1, offline_mode=True)
driver = self.drivers[0]
sign_in = SignInView(driver)
sign_in.create_user()
driver.close_app()
driver.set_network_connection(1) # airplane mode
driver.launch_app()
sign_in.accept_agreements()
home = sign_in.sign_in()
home.home_button.wait_for_visibility_of_element()
assert home.connection_status.text == 'Offline'

View File

@ -10,4 +10,5 @@ chat_management = pytest.mark.chat_management
message_reliability = pytest.mark.message_reliability message_reliability = pytest.mark.message_reliability
transaction = pytest.mark.transaction transaction = pytest.mark.transaction
wallet = pytest.mark.wallet wallet = pytest.mark.wallet
sign_in = pytest.mark.sign_in
skip = pytest.mark.skip skip = pytest.mark.skip

View File

@ -290,10 +290,10 @@ class TestOfflineMessages(MultipleDeviceTestCase):
sign_in_2.click_account_by_position(0) sign_in_2.click_account_by_position(0)
sign_in_2.sign_in() sign_in_2.sign_in()
sign_in_2.home_button.wait_for_visibility_of_element() sign_in_2.home_button.wait_for_visibility_of_element()
if not home_2.offline_label.is_element_displayed(): if home_2.connection_status.text != 'Offline':
self.errors.append('Offline label is not shown on Home view while being offline') self.errors.append('Offline label is not shown on Home view while being offline')
chat_2 = home_2.get_chat_with_user(username_1).click() chat_2 = home_2.get_chat_with_user(username_1).click()
if not chat_2.offline_label.is_element_displayed(): if chat_2.connection_status.text != 'Offline':
self.errors.append('Offline label is not shown on Chat view while being offline') self.errors.append('Offline label is not shown on Chat view while being offline')
device_2.set_network_connection(2) # turning on WiFi connection device_2.set_network_connection(2) # turning on WiFi connection
chat_2.wait_for_message_in_one_to_one_chat(message_text, self.errors, wait_time=120) chat_2.wait_for_message_in_one_to_one_chat(message_text, self.errors, wait_time=120)
@ -326,10 +326,10 @@ class TestOfflineMessages(MultipleDeviceTestCase):
chat_element_2.wait_for_visibility_of_element() chat_element_2.wait_for_visibility_of_element()
device_2.set_network_connection(1) # airplane mode device_2.set_network_connection(1) # airplane mode
if not home_2.offline_label.is_element_displayed(): if home_2.connection_status.text != 'Offline':
self.errors.append('Offline label is not shown on Home view while being offline') self.errors.append('Offline label is not shown on Home view while being offline')
chat_2 = chat_element_2.click() chat_2 = chat_element_2.click()
if not chat_2.offline_label.is_element_displayed(): if chat_2.connection_status.text != 'Offline':
self.errors.append('Offline label is not shown on Chat view while being offline') self.errors.append('Offline label is not shown on Chat view while being offline')
message_text = 'test message' message_text = 'test message'

View File

@ -3,6 +3,8 @@ from io import BytesIO
import os import os
import time import time
from timeit import timeit
from PIL import Image, ImageChops from PIL import Image, ImageChops
from appium.webdriver.common.mobileby import MobileBy from appium.webdriver.common.mobileby import MobileBy
from appium.webdriver.common.touch_action import TouchAction from appium.webdriver.common.touch_action import TouchAction
@ -153,6 +155,16 @@ class BaseElement(object):
action = TouchAction(self.driver) action = TouchAction(self.driver)
action.long_press(element).release().perform() action.long_press(element).release().perform()
def measure_time_before_element_appears(self, max_wait_time=30):
def wrapper():
return self.wait_for_visibility_of_element(max_wait_time)
return timeit(wrapper, number=1)
def measure_time_while_element_is_shown(self, max_wait_time=30):
def wrapper():
return self.wait_for_invisibility_of_element(max_wait_time)
return timeit(wrapper, number=1)
class BaseEditBox(BaseElement): class BaseEditBox(BaseElement):

View File

@ -146,10 +146,11 @@ class SendMessageButton(BaseButton):
info('Tap on %s' % self.name) info('Tap on %s' % self.name)
class OfflineLabelText(BaseText): class ConnectionStatusText(BaseText):
def __init__(self, driver): def __init__(self, driver):
super(OfflineLabelText, self).__init__(driver) super(ConnectionStatusText, self).__init__(driver)
self.locator = self.Locator.text_selector('Offline') self.locator = self.Locator.xpath_selector(
"//*[@content-desc='connection-status-text']/android.widget.TextView")
class BaseView(object): class BaseView(object):
@ -172,7 +173,7 @@ class BaseView(object):
self.save_button = SaveButton(self.driver) self.save_button = SaveButton(self.driver)
self.done_button = DoneButton(self.driver) self.done_button = DoneButton(self.driver)
self.delete_button = DeleteButton(self.driver) self.delete_button = DeleteButton(self.driver)
self.offline_label = OfflineLabelText(self.driver) self.connection_status = ConnectionStatusText(self.driver)
self.apps_button = AppsButton(self.driver) self.apps_button = AppsButton(self.driver)
self.status_app_icon = StatusAppIcon(self.driver) self.status_app_icon = StatusAppIcon(self.driver)
@ -186,8 +187,9 @@ class BaseView(object):
def accept_agreements(self): def accept_agreements(self):
iterations = int() iterations = int()
from views.sign_in_view import CreateAccountButton from views.sign_in_view import CreateAccountButton, PasswordInput
while iterations <= 3 and not CreateAccountButton(self.driver).is_element_displayed(): while iterations <= 3 and not (CreateAccountButton(self.driver).is_element_displayed() or PasswordInput(
self.driver).is_element_displayed()):
for button in self.ok_button, self.continue_button: for button in self.ok_button, self.continue_button:
try: try:
button.wait_for_element(15) button.wait_for_element(15)

View File

@ -1,7 +1,7 @@
import time import time
from selenium.common.exceptions import TimeoutException from selenium.common.exceptions import TimeoutException
from tests import info from tests import info
from views.base_element import BaseButton, BaseEditBox, BaseText from views.base_element import BaseButton, BaseEditBox, BaseText, BaseElement
from views.base_view import BaseView from views.base_view import BaseView
from views.profile_view import ProfilePictureElement from views.profile_view import ProfilePictureElement
@ -194,6 +194,37 @@ class SendRequestButton(BaseButton):
self.locator = self.Locator.xpath_selector('//*[contains(@text, "%s.ETH")]/../*[@text="Send"]' % amount) self.locator = self.Locator.xpath_selector('//*[contains(@text, "%s.ETH")]/../*[@text="Send"]' % amount)
class ChatElementByText(BaseText):
def __init__(self, driver, text):
super(ChatElementByText, self).__init__(driver)
self.locator = self.Locator.xpath_selector(
"//*[starts-with(@text,'%s')]/ancestor::android.view.ViewGroup[@content-desc='chat-item']" % text)
@property
def status(self):
class StatusText(BaseText):
def __init__(self, driver, parent_locator: str):
super(StatusText, self).__init__(driver)
self.locator = self.Locator.xpath_selector(parent_locator + '/android.widget.TextView')
return StatusText(self.driver, self.locator.value)
@property
def progress_bar(self):
class ProgressBar(BaseElement):
def __init__(self, driver, parent_locator: str):
super(ProgressBar, self).__init__(driver)
self.locator = self.Locator.xpath_selector(parent_locator + '//android.widget.ProgressBar')
return ProgressBar(self.driver, self.locator.value)
def contains_text(self, text) -> bool:
element = BaseText(self.driver)
element.locator = element.Locator.xpath_selector("//android.view.ViewGroup//android.widget.TextView[@text='%s']"
% text)
return element.is_element_displayed()
class ChatView(BaseView): class ChatView(BaseView):
def __init__(self, driver): def __init__(self, driver):
super(ChatView, self).__init__(driver) super(ChatView, self).__init__(driver)
@ -244,7 +275,8 @@ class ChatView(BaseView):
def wait_for_message_in_one_to_one_chat(self, expected_message: str, errors: list, wait_time: int = 20): def wait_for_message_in_one_to_one_chat(self, expected_message: str, errors: list, wait_time: int = 20):
try: try:
self.wait_for_element_starts_with_text(expected_message, wait_time=wait_time) element = ChatElementByText(self.driver, expected_message)
element.wait_for_element(wait_time)
except TimeoutException: except TimeoutException:
errors.append('Message with text "%s" was not received' % expected_message) errors.append('Message with text "%s" was not received' % expected_message)
@ -341,7 +373,14 @@ class ChatView(BaseView):
def chat_element_by_text(self, text): def chat_element_by_text(self, text):
info("Looking for full text: '%s'" % text) info("Looking for full text: '%s'" % text)
element = self.element_types['text'](self.driver) return ChatElementByText(self.driver, text)
element.locator = element.Locator.xpath_selector(
"//*[@content-desc='chat-item']//*[starts-with(@text,'%s')]" % text) def verify_message_is_under_today_text(self, text, errors):
return element message_element = self.chat_element_by_text(text)
message_element.wait_for_visibility_of_element()
message_location = message_element.find_element().location['y']
today_text_element = self.element_by_text('Today').find_element()
today_location = today_text_element.location['y']
today_height = today_text_element.size['height']
if message_location < today_location + today_height:
errors.append("Message '%s' is not uder 'Today' text" % text)

View File

@ -94,6 +94,7 @@ class HomeView(BaseView):
start_new_chat.confirm() start_new_chat.confirm()
one_to_one_chat = self.get_chat_view() one_to_one_chat = self.get_chat_view()
one_to_one_chat.chat_message_input.wait_for_element(60) one_to_one_chat.chat_message_input.wait_for_element(60)
return one_to_one_chat
def start_1_1_chat(self, username): def start_1_1_chat(self, username):
start_new_chat = self.plus_button.click() start_new_chat = self.plus_button.click()
@ -119,6 +120,8 @@ class HomeView(BaseView):
start_new_chat.chat_name_editbox.send_keys(chat_name) start_new_chat.chat_name_editbox.send_keys(chat_name)
time.sleep(2) time.sleep(2)
start_new_chat.confirm() start_new_chat.confirm()
from views.chat_view import ChatView
return ChatView(self.driver)
def get_public_key(self): def get_public_key(self):
profile_view = self.profile_button.click() profile_view = self.profile_button.click()

View File

@ -2,6 +2,7 @@ from tests import get_current_time, common_password
from views.base_element import BaseButton, BaseEditBox from views.base_element import BaseButton, BaseEditBox
from views.base_view import BaseView from views.base_view import BaseView
class AccountButton(BaseButton): class AccountButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
@ -137,7 +138,7 @@ class SignInView(BaseView):
def sign_in(self, password=common_password): def sign_in(self, password=common_password):
self.password_input.set_value(password) self.password_input.set_value(password)
self.sign_in_button.click() return self.sign_in_button.click()
def click_account_by_position(self, position: int): def click_account_by_position(self, position: int):
self.account_button.find_elements()[position].click() self.account_button.find_elements()[position].click()