From 02ad676fdc995ead99501a3ef4dce55c44ccd9a1 Mon Sep 17 00:00:00 2001 From: Vladimir Druzhinin <128374224+StateOf-Vlado@users.noreply.github.com> Date: Mon, 4 Sep 2023 20:36:48 +0200 Subject: [PATCH] Test/93 community channel (#12057) * Test(Community) Create, edit community #90 * Test(Community) Create, Edit and Delete Channel #93 * Test(Fix) System dialog for local build fixed on Mac #95 * Test(Fix) Typo #93 --- test/e2e/configs/__init__.py | 2 +- test/e2e/configs/squish.py | 1 + test/e2e/constants/user.py | 13 +- test/e2e/driver/atomacos.py | 7 +- test/e2e/driver/aut.py | 2 +- .../channel_icon_in_chat.png | Bin 0 -> 7766 bytes .../channel_icon_in_list.png | Bin 0 -> 1224 bytes .../channel_icon_in_toolbar.png | Bin 0 -> 2018 bytes .../channel_icon_in_chat.png | Bin 0 -> 7766 bytes .../channel_icon_in_list.png | Bin 0 -> 1224 bytes .../channel_icon_in_toolbar.png | Bin 0 -> 2018 bytes .../general_channel_icon_in_chat.png | Bin 0 -> 5917 bytes .../general_channel_icon_in_list.png | Bin 0 -> 1071 bytes .../general_channel_icon_in_toolbar.png | Bin 0 -> 1761 bytes .../community/community_channel_popups.py | 44 +++++ test/e2e/gui/components/delete_popup.py | 16 ++ test/e2e/gui/components/emoji_popup.py | 25 +++ test/e2e/gui/objects_map/community_names.py | 16 ++ test/e2e/gui/objects_map/component_names.py | 36 +++- test/e2e/gui/screens/community.py | 141 ++++++++++++++- test/e2e/gui/screens/settings.py | 8 +- test/e2e/scripts/utils/local_system.py | 11 ++ test/e2e/tests/fixtures/aut.py | 9 + test/e2e/tests/test_communities.py | 167 ++++++++++-------- 24 files changed, 406 insertions(+), 92 deletions(-) create mode 100644 test/e2e/configs/squish.py create mode 100644 test/e2e/ext/vp/test_communities/test_create_community_channel/channel_icon_in_chat.png create mode 100644 test/e2e/ext/vp/test_communities/test_create_community_channel/channel_icon_in_list.png create mode 100644 test/e2e/ext/vp/test_communities/test_create_community_channel/channel_icon_in_toolbar.png create mode 100644 test/e2e/ext/vp/test_communities/test_edit_community_channel/channel_icon_in_chat.png create mode 100644 test/e2e/ext/vp/test_communities/test_edit_community_channel/channel_icon_in_list.png create mode 100644 test/e2e/ext/vp/test_communities/test_edit_community_channel/channel_icon_in_toolbar.png create mode 100644 test/e2e/ext/vp/test_communities/test_edit_community_channel/general_channel_icon_in_chat.png create mode 100644 test/e2e/ext/vp/test_communities/test_edit_community_channel/general_channel_icon_in_list.png create mode 100644 test/e2e/ext/vp/test_communities/test_edit_community_channel/general_channel_icon_in_toolbar.png create mode 100644 test/e2e/gui/components/community/community_channel_popups.py create mode 100644 test/e2e/gui/components/delete_popup.py create mode 100644 test/e2e/gui/components/emoji_popup.py diff --git a/test/e2e/configs/__init__.py b/test/e2e/configs/__init__.py index df885a5046..8f4c3bcd06 100644 --- a/test/e2e/configs/__init__.py +++ b/test/e2e/configs/__init__.py @@ -1,7 +1,7 @@ import logging from scripts.utils.system_path import SystemPath -from . import testpath, timeouts, testrail, system +from . import testpath, timeouts, testrail, squish, system _logger = logging.getLogger(__name__) diff --git a/test/e2e/configs/squish.py b/test/e2e/configs/squish.py new file mode 100644 index 0000000000..13a84b0dce --- /dev/null +++ b/test/e2e/configs/squish.py @@ -0,0 +1 @@ +AUT_PORT = 61500 \ No newline at end of file diff --git a/test/e2e/constants/user.py b/test/e2e/constants/user.py index b130c60887..c2e0452291 100644 --- a/test/e2e/constants/user.py +++ b/test/e2e/constants/user.py @@ -1,5 +1,7 @@ from collections import namedtuple +import configs + UserAccount = namedtuple('User', ['name', 'password', 'seed_phrase']) user_account_default = UserAccount('squisher', '*P@ssw0rd*', [ 'rail', 'witness', 'era', 'asthma', 'empty', 'cheap', 'shed', 'pond', 'skate', 'amount', 'invite', 'year' @@ -8,5 +10,14 @@ user_account_one = UserAccount('tester123', 'TesTEr16843/!@00', []) user_account_two = UserAccount('Athletic', 'TesTEr16843/!@00', []) user_account_three = UserAccount('Nervous', 'TesTEr16843/!@00', []) +default_community_params = { + 'name': 'Name', + 'description': 'Description', + 'logo': {'fp': configs.testpath.TEST_FILES / 'tv_signal.png', 'zoom': None, 'shift': None}, + 'banner': {'fp': configs.testpath.TEST_FILES / 'banner.png', 'zoom': None, 'shift': None}, + 'intro': 'Intro', + 'outro': 'Outro' +} -UserCommunity = namedtuple('Community', ['name', 'description', 'members', 'image']) +UserCommunityInfo = namedtuple('CommunityInfo', ['name', 'description', 'members', 'image']) +UserChannel = namedtuple('Channel', ['name', 'image', 'selected']) diff --git a/test/e2e/driver/atomacos.py b/test/e2e/driver/atomacos.py index 92c5820b4e..c80657e782 100644 --- a/test/e2e/driver/atomacos.py +++ b/test/e2e/driver/atomacos.py @@ -2,6 +2,7 @@ import time from copy import deepcopy import configs.timeouts +from scripts.utils import local_system if configs.system.IS_MAC: from atomacos._a11y import _running_apps_with_bundle_id @@ -26,7 +27,11 @@ def attach_atomac(timeout_sec: int = configs.timeouts.UI_LOAD_TIMEOUT_SEC): ) return atomacos.NativeUIElement.from_pid(apps[-1].processIdentifier()) - atomator = from_bundle_id(BUNDLE_ID) + if configs.DEV_BUILD: + pid = local_system.find_process_by_port(configs.squish.AUT_PORT) + atomator = atomacos.getAppRefByPid(pid) + else: + atomator = from_bundle_id(BUNDLE_ID) started_at = time.monotonic() while not hasattr(atomator, 'AXMainWindow'): time.sleep(1) diff --git a/test/e2e/driver/aut.py b/test/e2e/driver/aut.py index 1967c53e30..a7f65e1b2e 100644 --- a/test/e2e/driver/aut.py +++ b/test/e2e/driver/aut.py @@ -14,7 +14,7 @@ class AUT: self, app_path: system_path.SystemPath = configs.APP_DIR, host: str = '127.0.0.1', - port: int = 61500 + port: int = configs.squish.AUT_PORT ): super(AUT, self).__init__() self.path = app_path diff --git a/test/e2e/ext/vp/test_communities/test_create_community_channel/channel_icon_in_chat.png b/test/e2e/ext/vp/test_communities/test_create_community_channel/channel_icon_in_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea7809bbf3fc9319a5a13f82d8adf714a5468a2 GIT binary patch literal 7766 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 R1w_3V@IX}?QK4*&`ZrA#x7+{# literal 0 HcmV?d00001 diff --git a/test/e2e/ext/vp/test_communities/test_create_community_channel/channel_icon_in_list.png b/test/e2e/ext/vp/test_communities/test_create_community_channel/channel_icon_in_list.png new file mode 100644 index 0000000000000000000000000000000000000000..040e41d7903c9d9057ad654db922c50a6a8f7f54 GIT binary patch literal 1224 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 literal 0 HcmV?d00001 diff --git a/test/e2e/ext/vp/test_communities/test_edit_community_channel/channel_icon_in_chat.png b/test/e2e/ext/vp/test_communities/test_edit_community_channel/channel_icon_in_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea7809bbf3fc9319a5a13f82d8adf714a5468a2 GIT binary patch literal 7766 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 R1w_3V@IX}?QK4*&`ZrA#x7+{# literal 0 HcmV?d00001 diff --git a/test/e2e/ext/vp/test_communities/test_edit_community_channel/channel_icon_in_list.png b/test/e2e/ext/vp/test_communities/test_edit_community_channel/channel_icon_in_list.png new file mode 100644 index 0000000000000000000000000000000000000000..040e41d7903c9d9057ad654db922c50a6a8f7f54 GIT binary patch literal 1224 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 literal 0 HcmV?d00001 diff --git a/test/e2e/ext/vp/test_communities/test_edit_community_channel/general_channel_icon_in_chat.png b/test/e2e/ext/vp/test_communities/test_edit_community_channel/general_channel_icon_in_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..97aecf827fb1f053afec675c121eb39ac55adf44 GIT binary patch literal 5917 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 literal 0 HcmV?d00001 diff --git a/test/e2e/ext/vp/test_communities/test_edit_community_channel/general_channel_icon_in_list.png b/test/e2e/ext/vp/test_communities/test_edit_community_channel/general_channel_icon_in_list.png new file mode 100644 index 0000000000000000000000000000000000000000..07bc28702b6e9d738f109c6455f7c9b96854d382 GIT binary patch literal 1071 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFLAYVE*Rm;uvBf*n7~^=SsT7frs~h zpRJ$4n6`#zlgC8UD@#QlPkQj-sD$1OiC%VowHXy3HQ4!Iom{NGS5xk-uduJp3<>@v zyoSdXiTW<}xa+Vj$T5#sWRkY%?LSsguZ)EMBEoJ^1L6hWl z87Fn}pFDEq%7w!x56=7fGVzM|r0|DM-w*R&aurpKIH{EtMP=8Ao2W-51M&vzG>8iGNSR%HDpN|($$#(8JzT#1h=jn#YgY9;SG|1jZJTl9o()#l z0-nk@eUMN3aQS3W3N z**#BMw)19TCJfTUPnE&sAPIMY4b4z1y|1;wk?Z zmffyX4cQSV8|k<5-?Z4-9PA$HA7l?I%=?fyEB@Yw363r2k4%V~QC;wNiHv<|Wpp;X z*Ru=uRCGq0jl*`krytB(K=j+7Zj5^=f zd*=MbzwDhnZXc$uD$-h{qgr9ud0tC6;Z^SXIll{4b}jUhjm)~Sxp!CT9?6H-4UZ@^ zHE3}uEznqf#NdCO%enh8Up{?08Fb{ZSy1GG0|NX1vO49e@*370@ABzVch>pQF=48w z{;8j{x#Qv(ck+CEzq0dF){NtiS8Q0?wpKbo(f-6IA^X4Qj`O&kIJIQ@lRH-*W_WJ3 z+BD~rGjnh18NbVao0dG14A9c*xW3`b#QE$IK`r&2iT@6-n6vN8jxA-|Kc6h}S~H{e zzF^Zq!+HLb%0xsqte)2^=;roPl2!3E%Z#euE`9TN?OD5(S#|oMX;HII2}XEre8cfv zkZ;nA=Lfx)O_oTUYH;DM=5PM3x4&sGJoNR|iKR}Zmb^<{oH;D!zqFj!Z#?%1M`V(R z?it%1bwN>4QL}EHyY|-ZjnSHiBIlLuJJLP$C&wHM@0oDAg6HeKcdvITe5@#5vcjlt zi?NV)xn1^(O-_yuEv87ZkCu%7sT=-y`DF9D?!~p`J_;IylHew%@EyLr>}Kz61v^7m zILpSXuo#8Ka9<6xtL;BR4JvQsxCz=5Z0tQc4KbLh*2~7ZbPX+M+ literal 0 HcmV?d00001 diff --git a/test/e2e/ext/vp/test_communities/test_edit_community_channel/general_channel_icon_in_toolbar.png b/test/e2e/ext/vp/test_communities/test_edit_community_channel/general_channel_icon_in_toolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..5994cfee140154596360bf757c7d989c015fa9e8 GIT binary patch literal 1761 zcmV<71|Io|P)_+A?jaAW)(7y2$i^WeKgj$W>!}5Tnr;4JJn81I9!jG*M&LL=Djg zec-`_#KgpnL?19QVxkWQDAH_T!&13)D-~L*J1tb&!t^q?bH1%qqy;fX`}>J=jvLT0 zDIbZ(E31-~Rmp{Qt!49Sib~4kB^4mqiIMF1$fd#Ffis7OQk_Go&O$z8OjL~F2E;kX z^;Esj$4lo{HLk5~-g0xz>R53?462~0GD!pk5j2pUNT2UL($ldg)!m*M8@4uz2-gwk z95ZR~h^cB^yK?ik`Ab(>OYo@j8$>V`?-@LM^w{2=sqS_(h_TEh&N-$DJ|CY`dE4e^ z8e1NW#^T1BqD@&3aG@!~KAc7da z?`%8#+4l5MpRrM{5a%411)opcRK4zzcNWyF@CE)P8{u5<@vlFAK7FCj*eI8Ya}Lnp zW2F^qA9}00X}vEnD{O?mlLy*&zmy#t5n};y&Z#QUa_`H@JGOeyEV7o)gS!rY{w5%k zoO8aATYT%rO^@xcMR5(xA~E<}cHf83{?N7GMv9~qPk{ZVAk0P17|w+ zey}Y!k(TAl8f#Z=+3@JwAgWwX6$Mp95J9*~73EhL;TIx+wte(M&(S@yV#Uf0TX!sV z8-0OmsG<-nqO6!AOD0Qtf?U7|Q;K6m4a!W)cowhx!bUiIVt?DN=Vble58w6Vd$E!- z4NRwsiO_Hh4f83EV1y7D9p}^!^bVr}!s=V8Ne~nfrikEk96ZTj79&g%Lv}p<)%#D$ z15doxdjG2^)2Sks+ZtFl50p%fyr-y$ScFjE*mrdOh*;JnsV^g!XQIFq5qyq+pW;Fe zBU~jM`t)^q`i(DYo9_vp>AbRd5r416D!nOA^po`zm+;qmZb^_C<*Vb21X`0clymMJ z?LBxwxJ>Z@Wd>vE>G)D!+}TxGwM+xksi8GVT^Yl}?E5bhih&TQm`nXlNT8>m3wc_T zG?dfd&%SQFApArGYq*9OhEm_ktN$D*EnlF@FI0&Zv)NG@<=Y;Pq%ejlswh7(f(mPr z)R!?l!l^-2m?V(Na4wB9g9xJ|1G0VhgpI_RMwR#+?rLI=;aE2(1`%PwJpM8t4NMZ~ z8=&_RtxeP=2w)9UjA5Xk{ofG;VFq8w$oAb6HWFtVRbr*w*+f}{lc)J+fJwF0tXYf( zj3H_`eu|DkZgAC{x66afGh(1Q2HMg^c{;gZ?=c3st#Fks{VLQB^{!p97}} zhFFA{B~r}a8Y#0J?V@vp+nZ=8XJCM~(*$9P@GC?ZyLe7s+}TxGwM+xkd1ZM$%?t54 z{?pCrVS<98ZV79aK#l_^7|79@q@kSte)e_a1>rKm8iX0dFqHaMo_^zt+U9$LXF3hU zN?Es@d2#YNQbVM3B<8TFoS3EWfBdT#Z)izUUq*VAzF`6gAgJf;c}5EeR~buB$CvWJ z6R)-2|0>Egf>K`2>Kf*k60r!VQYg^>BS(4}DA6!r2r1+jc!C%a=9Q zuG+HU(YHZVnROz7wte(M&(S^7luQ;CCpJC4b5UKhFEHzDgn=_1dq3Egn@Edu&KGiv zZ{4`*u^qN3u7O!32A|9B`|#Nxy7t>hkvQj66==El<>Vb(y=N9#OXtB|hd+N4kV(!t zK!cB!R;+#Kt?H)rzQC-o5&BLZXy5%(c5Fn91;jbWWx?kYH&w5DX!RnS(4nK0agA05ybF)XWQY=wx@^sjE!=IIOmuq z_55g8jE`m%I_suOFoZb|H*cH2 zbd|LPk1D@G1Y_}@!Lvt??cJH`ZbyR{%S_^&<9e#z=i{Yws~XqVHgCDPW_7GMAqG`Y zRGB0Kf(RPOPNdKG9_i`Wlj?5Ij15~GMTF~!bB-I(Fex92#w)9ml~u`wb**LdYhoo8 zvEmBQ%=k!d{Nkk_dk4-O8cKBzr8*1wj4@F$h8y@l=LF^s?=%QL00000NkvXXu0mjf DRVGk! literal 0 HcmV?d00001 diff --git a/test/e2e/gui/components/community/community_channel_popups.py b/test/e2e/gui/components/community/community_channel_popups.py new file mode 100644 index 0000000000..729dff5e50 --- /dev/null +++ b/test/e2e/gui/components/community/community_channel_popups.py @@ -0,0 +1,44 @@ +import configs +from gui.components.base_popup import BasePopup +from gui.components.emoji_popup import EmojiPopup +from gui.elements.qt.button import Button +from gui.elements.qt.text_edit import TextEdit + + +class ChannelPopup(BasePopup): + + def __init__(self): + super(ChannelPopup, self).__init__() + self._name_text_edit = TextEdit('createOrEditCommunityChannelNameInput_TextEdit') + self._description_text_edit = TextEdit('createOrEditCommunityChannelDescriptionInput_TextEdit') + self._save_create_button = Button('createOrEditCommunityChannelBtn_StatusButton') + self._emoji_button = Button('createOrEditCommunityChannel_EmojiButton') + + def wait_until_appears(self, timeout_msec: int = configs.timeouts.UI_LOAD_TIMEOUT_MSEC): + self._name_text_edit.wait_until_appears(timeout_msec) + return self + + +class NewChannelPopup(ChannelPopup): + + def create(self, name: str, description: str, emoji: str = None): + self._name_text_edit.text = name + self._description_text_edit.text = description + if emoji is not None: + self._emoji_button.click() + EmojiPopup().wait_until_appears().select(emoji) + self._save_create_button.click() + self.wait_until_hidden() + + +class EditChannelPopup(ChannelPopup): + + def edit(self, name: str, description: str = None, emoji: str = None): + self._name_text_edit.text = name + if description is not None: + self._description_text_edit.text = description + if emoji is not None: + self._emoji_button.click() + EmojiPopup().wait_until_appears().select(emoji) + self._save_create_button.click() + self.wait_until_hidden() diff --git a/test/e2e/gui/components/delete_popup.py b/test/e2e/gui/components/delete_popup.py new file mode 100644 index 0000000000..cb7040efca --- /dev/null +++ b/test/e2e/gui/components/delete_popup.py @@ -0,0 +1,16 @@ +import allure + +from gui.components.base_popup import BasePopup +from gui.elements.qt.button import Button + + +class DeletePopup(BasePopup): + + def __init__(self): + super().__init__() + self._delete_button = Button('delete_StatusButton') + + @allure.step("Delete entity") + def delete(self): + self._delete_button.click() + self.wait_until_hidden() diff --git a/test/e2e/gui/components/emoji_popup.py b/test/e2e/gui/components/emoji_popup.py new file mode 100644 index 0000000000..f34462d6f1 --- /dev/null +++ b/test/e2e/gui/components/emoji_popup.py @@ -0,0 +1,25 @@ +import allure + +import configs +from .base_popup import BasePopup +from ..elements.qt.object import QObject +from ..elements.qt.text_edit import TextEdit + + +class EmojiPopup(BasePopup): + def __init__(self): + super(EmojiPopup, self).__init__() + self._search_text_edit = TextEdit('mainWallet_AddEditAccountPopup_AccountEmojiSearchBox') + self._emoji_item = QObject('mainWallet_AddEditAccountPopup_AccountEmoji') + + @allure.step('Wait until appears {0}') + def wait_until_appears(self, timeout_msec: int = configs.timeouts.UI_LOAD_TIMEOUT_MSEC): + self._search_text_edit.wait_until_appears(timeout_msec) + return self + + @allure.step('Select emoji') + def select(self, name: str): + self._search_text_edit.text = name + self._emoji_item.real_name['objectName'] = 'statusEmoji_' + name + self._emoji_item.click() + self._search_text_edit.wait_until_hidden() diff --git a/test/e2e/gui/objects_map/community_names.py b/test/e2e/gui/objects_map/community_names.py index 533dce1079..2a99259570 100644 --- a/test/e2e/gui/objects_map/community_names.py +++ b/test/e2e/gui/objects_map/community_names.py @@ -16,11 +16,27 @@ mainWindow_startChatButton_StatusIconTabButton = {"checkable": True, "container" mainWindow_createChatOrCommunity_Loader = {"container": mainWindow_communityColumnView_CommunityColumnView, "id": "createChatOrCommunity", "type": "Loader", "unnamed": 1, "visible": True} mainWindow_scrollView_StatusScrollView = {"container": mainWindow_communityColumnView_CommunityColumnView, "id": "scrollView", "type": "StatusScrollView", "unnamed": 1, "visible": True} scrollView_Flickable = {"container": mainWindow_scrollView_StatusScrollView, "type": "Flickable", "unnamed": 1, "visible": True} +scrollView_chatListItems_StatusListView = {"container": scrollView_Flickable, "objectName": "chatListItems", "type": "StatusListView", "visible": True} +channel_listItem = {"container": scrollView_chatListItems_StatusListView, "id": "chatListDelegate", "type": "DropArea", "isCategory": False, "visible": True} +channel_identicon_StatusSmartIdenticon = {"container": None, "id": "identicon", "type": "StatusSmartIdenticon", "unnamed": 1, "visible": True} +channel_name_StatusBaseText = {"container": None, "type": "StatusBaseText", "unnamed": 1, "visible": True} +mainWindow_createChannelOrCategoryBtn_StatusBaseText = {"container": mainWindow_communityColumnView_CommunityColumnView, "objectName": "createChannelOrCategoryBtn", "type": "StatusBaseText", "visible": True} +create_channel_StatusMenuItem = {"container": statusDesktop_mainWindow_overlay, "enabled": True, "objectName": "createCommunityChannelBtn", "type": "StatusMenuItem", "visible": True} + # Tool Bar mainWindow_statusToolBar_StatusToolBar = {"container": mainWindow_communityLoader_Loader, "objectName": "statusToolBar", "type": "StatusToolBar", "visible": True} statusToolBar_chatToolbarMoreOptionsButton = {"container": mainWindow_statusToolBar_StatusToolBar, "objectName": "chatToolbarMoreOptionsButton", "type": "StatusFlatRoundButton", "visible": True} delete_Channel_StatusMenuItem = {"checkable": False, "container": statusDesktop_mainWindow_overlay, "enabled": True, "objectName": "deleteOrLeaveMenuItem", "type": "StatusMenuItem", "visible": True} +edit_Channel_StatusMenuItem = {"checkable": False, "container": statusDesktop_mainWindow_overlay, "enabled": True, "objectName": "editChannelMenuItem", "type": "StatusMenuItem", "visible": True} +statusToolBar_statusSmartIdenticonLetter_StatusLetterIdenticon = {"container": mainWindow_statusToolBar_StatusToolBar, "objectName": "statusSmartIdenticonLetter", "type": "StatusLetterIdenticon", "visible": True} +statusToolBar_statusChatInfoButtonNameText_TruncatedTextWithTooltip = {"container": mainWindow_statusToolBar_StatusToolBar, "objectName": "statusChatInfoButtonNameText", "type": "TruncatedTextWithTooltip", "visible": True} +statusToolBar_TruncatedTextWithTooltip = {"container": mainWindow_statusToolBar_StatusToolBar, "type": "TruncatedTextWithTooltip", "unnamed": 1, "visible": True} +# Chat +mainWindow_ChatColumnView = {"container": mainWindow_communityLoader_Loader, "type": "ChatColumnView", "unnamed": 1, "visible": True} +chatMessageViewDelegate_channelIdentifierNameText_StyledText = {"container": mainWindow_ChatColumnView, "objectName": "channelIdentifierNameText", "type": "StyledText", "visible": True} +chatMessageViewDelegate_Welcome = {"container": mainWindow_ChatColumnView, "type": "StatusBaseText", "unnamed": 1, "visible": True} +chatMessageViewDelegate_channelIdentifierSmartIdenticon_StatusSmartIdenticon = {"container": mainWindow_ChatColumnView, "objectName": "channelIdentifierSmartIdenticon", "type": "StatusSmartIdenticon", "visible": True} # Community Settings mainWindow_communitySettingsBackToCommunityButton_StatusBaseText = {"container": mainWindow_communityLoader_Loader, "objectName": "communitySettingsBackToCommunityButton", "type": "StatusBaseText", "visible": True} diff --git a/test/e2e/gui/objects_map/component_names.py b/test/e2e/gui/objects_map/component_names.py index f1e4d5892f..8684ab413e 100644 --- a/test/e2e/gui/objects_map/component_names.py +++ b/test/e2e/gui/objects_map/component_names.py @@ -1,15 +1,15 @@ from objectmaphelper import * -from . main_names import statusDesktop_mainWindow_overlay -from . main_names import statusDesktop_mainWindow +from .main_names import statusDesktop_mainWindow_overlay # Scroll o_Flickable = {"container": statusDesktop_mainWindow_overlay, "type": "Flickable", "unnamed": 1, "visible": True} # Context Menu -o_StatusListView = {"container": statusDesktop_mainWindow_overlay, "type": "StatusListView", "unnamed": 1, - "visible": True} +o_StatusListView = {"container": statusDesktop_mainWindow_overlay, "type": "StatusListView", "unnamed": 1, "visible": True} + +""" Onboarding """ # Before you get started Popup acknowledge_checkbox = {"checkable": True, "container": statusDesktop_mainWindow_overlay, "objectName": "acknowledgeCheckBox", "type": "StatusCheckBox", "visible": True} termsOfUseCheckBox_StatusCheckBox = {"checkable": True, "container": statusDesktop_mainWindow_overlay, "objectName":"termsOfUseCheckBox", "type": "StatusCheckBox", "visible": True} @@ -65,11 +65,8 @@ agreeToUse_StatusCheckBox = {"checkable": True, "container": statusDesktop_mainW readyToUse_StatusCheckBox = {"checkable": True, "container": statusDesktop_mainWindow_overlay, "id": "readyToUse", "type": "StatusCheckBox", "unnamed": 1, "visible": True} i_m_ready_to_use_Status_Desktop_Beta_StatusButton = {"checkable": False, "container": statusDesktop_mainWindow_overlay, "type": "StatusButton", "unnamed": 1, "visible": True} -# Picture Edit Popup -o_StatusSlider = {"container": statusDesktop_mainWindow_overlay, "type": "StatusSlider", "unnamed": 1, "visible": True} -cropSpaceItem_Item = {"container": statusDesktop_mainWindow_overlay, "id": "cropSpaceItem", "type": "Item", "unnamed": 1, "visible": True} -make_picture_StatusButton = {"checkable": False, "container": statusDesktop_mainWindow_overlay, "objectName": "imageCropperAcceptButton", "type": "StatusButton", "visible": True} -o_DropShadow = {"container": statusDesktop_mainWindow_overlay, "type": "DropShadow", "unnamed": 1, "visible": True} + +""" Communities """ # Create Community Banner create_new_StatusButton = {"checkable": False, "container": statusDesktop_mainWindow_overlay, "objectName": "communityBannerButton", "type": "StatusButton", "visible": True} @@ -93,6 +90,14 @@ createCommunityIntroMessageInput_TextEdit = {"container": statusDesktop_mainWind createCommunityOutroMessageInput_TextEdit = {"container": statusDesktop_mainWindow_overlay, "objectName": "createCommunityOutroMessageInput", "type": "TextEdit", "visible": True} createCommunityFinalBtn_StatusButton = {"container": statusDesktop_mainWindow_overlay, "objectName": "createCommunityFinalBtn", "type": "StatusButton", "visible": True} +# Community channel popup: +createOrEditCommunityChannelNameInput_TextEdit = {"container": statusDesktop_mainWindow_overlay, "objectName": "createOrEditCommunityChannelNameInput", "type": "TextEdit", "visible": True} +createOrEditCommunityChannelDescriptionInput_TextEdit = {"container": statusDesktop_mainWindow_overlay, "objectName": "createOrEditCommunityChannelDescriptionInput", "type": "TextEdit", "visible": True} +createOrEditCommunityChannelBtn_StatusButton = {"container": statusDesktop_mainWindow_overlay, "objectName": "createOrEditCommunityChannelBtn", "type": "StatusButton", "visible": True} +createOrEditCommunityChannel_EmojiButton = {"container": statusDesktop_mainWindow_overlay, "objectName": "StatusChannelPopup_emojiButton", "type": "StatusRoundButton", "visible": True} + +""" Common """ + # Select Color Popup communitySettings_ColorPanel_HexColor_Input = {"container": statusDesktop_mainWindow_overlay, "objectName": "communityColorPanelHexInput", "type": "TextEdit", "visible": True} communitySettings_SaveColor_Button = {"container": statusDesktop_mainWindow_overlay, "objectName": "communityColorPanelSelectColorButton", "type": "StatusButton", "visible": True} @@ -126,3 +131,16 @@ contextMenuItem = {"container": statusDesktop_mainWindow_overlay, "type": "Statu # Confirmation Popup confirmButton = {"container": statusDesktop_mainWindow_overlay, "objectName": RegularExpression("confirm*"), "type": "StatusButton"} +# Picture Edit Popup +o_StatusSlider = {"container": statusDesktop_mainWindow_overlay, "type": "StatusSlider", "unnamed": 1, "visible": True} +cropSpaceItem_Item = {"container": statusDesktop_mainWindow_overlay, "id": "cropSpaceItem", "type": "Item", "unnamed": 1, "visible": True} +make_picture_StatusButton = {"checkable": False, "container": statusDesktop_mainWindow_overlay, "objectName": "imageCropperAcceptButton", "type": "StatusButton", "visible": True} +o_DropShadow = {"container": statusDesktop_mainWindow_overlay, "type": "DropShadow", "unnamed": 1, "visible": True} + +# Emoji Popup +mainWallet_AddEditAccountPopup_AccountEmojiSearchBox = {"container": statusDesktop_mainWindow, "objectName": "StatusEmojiPopup_searchBox", "type": "TextEdit", "visible": True} +mainWallet_AddEditAccountPopup_AccountEmoji = {"container": statusDesktop_mainWindow, "type": "StatusEmoji", "visible": True} + +# Delete Popup +o_StatusDialogBackground = {"container": statusDesktop_mainWindow_overlay, "type": "StatusDialogBackground", "unnamed": 1, "visible": True} +delete_StatusButton = {"checkable": False, "container": statusDesktop_mainWindow_overlay, "objectName": "deleteChatConfirmationDialogDeleteButton", "type": "StatusButton", "visible": True} \ No newline at end of file diff --git a/test/e2e/gui/screens/community.py b/test/e2e/gui/screens/community.py index 40add82642..9ec2042317 100644 --- a/test/e2e/gui/screens/community.py +++ b/test/e2e/gui/screens/community.py @@ -1,10 +1,18 @@ -import allure +import typing +import allure +from allure_commons._allure import step + +import driver +from constants import UserChannel +from gui.components.community.community_channel_popups import EditChannelPopup, NewChannelPopup +from gui.components.delete_popup import DeletePopup 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.text_label import TextLabel from gui.screens.community_settings import CommunitySettingsScreen +from scripts.tools import image from scripts.tools.image import Image @@ -13,7 +21,40 @@ class CommunityScreen(QObject): def __init__(self): super().__init__('mainWindow_communityLoader_Loader') self.left_panel = LeftPanel() - self._tool_bar = ToolBar() + self.tool_bar = ToolBar() + self.chat = Chat() + + @allure.step('Create channel') + def create_channel(self, name: str, description: str, emoji: str = None): + self.left_panel.open_create_channel_popup().create(name, description, emoji) + + @allure.step('Create channel') + def edit_channel(self, channel, name: str, description: str, emoji: str = None): + self.left_panel.select_channel(channel) + self.tool_bar.open_edit_channel_popup().edit(name, description, emoji) + + @allure.step('Delete channel') + def delete_channel(self, name: str): + self.left_panel.select_channel(name) + self.tool_bar.open_delete_channel_popup().delete() + + @allure.step('Verify channel') + def verify_channel( + self, name: str, description: str, icon_in_list: str, icon_in_toolbar: str, icon_in_chat: str): + with step('Channel is correct in channels list'): + channel = self.left_panel.get_channel_parameters(name) + image.compare(channel.image, icon_in_list, timout_sec=5) + assert channel.name == name + assert channel.selected + + with step('Channel is correct in community toolbar'): + assert self.tool_bar.channel_name == name + assert self.tool_bar.channel_description == description + image.compare(self.tool_bar.channel_icon, icon_in_toolbar, timout_sec=5) + + with step('Verify channel in chat'): + assert self.chat.channel_name == name + image.compare(self.chat.channel_icon, icon_in_chat, timout_sec=5) class ToolBar(QObject): @@ -22,11 +63,38 @@ class ToolBar(QObject): super().__init__('mainWindow_statusToolBar_StatusToolBar') self._more_options_button = Button('statusToolBar_chatToolbarMoreOptionsButton') self._options_list = List('o_StatusListView') + self._edit_channel_context_item = QObject('edit_Channel_StatusMenuItem') + self._channel_icon = QObject('statusToolBar_statusSmartIdenticonLetter_StatusLetterIdenticon') + self._channel_name = TextLabel('statusToolBar_statusChatInfoButtonNameText_TruncatedTextWithTooltip') + self._channel_description = TextLabel('statusToolBar_TruncatedTextWithTooltip') + self._delete_channel_context_item = QObject('delete_Channel_StatusMenuItem') - @allure.step('Open edit community popup') - def open_edit_community_popup(self): + @property + @allure.step('Get channel icon') + def channel_icon(self) -> Image: + return self._channel_icon.image + + @property + @allure.step('Get channel name') + def channel_name(self) -> str: + return self._channel_name.text + + @property + @allure.step('Get channel description') + def channel_description(self) -> str: + return self._channel_description.text + + @allure.step('Open edit channel popup') + def open_edit_channel_popup(self): self._more_options_button.click() - self._options_list.select() + self._edit_channel_context_item.click() + return EditChannelPopup().wait_until_appears() + + @allure.step('Open delete channel popup') + def open_delete_channel_popup(self): + self._more_options_button.click() + self._delete_channel_context_item.click() + return DeletePopup().wait_until_appears() class LeftPanel(QObject): @@ -37,6 +105,10 @@ class LeftPanel(QObject): self._community_logo = QObject('mainWindow_identicon_StatusSmartIdenticon') self._name_text_label = TextLabel('mainWindow_statusChatInfoButtonNameText_TruncatedTextWithTooltip') self._members_text_label = TextLabel('mainWindow_Members_TruncatedTextWithTooltip') + self._channel_list_item = QObject('channel_listItem') + self._channel_icon_template = QObject('channel_identicon_StatusSmartIdenticon') + self._channel_or_category_button = Button('mainWindow_createChannelOrCategoryBtn_StatusBaseText') + self._create_channel_menu_item = Button('create_channel_StatusMenuItem') @property @allure.step('Get community logo') @@ -53,7 +125,66 @@ class LeftPanel(QObject): def members(self) -> str: return self._members_text_label.text + @property + @allure.step('Get channels') + def channels(self) -> typing.List[UserChannel]: + channels_list = [] + for obj in driver.findAllObjects(self._channel_list_item.real_name): + container = driver.objectMap.realName(obj) + self._channel_icon_template.real_name['container'] = container + channels_list.append(UserChannel( + str(obj.objectName), + self._channel_icon_template.image, + obj.item.selected + )) + return channels_list + + @allure.step('Get channel params') + def get_channel_parameters(self, name) -> UserChannel: + for channal in self.channels: + if channal.name == name: + return channal + raise LookupError(f'Channel not found in {self.channels}') + @allure.step('Open community settings') def open_community_settings(self): self._community_info_button.click() return CommunitySettingsScreen().wait_until_appears() + + @allure.step('Open create channel popup') + def open_create_channel_popup(self) -> NewChannelPopup: + self._channel_or_category_button.click() + self._create_channel_menu_item.click() + return NewChannelPopup().wait_until_appears() + + @allure.step('Select channel') + def select_channel(self, name: str): + for obj in driver.findAllObjects(self._channel_list_item.real_name): + if str(obj.objectName) == name: + driver.mouseClick(obj) + return + raise LookupError('Channel not found') + + +class Chat(QObject): + + def __init__(self): + super().__init__('mainWindow_ChatColumnView') + self._channel_icon = QObject('chatMessageViewDelegate_channelIdentifierSmartIdenticon_StatusSmartIdenticon') + self._channel_name_label = TextLabel('chatMessageViewDelegate_channelIdentifierNameText_StyledText') + self._channel_welcome_label = TextLabel('chatMessageViewDelegate_Welcome') + + @property + @allure.step('Get channel icon') + def channel_icon(self) -> Image: + return self._channel_icon.image + + @property + @allure.step('Get channel name') + def channel_name(self) -> str: + return self._channel_name_label.text + + @property + @allure.step('Get channel welcome note') + def channel_welcome_note(self) -> str: + return self._channel_welcome_label.text diff --git a/test/e2e/gui/screens/settings.py b/test/e2e/gui/screens/settings.py index 74b2b75edf..dccc789345 100644 --- a/test/e2e/gui/screens/settings.py +++ b/test/e2e/gui/screens/settings.py @@ -3,7 +3,7 @@ import typing import allure import driver -from constants import UserCommunity +from constants import UserCommunityInfo from driver import objects_access from gui.elements.qt.button import Button from gui.elements.qt.object import QObject @@ -40,7 +40,7 @@ class CommunitiesSettingsView(QObject): @property @allure.step('Get communities') - def communities(self) -> typing.List[UserCommunity]: + def communities(self) -> typing.List[UserCommunityInfo]: _communities = [] for obj in driver.findAllObjects(self._community_item.real_name): container = driver.objectMap.realName(obj) @@ -49,7 +49,7 @@ class CommunitiesSettingsView(QObject): self._community_template_description.real_name['container'] = container self._community_template_members.real_name['container'] = container - _communities.append(UserCommunity( + _communities.append(UserCommunityInfo( self._community_template_name.text, self._community_template_description.text, self._community_template_members.text, @@ -65,7 +65,7 @@ class CommunitiesSettingsView(QObject): raise LookupError(f'Community item: {name} not found') @allure.step('Open community info') - def get_community_info(self, name: str) -> UserCommunity: + def get_community_info(self, name: str) -> UserCommunityInfo: for community in self.communities: if community.name == name: return community diff --git a/test/e2e/scripts/utils/local_system.py b/test/e2e/scripts/utils/local_system.py index a066235a7b..cb9bd69326 100644 --- a/test/e2e/scripts/utils/local_system.py +++ b/test/e2e/scripts/utils/local_system.py @@ -5,6 +5,7 @@ import subprocess import time import allure +import psutil import configs from configs.system import IS_WIN @@ -12,6 +13,16 @@ from configs.system import IS_WIN _logger = logging.getLogger(__name__) +def find_process_by_port(port: int) -> int: + for proc in psutil.process_iter(): + try: + for conns in proc.connections(kind='inet'): + if conns.laddr.port == port: + return proc.pid + except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): + pass + + @allure.step('Kill process') def kill_process(pid): os.kill(pid, signal.SIGILL if IS_WIN else signal.SIGKILL) diff --git a/test/e2e/tests/fixtures/aut.py b/test/e2e/tests/fixtures/aut.py index 4531166a7e..4413dcb982 100644 --- a/test/e2e/tests/fixtures/aut.py +++ b/test/e2e/tests/fixtures/aut.py @@ -54,3 +54,12 @@ def main_screen(user_account: UserAccount, main_window: MainWindow) -> MainWindo yield main_window.log_in(user_account) else: yield main_window.sign_up(user_account) + + +@pytest.fixture +def community(main_screen, request) -> dict: + community_params = request.param + communities_portal = main_screen.left_panel.open_communities_portal() + create_community_form = communities_portal.open_create_community_popup() + create_community_form.create(community_params) + return community_params diff --git a/test/e2e/tests/test_communities.py b/test/e2e/tests/test_communities.py index fe73d204f0..836a3cf784 100644 --- a/test/e2e/tests/test_communities.py +++ b/test/e2e/tests/test_communities.py @@ -5,7 +5,9 @@ import pytest from allure_commons._allure import step import configs.testpath +import constants.user from gui.main_window import MainWindow +from gui.screens.community import CommunityScreen from scripts.tools import image pytestmark = allure.suite("Communities") @@ -13,30 +15,19 @@ pytestmark = allure.suite("Communities") @allure.testcase('https://ethstatus.testrail.net/index.php?/cases/view/703084', 'Create community') @pytest.mark.case(703084) -@pytest.mark.parametrize('community_params', [ - { - 'name': f'Name', - 'description': f'Description', - 'logo': {'fp': configs.testpath.TEST_FILES / 'tv_signal.png', 'zoom': None, 'shift': None}, - 'banner': {'fp': configs.testpath.TEST_FILES / 'banner.png', 'zoom': None, 'shift': None}, - 'color': '#ff7d46', - 'tags': ['Culture', 'Sports'], - 'intro': 'Intro', - 'outro': 'Outro' - } -]) -def test_create_community(user_account, main_screen: MainWindow, community_params): +@pytest.mark.parametrize('params', [constants.user.default_community_params]) +def test_create_community(user_account, main_screen: MainWindow, params): with step('Create community'): communities_portal = main_screen.left_panel.open_communities_portal() create_community_form = communities_portal.open_create_community_popup() - community_screen = create_community_form.create(community_params) + community_screen = create_community_form.create(params) with step('Verify community parameters in community overview'): with step('Icon is correct'): - community_icon = main_screen.left_panel.get_community_logo(community_params['name']) + community_icon = main_screen.left_panel.get_community_logo(params['name']) image.compare(community_icon, 'button_logo.png', timout_sec=5) with step('Name is correct'): - assert community_screen.left_panel.name == community_params['name'] + assert community_screen.left_panel.name == params['name'] with step('Members count is correct'): assert '1' in community_screen.left_panel.members with step('Logo is correct'): @@ -46,9 +37,9 @@ def test_create_community(user_account, main_screen: MainWindow, community_param community_setting = community_screen.left_panel.open_community_settings() overview_setting = community_setting.left_panel.open_overview() with step('Name is correct'): - assert overview_setting.name == community_params['name'] + assert overview_setting.name == params['name'] with step('Description is correct'): - assert overview_setting.description == community_params['description'] + assert overview_setting.description == params['description'] with step('Members count is correct'): members_settings = community_setting.left_panel.open_members() assert user_account.name in members_settings.members @@ -56,116 +47,152 @@ def test_create_community(user_account, main_screen: MainWindow, community_param with step('Verify community parameters in community settings screen'): settings_screen = main_screen.left_panel.open_settings() community_settings = settings_screen.open_communities_settings() - community = community_settings.get_community_info(community_params['name']) - assert community.name == community_params['name'] - assert community.description == community_params['description'] + community = community_settings.get_community_info(params['name']) + assert community.name == params['name'] + assert community.description == params['description'] assert '1' in community.members image.compare(community.image, 'logo_in_settings.png') @allure.testcase('https://ethstatus.testrail.net/index.php?/cases/view/703056', 'Edit community separately') @pytest.mark.case(703056) -@pytest.mark.parametrize('default_params, update_params', [( - { - 'name': 'Name', - 'description': 'Description', - 'logo': {'fp': configs.testpath.TEST_FILES / 'tv_signal.png', 'zoom': None, 'shift': None}, - 'banner': {'fp': configs.testpath.TEST_FILES / 'banner.png', 'zoom': None, 'shift': None}, - 'intro': 'Intro', - 'outro': 'Outro' - }, +@pytest.mark.parametrize('community', [constants.user.default_community_params], indirect=True) +@pytest.mark.parametrize('community_params', [ { 'name': f'Name_{datetime.now():%H%M%S}', 'description': f'Description_{datetime.now():%H%M%S}', 'color': '#ff7d46', }, -)]) -def test_edit_community_separately(main_screen: MainWindow, default_params, update_params): - with step('Create community'): - communities_portal = main_screen.left_panel.open_communities_portal() - create_community_form = communities_portal.open_create_community_popup() - community_screen = create_community_form.create(default_params) +]) +def test_edit_community_separately(main_screen, community: dict, community_params): with step('Edit community name'): + community_screen = main_screen.left_panel.select_community(community['name']) community_setting = community_screen.left_panel.open_community_settings() edit_community_form = community_setting.left_panel.open_overview().open_edit_community_view() - edit_community_form.edit({'name': update_params['name']}) + edit_community_form.edit({'name': community_params['name']}) with step('Name is correct'): overview_setting = community_setting.left_panel.open_overview() - assert overview_setting.name == update_params['name'] + assert overview_setting.name == community_params['name'] with step('Description is correct'): - assert overview_setting.description == default_params['description'] + assert overview_setting.description == constants.default_community_params['description'] with step('Edit community name'): edit_community_form = overview_setting.open_edit_community_view() - edit_community_form.edit({'description': update_params['description']}) + edit_community_form.edit({'description': community_params['description']}) with step('Name is correct'): overview_setting = community_setting.left_panel.open_overview() - assert overview_setting.name == update_params['name'] + assert overview_setting.name == community_params['name'] with step('Description is correct'): - assert overview_setting.description == update_params['description'] + assert overview_setting.description == community_params['description'] @allure.testcase('https://ethstatus.testrail.net/index.php?/cases/view/703057', 'Edit community') @pytest.mark.case(703057) -@pytest.mark.parametrize('default_params, community_params', [( - { - 'name': f'Name_{datetime.now():%H%M%S}', - 'description': f'Description_{datetime.now():%H%M%S}', - 'logo': {'fp': configs.testpath.TEST_FILES / 'tv_signal.png', 'zoom': None, 'shift': None}, - 'banner': {'fp': configs.testpath.TEST_FILES / 'banner.png', 'zoom': None, 'shift': None}, - 'color': '#ff7d46', - 'tags': ['Culture', 'Sports'], - 'intro': 'Intro', - 'outro': 'Outro' - }, +@pytest.mark.parametrize('community', [constants.user.default_community_params], indirect=True) +@pytest.mark.parametrize('params', [ { 'name': 'Updated Name', 'description': 'Updated Description', 'logo': {'fp': configs.testpath.TEST_FILES / 'banner.png', 'zoom': None, 'shift': None}, 'banner': {'fp': configs.testpath.TEST_FILES / 'tv_signal.png', 'zoom': None, 'shift': None}, - 'color': '#7140fd', + 'color': '#ff7d46', 'tags': ['Ethereum'], 'intro': 'Updated Intro', 'outro': 'Updated Outro' } -)]) -def test_edit_community(main_screen: MainWindow, default_params, community_params): - with step('Create community'): - communities_portal = main_screen.left_panel.open_communities_portal() - create_community_form = communities_portal.open_create_community_popup() - community_screen = create_community_form.create(default_params) +]) +def test_edit_community(main_screen: MainWindow, community: dict, params): with step('Edit community'): + community_screen = main_screen.left_panel.select_community(community['name']) community_setting = community_screen.left_panel.open_community_settings() edit_community_form = community_setting.left_panel.open_overview().open_edit_community_view() - edit_community_form.edit(community_params) + edit_community_form.edit(params) with step('Verify community parameters on settings overview'): overview_setting = community_setting.left_panel.open_overview() with step('Name is correct'): - assert overview_setting.name == community_params['name'] + assert overview_setting.name == params['name'] with step('Description is correct'): - assert overview_setting.description == community_params['description'] + assert overview_setting.description == params['description'] with step('Verify community parameters in community screen'): community_setting.left_panel.back_to_community() with step('Icon is correct'): - community_icon = main_screen.left_panel.get_community_logo(community_params['name']) + community_icon = main_screen.left_panel.get_community_logo(params['name']) image.compare(community_icon, 'button_updated_logo.png') with step('Name is correct'): - assert community_screen.left_panel.name == community_params['name'] + assert community_screen.left_panel.name == params['name'] with step('Logo is correct'): image.compare(community_screen.left_panel.logo, 'updated_logo.png') with step('Verify community parameters in community settings screen'): settings_screen = main_screen.left_panel.open_settings() community_settings = settings_screen.open_communities_settings() - community = community_settings.communities[0] - assert community.name == community_params['name'] - assert community.description == community_params['description'] - assert '1' in community.members - image.compare(community.image, 'logo_in_settings_updated.png') + community_info = community_settings.communities[0] + assert community_info.name == params['name'] + assert community_info.description == params['description'] + assert '1' in community_info.members + image.compare(community_info.image, 'logo_in_settings_updated.png') + + +@allure.testcase('https://ethstatus.testrail.net/index.php?/cases/view/703049', 'Create community channel') +@pytest.mark.case(703049) +@pytest.mark.parametrize('community', [constants.user.default_community_params], indirect=True) +@pytest.mark.parametrize('channel_name, channel_description, channel_emoji', [('Channel', 'Description', 'sunglasses')]) +def test_create_community_channel(main_screen: MainWindow, community: dict, channel_name, channel_description, + channel_emoji): + community_screen = main_screen.left_panel.select_community(community['name']) + community_screen.create_channel(channel_name, channel_description, channel_emoji) + + with step('Verify channel'): + community_screen.verify_channel( + channel_name, + channel_description, + 'channel_icon_in_list.png', + 'channel_icon_in_toolbar.png', + 'channel_icon_in_chat.png' + ) + + +@allure.testcase('https://ethstatus.testrail.net/index.php?/cases/view/703050', 'Edit community channel') +@pytest.mark.case(703050) +@pytest.mark.parametrize('community', [constants.user.default_community_params], indirect=True) +@pytest.mark.parametrize('channel_name, channel_description, channel_emoji', [('Channel', 'Description', 'sunglasses')]) +def test_edit_community_channel(community: dict, channel_name, channel_description, channel_emoji): + community_screen = CommunityScreen() + + with step('Verify General channel'): + community_screen.verify_channel( + 'general', + 'General channel for the community', + 'general_channel_icon_in_list.png', + 'general_channel_icon_in_toolbar.png', + 'general_channel_icon_in_chat.png' + ) + + community_screen.edit_channel('general', channel_name, channel_description, channel_emoji) + + with step('Verify General channel'): + community_screen.verify_channel( + channel_name, + channel_description, + 'channel_icon_in_list.png', + 'channel_icon_in_toolbar.png', + 'channel_icon_in_chat.png' + ) + + +@allure.testcase('https://ethstatus.testrail.net/index.php?/cases/view/703051', 'Delete community channel') +@pytest.mark.case(703051) +@pytest.mark.parametrize('community', [constants.user.default_community_params], indirect=True) +def test_delete_community_channel(community: dict): + with step('Delete channel'): + CommunityScreen().delete_channel('general') + + with step('Verify channel is not exists'): + assert not CommunityScreen().left_panel.channels