status-desktop/test/e2e/gui/screens/settings.py

207 lines
9.3 KiB
Python

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'