e2e: new community tests

This commit is contained in:
pavloburykh 2022-12-13 20:07:34 +02:00 committed by Churikova Tetiana
parent 6a05d43b75
commit f47bc6e40e
No known key found for this signature in database
GPG Key ID: 0D4EA7B33B47E6D8
4 changed files with 311 additions and 6 deletions

View File

@ -125,6 +125,8 @@ class TestrailReport(BaseTestReport):
test_cases['pr']['one_to_one_chat'] = 50956 test_cases['pr']['one_to_one_chat'] = 50956
test_cases['pr']['deep_links'] = 50967 test_cases['pr']['deep_links'] = 50967
test_cases['pr']['group_chat'] = 50964 test_cases['pr']['group_chat'] = 50964
test_cases['pr']['community_single'] = 50983
test_cases['pr']['community_multiple'] = 50982
## Nightly e2e ## Nightly e2e
# test_cases['nightly']['medium'] = 736 # test_cases['nightly']['medium'] = 736

View File

@ -1,13 +1,17 @@
import random import random
import time
from datetime import timedelta from datetime import timedelta
import emoji import emoji
import pytest import pytest
from dateutil import parser from dateutil import parser
from tests import marks, test_dapp_name, test_dapp_url from tests import marks, test_dapp_name, test_dapp_url, run_in_parallel
from tests.base_test_case import create_shared_drivers, MultipleSharedDeviceTestCase from tests.base_test_case import create_shared_drivers, MultipleSharedDeviceTestCase
from views.sign_in_view import SignInView from views.sign_in_view import SignInView
from views.chat_view import CommunityView
from views.base_view import BaseView
from views.chat_view import ChatView
from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import NoSuchElementException
@ -508,3 +512,282 @@ class TestPublicChatBrowserOneDeviceMerged(MultipleSharedDeviceTestCase):
if not dapp.element_by_translation_id("your-contact-code").is_element_displayed(): if not dapp.element_by_translation_id("your-contact-code").is_element_displayed():
self.errors.append('Profile permission is not asked') self.errors.append('Profile permission is not asked')
self.errors.verify_no_errors() self.errors.verify_no_errors()
@pytest.mark.xdist_group(name="three_1")
@marks.new_ui_critical
class TestCommunityOneDeviceMerged(MultipleSharedDeviceTestCase):
def prepare_devices(self):
self.drivers, self.loop = create_shared_drivers(1)
self.sign_in = SignInView(self.drivers[0])
self.home = self.sign_in.create_user()
self.home.communities_tab.click_until_presence_of_element(self.home.plus_button)
self.community_name = self.home.get_random_chat_name()
self.channel_name = self.home.get_random_chat_name()
self.community = self.home.create_community(name=self.community_name, description='test description', require_approval=False)
self.channel = self.community.add_channel(name=self.channel_name)
@marks.testrail_id(702846)
def test_community_navigate_to_channel_when_relaunch(self):
text_message = 'some_text'
if not self.channel.chat_message_input.is_element_displayed():
self.home.communities_tab.double_click()
self.home.get_chat(self.community_name, community=True).click()
self.community.get_chat(self.channel_name).click()
self.channel.send_message(text_message)
self.channel.reopen_app()
if not self.channel.chat_element_by_text(text_message).is_element_displayed(30):
self.drivers[0].fail("Not navigated to channel view after reopening app")
@marks.testrail_id(702847)
# TODO long press and assertion of text in input field is currently not working on e2e builds. needs to be investigated
@marks.skip('needs to be refactored')
def test_community_copy_and_paste_message_in_chat_input(self):
message_text = {'text_message': 'mmmeowesage_text'}
formatted_message = {'message_with_link': 'https://status.im'
}
message_input = self.channel.chat_message_input
if not message_input.is_element_displayed():
self.home.communities_tab.double_click()
self.home.get_chat(self.community_name, community=True).click()
self.community.get_chat(self.channel_name).click()
message_input.send_keys(message_text['text_message'])
self.channel.send_message_button.click()
self.channel.copy_message_text(message_text['text_message'])
message_input.paste_text_from_clipboard()
if message_input.text != message_text['text_message']:
self.errors.append('Message %s text was not copied in a public chat' % message_text['text_message'])
message_input.clear()
for message in formatted_message:
message_input.send_keys(formatted_message[message])
self.channel.send_message_button.click()
self.channel.copy_message_text(formatted_message[message])
message_input.paste_text_from_clipboard()
if message_input.text != formatted_message[message]:
self.errors.append('Message %s text was not copied in community channel' % formatted_message[message])
message_input.clear()
self.errors.verify_no_errors()
@pytest.mark.xdist_group(name="one_2")
@marks.new_ui_critical
class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
def prepare_devices(self):
self.drivers, self.loop = create_shared_drivers(2)
self.device_1, self.device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
self.loop.run_until_complete(run_in_parallel(((self.device_1.create_user,), (self.device_2.create_user,))))
self.home_1, self.home_2 = self.device_1.get_home_view(), self.device_2.get_home_view()
self.public_key_1, self.default_username_1 = self.home_1.get_public_key_and_username(return_username=True)
self.public_key_2, self.default_username_2 = self.home_2.get_public_key_and_username(return_username=True)
self.profile_1 = self.home_1.get_profile_view()
self.profile_1.add_contact_via_contacts_list(self.public_key_2)
self.profile_1.communities_tab.click()
self.home_2.chats_tab.click()
self.home_2.handle_contact_request(self.default_username_1)
self.community_leave = 'community_leave'
self.text_message = 'hello'
self.home_1.communities_tab.click()
self.home_1.create_community(name=self.community_leave, description='community to be left', require_approval=False)
self.home_1.back_button.double_click()
self.community_name = self.home_1.get_random_chat_name()
self.channel_name = self.home_1.get_random_chat_name()
self.home_1.create_community(name=self.community_name, description='community to test', require_approval=False)
self.community_1 = CommunityView(self.drivers[0])
self.community_1.send_invite_to_community(self.default_username_2)
self.channel_1 = self.community_1.add_channel(self.channel_name)
self.channel_1.send_message(self.text_message)
self.chat_2 = self.home_2.get_chat(self.default_username_1).click()
self.chat_2.element_by_text_part('View').click()
self.community_2 = CommunityView(self.drivers[1])
self.community_2.join_button.click()
self.channel_2 = self.community_2.get_chat(self.channel_name).click()
@marks.testrail_id(702838)
def test_community_message_send_check_timestamps_sender_username(self):
message = self.text_message
sent_time_variants = self.channel_1.convert_device_time_to_chat_timestamp()
timestamp = self.channel_1.chat_element_by_text(message).timestamp
if sent_time_variants and timestamp:
if timestamp not in sent_time_variants:
self.errors.append("Timestamp is not shown, expected: '%s', in fact: '%s'" %
(sent_time_variants.join(','), timestamp))
for channel in self.channel_1, self.channel_2:
channel.verify_message_is_under_today_text(message, self.errors)
if self.channel_2.chat_element_by_text(message).username.text != self.default_username_1:
self.errors.append("Default username '%s' is not shown next to the received message" % self.username_1)
self.errors.verify_no_errors()
@marks.testrail_id(702843)
def test_community_message_edit(self):
if not self.channel_2.chat_message_input.is_element_displayed():
self.home_2.communities_tab.click()
self.community_2.get_chat(self.channel_name).click()
message_before_edit, message_after_edit = self.text_message, "Message AFTER edit 2"
self.channel_1.edit_message_in_chat(message_before_edit, message_after_edit)
for channel in (self.channel_1, self.channel_2):
if not channel.element_by_text_part(message_after_edit).is_element_displayed(60):
self.errors.append('Message is not edited')
self.errors.verify_no_errors()
@marks.testrail_id(702839)
def test_community_message_delete(self):
message_to_delete_everyone = 'delete for everyone'
message_to_delete_for_me = 'delete for me'
self.channel_2.send_message(message_to_delete_everyone)
self.home_2.just_fyi('Delete for message everyone. Checking that message is deleted for all members')
self.channel_2.delete_message_in_chat(message_to_delete_everyone)
for channel in (self.channel_1, self.channel_2):
if not channel.chat_element_by_text(message_to_delete_everyone).is_element_disappeared(30):
self.errors.append("Deleted message is shown in channel")
if not channel.element_by_translation_id('message-deleted-for-everyone').is_element_displayed(30):
self.errors.append("System message about deletion for everyone is not displayed")
self.home_2.just_fyi('Deleting message for me. Checking that message is deleted only for the author of the message')
self.channel_2.send_message(message_to_delete_for_me)
self.channel_2.delete_message_in_chat(message_to_delete_for_me, everyone=False)
if not self.channel_2.chat_element_by_text(message_to_delete_for_me).is_element_disappeared(30):
self.errors.append("Deleted for me message is shown in channel for the author of message")
if not channel.element_by_translation_id('message-deleted-for-you').is_element_displayed(30):
self.errors.append("System message about deletion for you is not displayed")
if not self.channel_1.chat_element_by_text(message_to_delete_for_me).is_element_displayed(30):
self.errors.append("Deleted for me message is deleted all channel members")
self.errors.verify_no_errors()
@marks.testrail_id(702840)
def test_community_emoji_send_copy_paste_reply(self):
emoji_name = random.choice(list(emoji.EMOJI_UNICODE))
emoji_unicode = emoji.EMOJI_UNICODE[emoji_name]
emoji_message = emoji.emojize(emoji_name)
self.channel_1.send_message(emoji_message)
for channel in self.channel_1, self.channel_2:
if not channel.chat_element_by_text(emoji_unicode).is_element_displayed(30):
self.errors.append('Message with emoji was not sent or received in community channel')
self.channel_1.just_fyi("Can copy and paste emojis")
self.channel_1.copy_message_text(emoji_unicode)
self.channel_1.chat_message_input.paste_text_from_clipboard()
if self.channel_1.chat_message_input.text != emoji_unicode:
self.errors.append('Emoji message was not copied')
self.channel_1.just_fyi("Can reply to emojis")
self.channel_2.quote_message(emoji_unicode)
message_text = 'test message'
self.channel_2.chat_message_input.send_keys(message_text)
self.channel_2.send_message_button.click()
chat_element_1 = self.channel_1.chat_element_by_text(message_text)
if not chat_element_1.is_element_displayed(sec=10) or chat_element_1.replied_message_text != emoji_unicode:
self.errors.append('Reply message was not received by the sender')
self.errors.verify_no_errors()
@marks.testrail_id(702841)
def test_community_unread_messages_badge(self):
self.channel_1.send_message('пиу')
self.channel_1.click_system_back_button_until_element_is_shown()
message = 'test message'
self.channel_2.send_message(message)
self.home_1.just_fyi('Check new messages badge is shown for community')
community_element_1 = self.home_1.get_chat(self.community_name, community=True)
if not community_element_1.new_messages_community.is_element_displayed():
self.errors.append('New message community badge is not shown')
community_1 = community_element_1.click()
channel_1_element = community_1.get_chat(self.channel_name)
self.home_1.just_fyi('Check new messages badge is shown for community')
if not channel_1_element.new_messages_public_chat.is_element_displayed():
self.errors.append('New messages channel badge is not shown on channel')
channel_1_element.click()
self.errors.verify_no_errors()
@marks.testrail_id(702844)
def test_community_links_with_previews_github_youtube_twitter_gif_send_enable(self):
giphy_url = 'https://giphy.com/gifs/this-is-fine-QMHoU66sBXqqLqYvGO'
preview_urls = {'github_pr': {'url': 'https://github.com/status-im/status-mobile/pull/11707',
'txt': 'Update translations by jinhojang6 · Pull Request #11707 · status-im/status-mobile',
'subtitle': 'GitHub'},
'yotube': {
'url': 'https://www.youtube.com/watch?v=XN-SVmuJH2g&list=PLbrz7IuP1hrgNtYe9g6YHwHO6F3OqNMao',
'txt': 'Status & Keycard Hardware-Enforced Security',
'subtitle': 'YouTube'}
# twitter link is temporary removed from check as current xpath locator in message.preview_title is not applicable for this type of links
# 'twitter': {
# 'url': 'https://twitter.com/ethdotorg/status/1445161651771162627?s=20',
# 'txt': "We've rethought how we translate content, allowing us to translate",
# 'subtitle': 'Twitter'
# }
}
self.home_1.just_fyi("Check enabling and sending first gif")
self.channel_2.send_message(giphy_url)
self.channel_2.element_by_translation_id("dont-ask").click()
# workaround to get chat view focused
self.channel_1.send_message(giphy_url)
self.channel_1.element_by_text("Enable").wait_and_click()
self.channel_1.element_by_translation_id("enable-all").wait_and_click()
self.channel_1.click_system_back_button()
if not self.channel_1.get_preview_message_by_text(giphy_url).preview_image:
self.errors.append("No preview is shown for %s" % giphy_url)
for key in preview_urls:
self.home_2.just_fyi("Checking %s preview case" % key)
data = preview_urls[key]
self.channel_2.send_message(data['url'])
message = self.channel_1.get_preview_message_by_text(data['url'])
if data['txt'] not in message.preview_title.text:
self.errors.append("Title '%s' does not match expected" % message.preview_title.text)
if message.preview_subtitle.text != data['subtitle']:
self.errors.append("Subtitle '%s' does not match expected" % message.preview_subtitle.text)
self.home_2.just_fyi("Check if after do not ask again previews are not shown and no enable button appear")
if self.channel_2.element_by_translation_id("enable").is_element_displayed():
self.errors.append("Enable button is still shown after clicking on 'Don't ask again'")
if self.channel_2.get_preview_message_by_text(giphy_url).preview_image:
self.errors.append("Preview is shown for sender without permission")
self.errors.verify_no_errors()
@marks.testrail_id(702842)
def test_community_mark_all_messages_as_read(self):
self.channel_1.back_button.click()
self.channel_2.send_message(self.text_message)
chan_1_element = self.community_1.get_chat(self.channel_name)
if not chan_1_element.new_messages_public_chat.is_element_displayed():
self.errors.append('New messages counter is not shown in public chat')
chan_1_element.long_press_element()
self.community_1.mark_all_messages_as_read_button.click()
if chan_1_element.new_messages_public_chat.is_element_displayed():
self.errors.append('Unread messages badge is shown in community channel while there are no unread messages')
self.community_1.click_system_back_button_until_element_is_shown()
community_1_element = self.home_1.get_chat(self.community_name, community=True)
if community_1_element.new_messages_community.is_element_displayed():
self.errors.append('New messages community badge is shown on community after marking messages as read')
self.errors.verify_no_errors()
@marks.testrail_id(702845)
def test_community_leave(self):
if not self.home_1.communities_tab.is_element_displayed():
self.channel_1.click_system_back_button_until_element_is_shown()
comm_to_leave_element = self.home_1.get_chat(self.community_leave, community=True)
comm_to_leave_element.click()
community_to_leave = CommunityView(self.drivers[0])
community_to_leave.community_options_button.click()
community_to_leave.community_info_button.click()
community_to_leave.leave_community_button.click()
community_to_leave.click_system_back_button_until_element_is_shown()
if comm_to_leave_element.is_element_displayed():
self.errors.append('Community is still shown in the list after leave')
self.errors.verify_no_errors()

