From 712e67a62e164ef3ff11189799ec7817a86befe6 Mon Sep 17 00:00:00 2001 From: Yevheniia Berdnyk Date: Fri, 7 Jun 2024 21:21:29 +0300 Subject: [PATCH] e2e: updates for community tests --- .../activity_center/test_activity_center.py | 2 +- .../tests/critical/chats/test_group_chat.py | 97 ++++++++++------ .../chats/test_public_chat_browsing.py | 108 +++++++++++------- test/appium/views/base_element.py | 3 + test/appium/views/chat_view.py | 6 +- .../status_community_join_button.png | Bin 0 -> 6802 bytes .../status_community_logo.png | Bin 0 -> 11060 bytes test/appium/views/home_view.py | 7 ++ test/appium/views/profile_view.py | 4 +- test/appium/views/sign_in_view.py | 34 ++++-- 10 files changed, 173 insertions(+), 88 deletions(-) create mode 100644 test/appium/views/elements_templates/status_community_join_button.png create mode 100644 test/appium/views/elements_templates/status_community_logo.png diff --git a/test/appium/tests/activity_center/test_activity_center.py b/test/appium/tests/activity_center/test_activity_center.py index 499edce461..681755ee09 100644 --- a/test/appium/tests/activity_center/test_activity_center.py +++ b/test/appium/tests/activity_center/test_activity_center.py @@ -170,7 +170,7 @@ class TestActivityCenterContactRequestMultipleDevicePR(MultipleSharedDeviceTestC self.home_2.just_fyi("Device 2 sign in, user name is " + self.username_2) self.home_2.reopen_app(sign_in=False) self.device_2.show_profiles_button.wait_and_click() - self.device_2.get_user(username=self.username_2).click() + self.device_2.get_user_profile_by_name(username=self.username_2).click() self.device_2.sign_in() self.loop.run_until_complete(run_in_parallel(((_device_1_creates_user, {}), diff --git a/test/appium/tests/critical/chats/test_group_chat.py b/test/appium/tests/critical/chats/test_group_chat.py index 319a09986c..840c08a5c4 100644 --- a/test/appium/tests/critical/chats/test_group_chat.py +++ b/test/appium/tests/critical/chats/test_group_chat.py @@ -115,12 +115,18 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase): self.chats[2].add_remove_same_reaction(message=message, emoji="thumbs-up") self.chats[2].set_reaction(message=message, emoji="laugh") - for i in range(3): - self.chats[i].just_fyi("Checking reactions count for each group member and admin") - message_element = self.chats[i].chat_element_by_text(message) - message_element.emojis_below_message(emoji="thumbs-up").wait_for_element_text(2) - message_element.emojis_below_message(emoji="love").wait_for_element_text(1) - message_element.emojis_below_message(emoji="laugh").wait_for_element_text(1) + def _check_reactions_count(chat_view_index): + self.chats[chat_view_index].just_fyi("Checking reactions count for each group member and admin") + chat_element = self.chats[chat_view_index].chat_element_by_text(message) + chat_element.emojis_below_message(emoji="thumbs-up").wait_for_element_text(2) + chat_element.emojis_below_message(emoji="love").wait_for_element_text(1) + chat_element.emojis_below_message(emoji="laugh").wait_for_element_text(1) + + self.loop.run_until_complete(run_in_parallel(( + (_check_reactions_count, {'chat_view_index': 0}), + (_check_reactions_count, {'chat_view_index': 1}), + (_check_reactions_count, {'chat_view_index': 2}) + ))) self.chats[0].just_fyi("Admin checks info about voted users") self.chats[0].chat_element_by_text(message).emojis_below_message( @@ -163,15 +169,23 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase): self.chats[2].add_remove_same_reaction(message=message, emoji="laugh") self.chats[2].add_remove_same_reaction(message=message, emoji="sad") - for i in range(3): - self.chats[i].just_fyi("Checking reactions count for each group member and admin after they were changed") - message_element = self.chats[i].chat_element_by_text(message) + def _check_reactions_count_after_change(chat_view_index): + self.chats[chat_view_index].just_fyi( + "Checking reactions count for each group member and admin after they were changed") + chat_element = self.chats[chat_view_index].chat_element_by_text(message) try: - message_element.emojis_below_message(emoji="thumbs-up").wait_for_element_text(1) - message_element.emojis_below_message(emoji="love").wait_for_element_text(1) - message_element.emojis_below_message(emoji="sad").wait_for_element_text(2) + chat_element.emojis_below_message(emoji="thumbs-up").wait_for_element_text(1) + chat_element.emojis_below_message(emoji="love").wait_for_element_text(1) + chat_element.emojis_below_message(emoji="sad").wait_for_element_text(2) except (Failed, NoSuchElementException): - self.errors.append("Incorrect reactions count for %s after changing the reactions" % self.usernames[i]) + self.errors.append( + "Incorrect reactions count for %s after changing the reactions" % self.usernames[chat_view_index]) + + self.loop.run_until_complete(run_in_parallel(( + (_check_reactions_count_after_change, {'chat_view_index': 0}), + (_check_reactions_count_after_change, {'chat_view_index': 1}), + (_check_reactions_count_after_change, {'chat_view_index': 2}) + ))) self.chats[0].just_fyi("Admin relogins") self.chats[0].reopen_app() @@ -286,11 +300,16 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase): @marks.testrail_id(702808) def test_group_chat_offline_pn(self): - for i in range(1, 3): - self.homes[i].navigate_back_to_home_view() - self.homes[i].chats_tab.click() - self.homes[i].groups_tab.click() - self.homes[i].get_chat(self.chat_name).click() + def _proceed_to_chat(index): + self.homes[index].navigate_back_to_home_view() + self.homes[index].chats_tab.click() + self.homes[index].groups_tab.click() + self.homes[index].get_chat(self.chat_name).click() + + self.loop.run_until_complete(run_in_parallel(( + (_proceed_to_chat, {'index': 1}), + (_proceed_to_chat, {'index': 2}) + ))) message_1, message_2 = 'message from old member', 'message from new member' @@ -318,11 +337,18 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase): self.homes[0].chats_tab.click() self.homes[0].get_chat(self.chat_name).click() - self.homes[0].just_fyi("check that messages are shown for every member") - for i in range(3): - for message in (message_1, message_2): - if not self.chats[i].chat_element_by_text(message).is_element_displayed(30): - self.errors.append('%s if not shown for device %s' % (message, str(i))) + def _check_messages(index): + self.chats[index].just_fyi("Check that messages are shown for user %s" % self.usernames[index]) + for message_text in (message_1, message_2): + if not self.chats[index].chat_element_by_text(message_text).is_element_displayed(30): + self.errors.append('%s if not shown for device %s' % (message_text, index)) + + self.loop.run_until_complete(run_in_parallel(( + (_check_messages, {'index': 0}), + (_check_messages, {'index': 1}), + (_check_messages, {'index': 2}) + ))) + self.errors.verify_no_errors() @marks.testrail_id(702732) @@ -381,28 +407,33 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase): self.chats[1].chat_element_by_text(self.message_4).pinned_by_label.is_element_displayed(30)): self.errors.append("Message 4 is not pinned in group chat after unpinning previous one") - self.chats[0].just_fyi("Check pinned messages count and content") - for chat_number, group_chat in enumerate([self.chats[0], self.chats[1]]): - count = group_chat.pinned_messages_count.text + def _check_pinned_messages(index): + self.chats[index].just_fyi("Check pinned messages count and content for user %s" % self.usernames[index]) + count = self.chats[index].pinned_messages_count.text if count != '3': self.errors.append( - "Pinned messages count %s doesn't match expected 3 for user %s" % (count, chat_number + 1)) - group_chat.pinned_messages_count.click() - for message in self.message_1, self.message_3, self.message_4: - pinned_by = group_chat.pinned_messages_list.get_message_pinned_by_text(message) + "Pinned messages count %s doesn't match expected 3 for user %s" % (count, self.usernames[index])) + self.chats[index].pinned_messages_count.click() + for message_text in self.message_1, self.message_3, self.message_4: + pinned_by = self.chats[index].pinned_messages_list.get_message_pinned_by_text(message_text) if pinned_by.is_element_displayed(): text = pinned_by.text.strip() - expected_text = "You" if chat_number == 0 else self.usernames[0] + expected_text = "You" if index == 0 else self.usernames[0] if text != expected_text: self.errors.append( "Pinned by '%s' doesn't match expected '%s' for user %s" % ( - text, expected_text, chat_number + 1) + text, expected_text, self.usernames[index]) ) else: self.errors.append( - "Message '%s' is missed on Pinned messages list for user %s" % (message, chat_number + 1) + "Message '%s' is missed on Pinned messages list for user %s" % (message, self.usernames[index]) ) + self.loop.run_until_complete(run_in_parallel(( + (_check_pinned_messages, {'index': 0}), + (_check_pinned_messages, {'index': 1}) + ))) + self.errors.verify_no_errors() @marks.testrail_id(703495) diff --git a/test/appium/tests/critical/chats/test_public_chat_browsing.py b/test/appium/tests/critical/chats/test_public_chat_browsing.py index 4ec7ae8b7c..52adbb0084 100644 --- a/test/appium/tests/critical/chats/test_public_chat_browsing.py +++ b/test/appium/tests/critical/chats/test_public_chat_browsing.py @@ -33,43 +33,6 @@ class TestCommunityOneDeviceMerged(MultipleSharedDeviceTestCase): self.community_view = self.home.get_community_view() self.channel = self.community_view.get_channel(self.channel_name).click() - @marks.testrail_id(703503) - @marks.xfail(reason="Curated communities not loading, https://github.com/status-im/status-mobile/issues/17852", - run=False) - def test_community_discovery(self): - self.home.navigate_back_to_home_view() - self.home.communities_tab.click() - self.home.discover_communities_button.click() - self.home.community_card_item.wait_for_visibility_of_element(30) - - if len(self.home.community_card_item.find_elements()) > 1: - contributors_test_community_attributes = "Test Community", 'Open for anyone', 'Web3', 'Software dev' - for text in contributors_test_community_attributes: - if not self.home.element_by_text(text).is_element_displayed(10): - self.errors.append("'%s' text is not in Discovery!" % text) - self.home.element_by_text(contributors_test_community_attributes[0]).click() - element_templates = { - self.community_view.join_button: 'discovery_join_button.png', - self.community_view.get_channel_avatar(): 'discovery_general_channel.png', - } - for element, template in element_templates.items(): - if element.is_element_differs_from_template(template): - element.save_new_screenshot_of_element('%s_different.png' % template.split('.')[0]) - self.errors.append( - "Element %s is different from expected template %s!" % (element.locator, template)) - self.community_view.navigate_back_to_home_view() - self.home.communities_tab.click() - self.home.discover_communities_button.click() - self.home.community_card_item.wait_for_visibility_of_element(30) - self.home.swipe_up() - - status_ccs_community_attributes = '(old) Status CCs', 'Community for Status CCs', 'Ethereum', \ - 'Software dev', 'Web3' - for text in status_ccs_community_attributes: - if not self.community_view.element_by_text(text).is_element_displayed(10): - self.errors.append("'%s' text is not shown for (old) Status CCs!" % text) - self.errors.verify_no_errors() - @marks.testrail_id(702846) def test_community_navigate_to_channel_when_relaunch(self): text_message = 'some_text' @@ -261,7 +224,7 @@ class TestCommunityOneDeviceMerged(MultipleSharedDeviceTestCase): self.home.just_fyi("Check that can remove user from logged out state") self.home.reopen_app(sign_in=False) self.sign_in.show_profiles_button.wait_and_click() - user_card = self.sign_in.get_user(username=self.username) + user_card = self.sign_in.get_user_profile_by_name(username=self.username) user_card.open_user_options() self.sign_in.remove_profile_button.click() if not self.sign_in.element_by_translation_id("remove-profile-confirm-message").is_element_displayed(30): @@ -276,6 +239,67 @@ class TestCommunityOneDeviceMerged(MultipleSharedDeviceTestCase): self.errors.verify_no_errors() + @marks.testrail_id(703503) + def test_community_discovery(self): + try: + # workaround for case if a user is logged out in the previous test + self.sign_in.get_user_profile_by_index(index=1).click() + self.sign_in.sign_in() + except NoSuchElementException: + pass + self.home.navigate_back_to_home_view() + self.home.just_fyi("Turn off testnet in the profile settings") + profile = self.home.profile_button.click() + profile.advanced_button.scroll_and_click() + profile.testnet_mode_toggle.click() + profile.ok_button.click() + self.sign_in.sign_in() + + self.home.just_fyi("Check Discover Communities content") + self.home.communities_tab.click() + self.home.discover_communities_button.click() + self.home.community_card_item.wait_for_elements(seconds=120) + + expected_communities = { + ' 0xUX': ['Design', 'Ethereum', 'Collaboration'], + 'Status': ['Web3', 'Blockchain', 'Ethereum'], + 'Status Inu': ['News', 'Social', 'Web3'], + } + for community_name, tags in expected_communities.items(): + self.home.just_fyi("Check %s community tags in the Discover communities screen" % community_name) + card = self.home.get_discover_community_card_by_name(community_name=community_name) + try: + card.wait_for_visibility_of_element(30) + if community_name == 'Status': + card.swipe_to_web_element() + missing_tags = list() + for text in tags: + try: + card.get_child_element_by_text(text=text).wait_for_element() + except TimeoutException: + missing_tags.append(text) + if missing_tags: + self.errors.append("Community '%s' is missing tag(s) %s." % (community_name, ','.join(tags))) + + if community_name == 'Status': + self.home.just_fyi("Check Status community screen") + card.click() + if self.community_view.join_button.is_element_differs_from_template( + 'status_community_join_button.png'): + self.errors.append("Status community Join button is different from expected template.") + if self.community_view.community_logo.is_element_differs_from_template('status_community_logo.png'): + self.errors.append("Status community logo is different from expected template.") + + self.community_view.close_community_view_button.click() + self.home.discover_communities_button.click() + self.home.swipe_up() + + except TimeoutException: + self.errors.append("Community '%s' is not in the Discover Communities list." % community_name) + + self.errors.verify_no_errors() + # Note: this test should always be the LAST ONE in the group because it turns on mainnet in the app! + @pytest.mark.xdist_group(name="new_three_2") @marks.new_ui_critical @@ -998,6 +1022,8 @@ class TestCommunityMultipleDeviceMergedTwo(MultipleSharedDeviceTestCase): self.errors.verify_no_errors() @marks.testrail_id(702948) + @marks.xfail(reason="Can't enter channel after community is fetched for the first time, " \ + "https://github.com/status-im/status-mobile/issues/20395") def test_community_hashtag_links_to_community_channels(self): for home in self.homes: home.navigate_back_to_home_view() @@ -1098,6 +1124,8 @@ class TestCommunityMultipleDeviceMergedTwo(MultipleSharedDeviceTestCase): self.errors.verify_no_errors() @marks.testrail_id(703629) + @marks.xfail(reason="Can't enter channel after community is fetched for the first time, " \ + "https://github.com/status-im/status-mobile/issues/20395") def test_community_join_when_node_owner_offline(self): for home in self.homes: home.navigate_back_to_home_view() @@ -1143,8 +1171,8 @@ class TestCommunityMultipleDeviceMergedTwo(MultipleSharedDeviceTestCase): general_channel.click() if not self.channel_2.chat_element_by_text(control_message_general_chat).is_element_displayed(30): self.errors.append( - "Message in community channel is not visible for user before join, it was indicated as" \ - "%s sent for the sender before he went offline" % "" if message_sent else "not") + "Message in community channel is not visible for user before join, it was indicated as " \ + "%s sent for the sender before he went offline" % ("" if message_sent else "not")) else: self.errors.append("Community channel is not displayed for user before join") self.community_2.toast_content_element.wait_for_invisibility_of_element(30) diff --git a/test/appium/views/base_element.py b/test/appium/views/base_element.py index 126fa8ae8c..f4e976ca51 100644 --- a/test/appium/views/base_element.py +++ b/test/appium/views/base_element.py @@ -367,6 +367,9 @@ class BaseElement(object): def exclude_emoji(value): return 'emoji' if value in emoji.UNICODE_EMOJI else value + def get_child_element_by_text(self, text: str): + return BaseElement(self.driver, prefix=self.locator, xpath="//*[@text='%s']" % text) + class EditBox(BaseElement): diff --git a/test/appium/views/chat_view.py b/test/appium/views/chat_view.py index a79d3130f9..5676fbd71f 100644 --- a/test/appium/views/chat_view.py +++ b/test/appium/views/chat_view.py @@ -406,10 +406,10 @@ class CommunityView(HomeView): #### NEW UI # Communities initial page - self.close_community_view_button = Button( - self.driver, - xpath="//*[@content-desc='community-options-for-community']/../*[1]//android.widget.ImageView") + self.close_community_view_button = Button(self.driver, accessibility_id="back-button") self.community_title = Text(self.driver, accessibility_id="community-title") + self.community_logo = BaseElement( + self.driver, xpath="//*[@content-desc='community-title']/preceding-sibling::*/android.widget.ImageView") self.community_description_text = Text(self.driver, accessibility_id="community-description-text") self.community_status_joined = Text(self.driver, accessibility_id="status-tag-positive") self.community_status_pending = Text(self.driver, accessibility_id="status-tag-pending") diff --git a/test/appium/views/elements_templates/status_community_join_button.png b/test/appium/views/elements_templates/status_community_join_button.png new file mode 100644 index 0000000000000000000000000000000000000000..9622b5e98d5ce13f89c9bbd1c0337e7834ce3732 GIT binary patch literal 6802 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 QoHYS-Gz~N=)u2)T2bT0Q<^TWy literal 0 HcmV?d00001 diff --git a/test/appium/views/elements_templates/status_community_logo.png b/test/appium/views/elements_templates/status_community_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3f61a0ff8c75cb3ed82f213ce35a778e017886e1 GIT binary patch literal 11060 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