import time import typing import allure import configs.timeouts import driver from constants import UserCommunityInfo from driver import objects_access from driver.objects_access import walk_children from gui.components.settings.send_contact_request_popup import SendContactRequest from gui.elements.qt.button import Button from gui.elements.qt.list import List from gui.elements.qt.object import QObject from gui.elements.qt.scroll import Scroll from gui.elements.qt.text_label import TextLabel from gui.screens.community_settings import CommunitySettingsScreen from gui.screens.messages import MessagesScreen from scripts.tools.image import Image class LeftPanel(QObject): def __init__(self): super().__init__('mainWindow_LeftTabView') self._settings_section_template = QObject('scrollView_AppMenuItem_StatusNavigationListItem') def _open_settings(self, index: int): self._settings_section_template.real_name['objectName'] = f'{index}-AppMenuItem' self._settings_section_template.click() @allure.step('Open messaging settings') def open_messaging_settings(self) -> 'MessagingSettingsView': self._open_settings(3) return MessagingSettingsView() @allure.step('Open communities settings') def open_communities_settings(self) -> 'CommunitiesSettingsView': self._open_settings(12) return CommunitiesSettingsView() class SettingsScreen(QObject): def __init__(self): super().__init__('mainWindow_ProfileLayout') self.left_panel = LeftPanel() class MessagingSettingsView(QObject): def __init__(self): super().__init__('mainWindow_MessagingView') self._contacts_button = Button('contactsListItem_btn_StatusContactRequestsIndicatorListItem') @allure.step('Open contacts settings') def open_contacts_settings(self) -> 'ContactsSettingsView': self._contacts_button.click() return ContactsSettingsView().wait_until_appears() class PendingRequest: def __init__(self, obj): self.object = obj self.icon: typing.Optional[Image] = None self.contact: typing.Optional[Image] = None self._accept_button: typing.Optional[Button] = None self._reject_button: typing.Optional[Button] = None self._open_canvas_button: typing.Optional[Button] = None self.init_ui() def __repr__(self): return self.contact def init_ui(self): for child in walk_children(self.object): if str(getattr(child, 'id', '')) == 'iconOrImage': self.icon = Image(driver.objectMap.realName(child)) elif str(getattr(child, 'id', '')) == 'menuButton': self._open_canvas_button = Button(name='', real_name=driver.objectMap.realName(child)) elif str(getattr(child, 'objectName', '')) == 'checkmark-circle-icon': self._accept_button = Button(name='', real_name=driver.objectMap.realName(child)) elif str(getattr(child, 'objectName', '')) == 'close-circle-icon': self._reject_button = Button(name='', real_name=driver.objectMap.realName(child)) elif str(getattr(child, 'id', '')) == 'statusListItemTitle': self.contact = str(child.text) def accept(self) -> MessagesScreen: assert self._accept_button is not None, 'Button not found' self._accept_button.click() return MessagesScreen().wait_until_appears() class ContactsSettingsView(QObject): def __init__(self): super().__init__('mainWindow_ContactsView') self._contact_request_button = Button('mainWindow_Send_contact_request_to_chat_key_StatusButton') self._pending_request_tab = Button('contactsTabBar_Pending_Requests_StatusTabButton') self._pending_requests_list = List('settingsContentBaseScrollView_ContactListPanel') @property @allure.step('Get all pending requests') def pending_requests(self) -> typing.List[PendingRequest]: self._pending_request_tab.click() return [PendingRequest(item) for item in self._pending_requests_list.items] @allure.step('Open contacts request form') def open_contact_request_form(self) -> SendContactRequest: self._contact_request_button.click() return SendContactRequest().wait_until_appears() @allure.step('Accept contact request') def accept_contact_request( self, contact: str, timeout_sec: int = configs.timeouts.MESSAGING_TIMEOUT_SEC) -> MessagesScreen: self._pending_request_tab.click() started_at = time.monotonic() request = None while request is None: requests = self.pending_requests for _request in requests: if _request.contact == contact: request = _request assert time.monotonic() - started_at < timeout_sec, f'Contact: {contact} not found in {requests}' return request.accept() class CommunitiesSettingsView(QObject): def __init__(self): super().__init__('mainWindow_CommunitiesView') self._community_item = QObject('settingsContentBaseScrollView_listItem_StatusListItem') self._community_template_image = QObject('settings_iconOrImage_StatusSmartIdenticon') self._community_template_name = TextLabel('settings_Name_StatusTextWithLoadingState') self._community_template_description = TextLabel('settings_statusListItemSubTitle') self._community_template_members = TextLabel('settings_member_StatusTextWithLoadingState') self._community_template_button = Button('settings_StatusFlatButton') @property @allure.step('Get communities') def communities(self) -> typing.List[UserCommunityInfo]: _communities = [] for obj in driver.findAllObjects(self._community_item.real_name): container = driver.objectMap.realName(obj) self._community_template_image.real_name['container'] = container self._community_template_name.real_name['container'] = container self._community_template_description.real_name['container'] = container self._community_template_members.real_name['container'] = container _communities.append(UserCommunityInfo( self._community_template_name.text, self._community_template_description.text, self._community_template_members.text, self._community_template_image.image )) return _communities def _get_community_item(self, name: str): for obj in driver.findAllObjects(self._community_item.real_name): for item in objects_access.walk_children(obj): if getattr(item, 'text', '') == name: return obj raise LookupError(f'Community item: {name} not found') @allure.step('Open community info') def get_community_info(self, name: str) -> UserCommunityInfo: for community in self.communities: if community.name == name: return community raise LookupError(f'Community item: {name} not found') @allure.step('Open community overview settings') def open_community_overview_settings(self, name: str): driver.mouseClick(self._get_community_item(name)) return CommunitySettingsScreen().wait_until_appears() class KeycardSettingsView(QObject): def __init__(self): super(KeycardSettingsView, self).__init__('mainWindow_KeycardView') self._scroll = Scroll('settingsContentBaseScrollView_Flickable') self._setup_keycard_with_existing_account_button = Button('setupFromExistingKeycardAccount_StatusListItem') self._create_new_keycard_account_button = Button('createNewKeycardAccount_StatusListItem') self._import_restore_via_seed_phrase_button = Button('importRestoreKeycard_StatusListItem') self._import_from_keycard_button = Button('importFromKeycard_StatusListItem') self._check_whats_on_keycard_button = Button('checkWhatsNewKeycard_StatusListItem') self._factory_reset_keycard_button = Button('factoryResetKeycard_StatusListItem') @allure.step('Check that keycard screen displayed') def check_keycard_screen_loaded(self): assert KeycardSettingsView().is_visible @allure.step('Check that all keycard options displayed') def all_keycard_options_available(self): assert self._setup_keycard_with_existing_account_button.is_visible, f'Setup keycard with existing account not visible' assert self._create_new_keycard_account_button.is_visible, f'Create new keycard button not visible' assert self._import_restore_via_seed_phrase_button.is_visible, f'Import and restore via seed phrase button not visible' self._scroll.vertical_scroll_to(self._import_from_keycard_button) assert driver.waitFor(lambda: self._import_from_keycard_button.is_visible, configs.timeouts.UI_LOAD_TIMEOUT_MSEC), f'Import keycard button not visible' assert driver.waitFor(lambda: self._check_whats_on_keycard_button.is_visible, configs.timeouts.UI_LOAD_TIMEOUT_MSEC ), f'Check whats new keycard button not visible' assert driver.waitFor(lambda: self._factory_reset_keycard_button.is_visible, configs.timeouts.UI_LOAD_TIMEOUT_MSEC ), f'Factory reset keycard button not visible'