View File

@ -171,7 +171,7 @@ class ChatElementByText(Text):
def username(self): def username(self):
class Username(Text): class Username(Text):
def __init__(self, driver, parent_locator: str): def __init__(self, driver, parent_locator: str):
super().__init__(driver, prefix=parent_locator, xpath="/*[2]/android.widget.TextView") super().__init__(driver, prefix=parent_locator, xpath="/android.widget.TextView[1]")
return Username(self.driver, self.locator) return Username(self.driver, self.locator)
@ -209,7 +209,7 @@ class ChatElementByText(Text):
class RepliedMessageText(Text): class RepliedMessageText(Text):
def __init__(self, driver, parent_locator: str): def __init__(self, driver, parent_locator: str):
super().__init__(driver, prefix=parent_locator, super().__init__(driver, prefix=parent_locator,
xpath="/preceding-sibling::*[1]/android.widget.TextView[2]") xpath="/preceding::android.widget.TextView[@content-desc='quoted-message']")
try: try:
return RepliedMessageText(self.driver, self.message_locator).text return RepliedMessageText(self.driver, self.message_locator).text
@ -334,6 +334,7 @@ class CommunityView(HomeView):
self.channel_descripton = ChatView(self.driver).community_description_edit_box self.channel_descripton = ChatView(self.driver).community_description_edit_box
self.community_options_button = Button(self.driver, accessibility_id="community-menu-button") self.community_options_button = Button(self.driver, accessibility_id="community-menu-button")
self.community_info_button = Button(self.driver, translation_id="community-info") self.community_info_button = Button(self.driver, translation_id="community-info")
self.invite_button = Button(self.driver, accessibility_id="invite-button")
# Community info page # Community info page
self.community_membership_request_value = Text(self.driver, translation_id="members-label", self.community_membership_request_value = Text(self.driver, translation_id="members-label",
@ -346,6 +347,7 @@ class CommunityView(HomeView):
# Members # Members
self.invite_people_button = Button(self.driver, accessibility_id="community-invite-people") self.invite_people_button = Button(self.driver, accessibility_id="community-invite-people")
self.membership_requests_button = Button(self.driver, translation_id="membership-requests") self.membership_requests_button = Button(self.driver, translation_id="membership-requests")
self.share_invite_button = Button(self.driver, accessibility_id="share-community-link")
# Requesting access to community / joining community # Requesting access to community / joining community
self.request_access_button = Button(self.driver, translation_id="request-access") self.request_access_button = Button(self.driver, translation_id="request-access")
@ -390,6 +392,16 @@ class CommunityView(HomeView):
Button(self.driver, xpath="//*[starts-with(@text,'%s')]%s" % (username, decline_suffix)).click() Button(self.driver, xpath="//*[starts-with(@text,'%s')]%s" % (username, decline_suffix)).click()
self.close_button.click() self.close_button.click()
def send_invite_to_community(self, user_names_to_invite):
self.driver.info("Send %s invite to community" % ', '.join(map(str, user_names_to_invite)))
self.community_options_button.click()
self.community_info_button.click()
self.invite_button.click()
user_contact = self.element_by_text_part(user_names_to_invite)
user_contact.scroll_to_element()
user_contact.click()
self.share_invite_button.click_until_presence_of_element(self.invite_button)
self.back_button.click_until_presence_of_element(self.plus_button)
class PreviewMessage(ChatElementByText): class PreviewMessage(ChatElementByText):
def __init__(self, driver, text: str): def __init__(self, driver, text: str):
@ -415,7 +427,7 @@ class PreviewMessage(ChatElementByText):
def preview_title(self): def preview_title(self):
class PreviewTitle(SilentButton): class PreviewTitle(SilentButton):
def __init__(self, driver, parent_locator: str): def __init__(self, driver, parent_locator: str):
super().__init__(driver, prefix=parent_locator, xpath="/android.widget.TextView[1]") super().__init__(driver, prefix=parent_locator, xpath="//android.widget.ImageView[@content-desc='member-photo']/following-sibling::android.widget.TextView[1]")
return PreviewMessage.return_element_or_empty(PreviewTitle(self.driver, self.locator)) return PreviewMessage.return_element_or_empty(PreviewTitle(self.driver, self.locator))
@ -870,7 +882,7 @@ class ChatView(BaseView):
def edit_message_in_chat(self, message_to_edit, message_to_update): def edit_message_in_chat(self, message_to_edit, message_to_update):
self.driver.info("Looking for message '%s' to edit it" % message_to_edit) self.driver.info("Looking for message '%s' to edit it" % message_to_edit)
self.element_by_text_part(message_to_edit).long_press_element() self.element_by_text_part(message_to_edit).long_press_element()
self.element_by_translation_id("edit").click() self.element_by_translation_id("edit-message").click()
self.chat_message_input.clear() self.chat_message_input.clear()
self.chat_message_input.send_keys(message_to_update) self.chat_message_input.send_keys(message_to_update)
self.send_message_button.click() self.send_message_button.click()
@ -885,7 +897,7 @@ class ChatView(BaseView):
def copy_message_text(self, message_text): def copy_message_text(self, message_text):
self.driver.info("Copying '%s' message via long press" % message_text) self.driver.info("Copying '%s' message via long press" % message_text)
self.element_by_text_part(message_text).long_press_element() self.element_by_text_part(message_text).long_press_element()
self.element_by_translation_id("copy-to-clipboard").click() self.element_by_translation_id("copy-text").click()
def quote_message(self, message=str): def quote_message(self, message=str):
self.driver.info("Quoting '%s' message" % message) self.driver.info("Quoting '%s' message" % message)

View File

@ -84,6 +84,14 @@ class ChatElement(SilentButton):
return UnreadMessagesPublicChat(self.driver) return UnreadMessagesPublicChat(self.driver)
@property
def new_messages_community(self):
class UnreadMessagesCommunity(BaseElement):
def __init__(self, driver, parent_locator: str):
super().__init__(driver, prefix=parent_locator, xpath="%s/android.view.ViewGroup" % parent_locator)
return UnreadMessagesCommunity(self.driver, self.locator)
@property @property
def chat_image(self): def chat_image(self):
class ChatImage(BaseElement): class ChatImage(BaseElement):