From e3c750bf4da9f39e7c01a7a12d65e1ccd44ee15c Mon Sep 17 00:00:00 2001 From: Valentina1133 <141633821+Valentina1133@users.noreply.github.com> Date: Wed, 11 Oct 2023 19:00:17 +0700 Subject: [PATCH] Tests Permissions (#152) * Test Adding permissions * Permissions overview test added --- test/e2e/constants/permissions.py | 8 ++ .../permission_welcome_image.png | Bin 0 -> 24906 bytes test/e2e/gui/objects_map/community_names.py | 29 +++- test/e2e/gui/screens/community_settings.py | 131 ++++++++++++++++++ .../e2e/tests/communities/test_permissions.py | 77 ++++++++++ 5 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 test/e2e/constants/permissions.py create mode 100644 test/e2e/ext/vp/communities/test_permissions/test_permissions_screen_overview/permission_welcome_image.png create mode 100644 test/e2e/tests/communities/test_permissions.py diff --git a/test/e2e/constants/permissions.py b/test/e2e/constants/permissions.py new file mode 100644 index 0000000000..3959c27376 --- /dev/null +++ b/test/e2e/constants/permissions.py @@ -0,0 +1,8 @@ +from enum import Enum + +class PermissionsElements(Enum): + WELCOME_TITLE = "Permissions" + WELCOME_SUBTITLE = 'You can manage your community by creating and issuing membership and access permissions' + WELCOME_CHECKLIST_ELEMENT_1 = 'Give individual members access to private channels' + WELCOME_CHECKLIST_ELEMENT_2 = 'Monetise your community with subscriptions and fees' + WELCOME_CHECKLIST_ELEMENT_3 = 'Require holding a token or NFT to obtain exclusive membership rights' diff --git a/test/e2e/ext/vp/communities/test_permissions/test_permissions_screen_overview/permission_welcome_image.png b/test/e2e/ext/vp/communities/test_permissions/test_permissions_screen_overview/permission_welcome_image.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2017f7d4d83f0bde9f4cc8ae3f0acc9fa68001 GIT binary patch literal 24906 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

^6)0 z3vYg5cqBXR7UwSOY-Z~G1^-Rq>~ zPYw>QCVX-`8fEa1JIMZGXd&&HUku|Gfw=^8i>N_@)p~}|#|`Jii|1GV57ij<6@hR( z#bfSd{iyZ5VXGvGX#YsqEZYK&NPQh0qsA3a2Zg?=lla?vLOjOYbBIlEfQiIL`&7;D z{Z8R%Yh9G*du=dbU*;`zWvI=4d()Ax)pu3%i=$z^jax{k=$^c?OkR@V725hRZ*qyO zxhc-S;yM!)24?^u#ZpzL#%j+Tah&xnk+1#_(Lb*Ub>|(*Z8cU;LQU@!PgD&EnPs)P zxa@ToPKIi(j7V0-G+sJ#VuM`x$&H}rV@R)Kv|oKA&HKSvb8XSpZ*h#T!Gqn{-204Z z&pg=Rz{mUupDozz>`U6V(b}9i5dqQLTXD7mU(si;yQiHEAAB)l3Hh7|atZFF3ry%V zkwN>B=Z@Lp&gB2|t@x#XUab($JGy+Id=;Rg=n9QUmYgn+iCSqtovQOb*OT^8UlS&c z7+A*u20{w}bA@J1Cjgh#Cdgr$N*=*NGU#jrk8#WeE;(qq_w?{d-_vEcO z{R2RIXTYJeKoAu*y{eK-L)caueu2DA;UV{}InANgg~8QpxQ*ofYQd_tpgpKHn38|(5Q75z0Wmin+shvGU7h&rN^&gEVUg*tHb3{y@O4|G<_LrH!`=v@y5 z;#|%znJ@o?fqQinbKX(t>-AMkgu9@fpopJG3MBDo?>A7ACxHBIU36=FukgRBQK zVji$Wsywol8(w&6*4B{{wK4)&O26tF^=oUhx;%oh5>Khwou{9f7*J3}CQE7~HGvCM zaLYWZH&W^~G^eL`+s-Fd&+Fm;i)q67j1=*5+Wrbp|L1sK)cyAk(cE@<^Lpirl371( zgWFfb=x&k_t7?zTMu&npjG?`bL3158uWnp1+-qQWK%O~#&vz?3m?jQEw zNcJn%c8SbQPLktz<$ZL?lC7yWYx#v zvltR}Gx~ySpZdpH;zCVT>h}z;>L*+&oJ0DD8@uN-Ck#cj+O)z)Zo(F4-GYX#E(`O7 zV1J(LipoGK&uQ)KvS`Rb5=Q$@6#bXD6oqJ~?5le4%xC)}uhmU1XjDgj(Yp3$7aDxr z|5L5thS1S=jK}uPi#0a#4W=zG{ET=Dfltbr)?wr}`8#oS2Q530^E3G&e5*|}>9(8A zUU_{HyU%7*-I9xgfJS-9otS5-8hHV%Tw@S{@c3dPhh4t{GEWbx7!V==&jZt8O$;Jy zC1R31Eqd6e#p`Xhac(==&2Qa?h(benlIvhPi?Hp8Dc=pXUq^UUG86{G&?8H74=;Fg z1kpAc5=y~g^ej?L6aG)_mIvCOZgA?}`ZK8FU9*csTaP7`*fIUS+8HoUqJ#S?(EBNRti74lYDEY}0)kBj##p*vW5KWI3b2ONYX7DIy)^$kkxV5}{aRjiT0}w;(SFrZ#ZOQaagr?A1-ISJR6JI zJ&bi)nKE$nzAqoX0iBBrfrX>qX+tOCVVy1Za}S$#r#8k@?m1fd6dBC@d^4r+s$5Fu zm4PE8_BjnW9*KcNu?KWeup$dcPhFq{Yfyp>p2#hLgwzSe3f(e4F&rXKDxBcvyyx?p zbrJM`r@k6tVcKs#b=WWe6byyJTP|V)EdxL>x&t~mBnWL44$HVkwKl@D8w`lGP(R2Q00E6M&O3!JiU{EAT@r#M$ zR^#mYfEr;y-lJ-KS~l;+NuAWhLtzfKoHo8m1>NhRbXMUYQ6(OtQsa-QeJ?Z`eOWX& zQJ+UYMTdsE4@2X9vd(5al3jM)#JFvLPDsw}ATRD5H+P!yh3|+W2!iC+{TX^N*|psu zL;-1k83eWphX)=N?+mYriNdLp>dv=hluB$#&UU}J z9Toe~{%Yj>b#4$nl=`{Nb69w+sDcn?zyT2(_eE~oXrwXDR zx!?Tics}vqXV+a@qqYMYP2hbX|bUaM*(&9TzeWY6v zgaDud*%vzFWbTJ*9L*3&vs-CN3nLt)ejqQ8wg`5?O;t_5fDvj^JN_pz!fh?bn{?uY zh8>@edYOCJyy4IB7jvGV`+dhZ2qxOX3bk+J#>;41H+x1BfBE*Fe$yVz_M0E>9FVwl zSCKxHBNW$i)@Dx7l>I>I2do(8`Srl=*vbl&r>sI$35(wDS@==>=Z_PU&z$RgheR`k zw4-C9HI|Vem+Rm}5S0!VRXsUrjK ztI8qN^8TCh-SNyti<8dHGY+(bsBBC}e7w?vDyOW4AD7RGKzWxW1WpkIruXBdXQcd) z8tD0YUWR^$530tGLSh0y;ox_16dxrciHOb{qHskqCSV`6b!ZE{M1zHjP5AE6}zMAC?vRDG6=kA28j>A zfEHy?$lqLGIxrFv2nqplV<1RiYROP=q7F~84nGML1iiZ3_|$g1U#6te#!0lw^k7V? z_L=B{d*aG$l0Yu30_lz@%b0eGM3W*WX=h$py1G+_qEHbXLeIo)U!A0U_#P z%7;LLAP~48Cxi|GDk$~Nu`!XmWq-65#{LiC1Nug2xZncj~}!AIs}NlbBTxfUE)IxF&w#r$7bRZ2%#mS2h zc%Uf1G)q;+bgW8_zvp&q?L}UjqW_36wm$KYBb&D05djL~P~wN;cySK)MGZAGjWs{a zHV)R+#|f;Kodji}%H($%lPT70z_eMI+fCs5G>>7d`ffY5680V+z86cF;J*!4tNd*H zRV!#VH|VEx^>et(xbk3QuQ6TFW4N~>m5wE}J9qhUi=7rnjKbOOChq8)_P6{0M@ZK% zYz&z%=G?lY!nkP032hIMkeqfbck*Cn-AZw4NGWU_f}~K6%dEZYO?mgpBv#^GN}IUC`_)wVWoFD*K?2vtx00>cjRN#nd@d@${0~Kon4u@Ei*+qp6snK= z9L0YDLU)%dJUhL3@<-3RAvrmpq1UTLtM9@8veD+1h?R!a^;i2_C%)bPK>eWD$RS6; zh;g4oyVsfOv+H#}IIYE`Uqz)}@bH&H0x71Aj0XLc*QW1?4YCSag$Nk4dyLqLU!Qb{ zF?Wn{Xb_ZDFUeNf;?`=pjHSB3kD!MUJ2g0pVST0vW$(RueJeAP%!$$Afsz28Yt;=L zQRuV1$(%M1f4eyeBtHlU{TWna-FHt?3G+bcnoa&!1Owc2LOtJmb)DVJUoe$J(+DkOfn$IV0sYLwDphE*ZR2)5$DI{NLVLSN#z zU7_80J)YTo%hXiOK$*G{g@OlkzT}SnEF&(;dVPvnJ5IeJbA01#g5UN8+T(}3O&qKJ zfAM2dG-+btC`a~P+L*H!uB;Ams2rJ87|CGyGp=Fl;6}G|Ref6qSDZcJK9b+8}hb%&KGr zU$U_b9Ul&d^A39|v%~d+TtNb#u*0hKcROhS;spIHT5$IJNIbEKtTOd)p8nQs*M$41 zAF&j{Mc$@;RMmPz_pzu_izdhlGt37{_7f9j^*dbfvp6O&)MeaVpai(Hk}$PZL0D~c zi*fe%SR;h`HW%We&GR%2;*n5zV0gf9209QV0FVk3@EuNAfD#85UV2T~hI}wFP~2$c z@aK5TX8+mpNJn4hnt2AILe9r)y-k5v*OZA4)Y%M05}{Bi1P)cASn53;pHn#RtzuXH zZ(PZGk5>GaROsH(+l{wAg41?k-1&yZK~O3T2n+@7p}C2$fZtpp0YFAVC;sMwaq_SA zc$4R?H(+dhPH30@>o((TUsYaf`>y#&T39?AeDx=DX|c2$af*bvq?#*V<%B{5j=U!v z^T{g~bMk2Rd=YLyH`T?|WzU^#IiLR8dT=?DOSpA*+QC-%341P-iar+ux`a`DPV-%r z8cxAo&I|V}fvFuNbi%Pv*MXO4kGaCe5+~_M`>|(b*^-JaADdd+!tnj1*7Ff8n_;;q zyxk{W&vjuSFm$QbkPY{hZw_6blzM^j^TpX0x%*wOe2x}^4gMDZg!2;x()Qz$q=&Tf zBn=N-369Yic~wK_<_$%j2tca@AS+Se!f4(#t+1+yx~T2E`$ysk&ImBX(xP{Wz4hSp z^=VzxNux)zP7`hsJt{q}&aHd<)q*i+LXj1szZu$TG~9Xu$1LQ|i>$e9D`fV^+!T%~ zqI#5J!x#O34;*uxo)3-N(fun;%<#sCU1VZ+cOTPYLXm~~IO~-9n~VH;rFAbP=^cLt z3oz|)afhjehduvzmJ`=M;b_{ol$j&i_I;Hf6MzhZiSd_>v>ferHEXRr_+j1s>@Bym zg{|EA)N*JYgH`{yF&!5IiR1(&?@tU$46^%Qn_`s3s|wGajigA^U0JvsckQGjUn>83 zaJo)O)*Y)otxZ%GR*@8y_fQYddT9gw}1l?<7I>VSY2Ft2qP^i~L*X z%WMtn%>9KrmDhaaPQO%$fce!-RRg$-+pFa*9!ZNdnnn8I9EBYR9bO)>v9Z}G-<-Xx z1d4x?>FUA0r8a9+71!!smr4mkK;o|PlY3ryO;qry=>8Xt=%MvYLSg8k$6E(EvYq!6 zL5b!JA87bt6W<2;T4~p1e zgkpFk`6cryLqqRaBfCMIzqu%tpgTGjI$5o;7a*WS$oZ0m!XaB+mePVeAX}T6d|Pq4 zZ8bmr7t_0ItGG4U@+QXyxcH+#r4QnzJjj@CEqPn?++B4Hb;2hsEP%VS5vE^-ln;Xi z0B))S7S6Bc~VXdPxDhsJZ;5HDwHeqmMf^>x-cppiD$zYgS<$r2v5o%NBP!K*~Zadb6Wk- z7!Z<*<2mv1ipMMbD9%GWe|HV0&WJ{swVh6h57l#!-nLXHOEzb$!Zdi26$37TlRw3J z(xSq_x{->oC3xRRdW|4{ucLjxL&;V=^1+&A76U`O5h4n$C_Nt>Hh-5r`4T;+u7ie) z!#lgoi$b?!+v>b5%O26#X(Y`02#{6dX8l)f;&OL`|BjkFxEk7(#;$NQKAO`icQTbY z{iow14+hi;!UloDJ>ZJriZCu}o`U?5H!-QSX-w}mHS0W!SbYp#yOpiDma<-IMTd%p zzzf9qg9Rx3b{mgS{Q4-)aTA-R-qgMX!4%hM_m1Qkm7|?nk6&K9qc{!*!@CO?=@R*U zF{qu2wi`&L%3$;BMVrF_`+0 z_uaSeu2uT)URFm~v2`tGy&SwFI36hqzZ*`kAyCo>FGhKCoWe;Uy6VACtv|b}1r1CK z>EpCUd5^wb$8A(;Z?@5daww|3+iibYKWi?1)bn*Ur6u#lqo$ck2MN{6?a_MK6?eV$ zmD}Hx?|vA#o>cnL{%MgN+ft>jEa>{EN<@N~WR4~ce`n2UJbL5t$nJ$CufNL(Mo z#}RHD`ZloDNE8^qJ&Cv7?REQB3wNz*7l(@7q4+!;iQp4T>}8o=i*~cB5M@$PqVB>_ zgY}ZRm8cR?I_fm6LEcqZQV=aR7^3kR!Jy15r0gQe&T=De@E!-yt!>X#aLB)ONg)ex z>z=VmZ~LW=hD^iR-l_WpERMFZXd*C|S|bR~qXZQJ^t)9Bg3C&YS_!EV4N{~Vh9h$| z4B$FXbizKPt4guKv{=bvN*aC0r9iiCzy`5))^+J$RGpg6+9xx&#cr!C2m|TsnCkc= zuGZIyv}I$mk>*!ah(^XkQ%aGdNC*pv8XQi?1?Pe*f&yVMNJzX+P=P=SEHbw=u=Id6 zXu>|IR1bXhvr&X*z22?3Z-eZgRw{wZU9YFhg>(o3zUpt~D!hAL zDIsB<@fal}JP-jxhQTo)6i}mq71fG^3KCJscx*}_RuVb}4^oumr%($RS2vB}TU%Xq zZnZvN_32*ILa^n1kOhb)Co!H6*X`=ILRj6m--;Af#K6Fq zAh>`!KOj43G^$4763=v=>5O6YBr!qN@5M|qWu8AHf0ea~%Vx=xwsHvRxcGOCZSl6v z6GpZbxJgso&l!`iCex^I641bKM0h9+38x4U0sZwGdhX!FzFcbbaW2Z!K+k|BI$`A5 zOJ8^La$XW}Yj1j%f-!r#%0dq(@IuXel;)#MT(^dgTOO`HUShmd-CCAO>LTC;>pwP&d3+&z!%Na)A4m}_=dTV2%f%+9F=RUc9Q+~ph0>Ul`2gWPq leJ}(H?@K-@|KB{GaZq)?+v?*Jr~)PqQdibes#LTL`hPzYkDvem literal 0 HcmV?d00001 diff --git a/test/e2e/gui/objects_map/community_names.py b/test/e2e/gui/objects_map/community_names.py index d4c9c1eac7..c1c11e8b2c 100644 --- a/test/e2e/gui/objects_map/community_names.py +++ b/test/e2e/gui/objects_map/community_names.py @@ -44,6 +44,8 @@ mainWindow_communitySettingsBackToCommunityButton_StatusBaseText = {"container": mainWindow_listView_StatusListView = {"container": mainWindow_communityLoader_Loader, "id": "listView", "type": "StatusListView", "unnamed": 1, "visible": True} overview_StatusNavigationListItem = {"container": mainWindow_listView_StatusListView, "objectName": "CommunitySettingsView_NavigationListItem_Overview", "type": "StatusNavigationListItem", "visible": True} members_StatusNavigationListItem = {"container": mainWindow_listView_StatusListView, "index": 1, "objectName": "CommunitySettingsView_NavigationListItem_Members", "type": "StatusNavigationListItem", "visible": True} +permissions_StatusNavigationListItem = {"container": mainWindow_listView_StatusListView, "index": 2, "objectName": "CommunitySettingsView_NavigationListItem_Permissions", "type": "StatusNavigationListItem", "visible": True} + # Overview Settings View mainWindow_OverviewSettingsPanel = {"container": mainWindow_communityLoader_Loader, "type": "OverviewSettingsPanel", "unnamed": 1, "visible": True} communityOverviewSettingsCommunityName_StatusBaseText = {"container": mainWindow_OverviewSettingsPanel, "objectName": "communityOverviewSettingsCommunityName", "type": "StatusBaseText", "visible": True} @@ -53,8 +55,33 @@ mainWindow_Edit_Community_StatusButton = {"checkable": False, "container": mainW mainWindow_MembersSettingsPanel = {"container": mainWindow_communityLoader_Loader, "type": "MembersSettingsPanel", "unnamed": 1, "visible": True} embersListViews_ListView = {"container": mainWindow_MembersSettingsPanel, "objectName": "CommunityMembersTabPanel_MembersListViews", "type": "ListView", "visible": True} memberItem_StatusMemberListItem = {"container": embersListViews_ListView, "id": "memberItem", "type": "StatusMemberListItem", "unnamed": 1, "visible": True} +# Permissions Intro View +community_welcome_screen_image = {"container": statusDesktop_mainWindow, "objectName": "welcomeSettingsImage", "type": "Image", "visible": True} +community_welcome_screen_title = {"container": statusDesktop_mainWindow, "objectName": "welcomeSettingsTitle", "type": "StatusBaseText", "visible": True} +community_welcome_screen_subtitle = {"container": statusDesktop_mainWindow, "objectName": "welcomeSettingsSubtitle", "type": "StatusBaseText", "visible": True} +community_welcome_screen_checkList_element1 = {"container": statusDesktop_mainWindow, "objectName": "checkListText_0", "type": "StatusBaseText", "visible": True} +community_welcome_screen_checkList_element2 = {"container": statusDesktop_mainWindow, "objectName": "checkListText_1", "type": "StatusBaseText", "visible": True} +community_welcome_screen_checkList_element3 = {"container": statusDesktop_mainWindow, "objectName": "checkListText_2", "type": "StatusBaseText", "visible": True} +add_new_permission_button = {"container": statusDesktop_mainWindow, "objectName": "addNewItemButton", "type": "StatusButton", "visible": True} # Permissions Settings View -mainWindow_PermissionsSettingsPanel = {"container": mainWindow_communityLoader_Loader, "type": "PermissionsSettingsPanel", "unnamed": 1, "visible": True} +mainWindow_editPermissionView_EditPermissionView = {"container": statusDesktop_mainWindow, "id": "editPermissionView", "type": "EditPermissionView", "unnamed": 1, "visible": True} +editPermissionView_Who_holds_StatusItemSelector = {"container": mainWindow_editPermissionView_EditPermissionView, "id": "tokensSelector", "type": "StatusItemSelector", "unnamed": 1, "visible": True} +editPermissionView_Is_allowed_to_StatusFlowSelector = {"container": mainWindow_editPermissionView_EditPermissionView, "id": "permissionsSelector", "type": "StatusFlowSelector", "unnamed": 1, "visible": True} +editPermissionView_In_StatusItemSelector = {"container": mainWindow_editPermissionView_EditPermissionView, "id": "inSelector", "type": "StatusItemSelector", "unnamed": 1, "visible": True} +editPermissionView_whoHoldsSwitch_StatusSwitch = {"checkable": True, "container": mainWindow_editPermissionView_EditPermissionView, "id": "whoHoldsSwitch", "type": "StatusSwitch", "unnamed": 1, "visible": True} +edit_TextEdit = {"container": statusDesktop_mainWindow_overlay, "type": "TextEdit", "unnamed": 1, "visible": True} +inputValue_StyledTextField = {"container": statusDesktop_mainWindow_overlay, "echoMode": 0, "id": "inputValue", "type": "StyledTextField", "unnamed": 1, "visible": True} +o_TokenItem = {"container": statusDesktop_mainWindow_overlay, "index": 0, "type": "TokenItem", "unnamed": 1, "visible": True} +add_StatusButton = {"checkable": False, "container": statusDesktop_mainWindow_overlay, "type": "StatusButton", "unnamed": 1, "visible": True} +customPermissionListItem = {"container": statusDesktop_mainWindow_overlay, "objectName": "becomeAdmin", "type": "CustomPermissionListItem", "visible": True} +communityItem_CommunityListItem = {"container": statusDesktop_mainWindow_overlay, "id": "communityItem", "type": "CommunityListItem", "unnamed": 1, "visible": True} +editPermissionView_switchItem_StatusSwitch = {"checkable": True, "container": mainWindow_editPermissionView_EditPermissionView, "id": "switchItem", "type": "StatusSwitch", "unnamed": 1, "visible": True} +editPermissionView_Create_permission_StatusButton = {"checkable": False, "container": mainWindow_editPermissionView_EditPermissionView, "text": "Create permission", "type": "StatusButton", "unnamed": 1, "visible": True} +mainWindow_PermissionsView = {"container": statusDesktop_mainWindow, "type": "PermissionsView", "unnamed": 1, "visible": True} +o_StatusListItemTag = {"container": mainWindow_PermissionsView, "type": "StatusListItemTag", "unnamed": 1, "visible": True} +o_IntroPanel = {"container": mainWindow_PermissionsView, "type": "IntroPanel", "unnamed": 1, "visible": True} +mainWindow_PermissionsSettingsPanel = {"container": statusDesktop_mainWindow, "type": "PermissionsSettingsPanel", "unnamed": 1, "visible": True} + # Edit Community mainWindow_communityEditPanelScrollView_EditSettingsPanel = {"container": statusDesktop_mainWindow, "objectName": "communityEditPanelScrollView", "type": "EditSettingsPanel", "visible": True} communityEditPanelScrollView_Flickable = {"container": mainWindow_communityEditPanelScrollView_EditSettingsPanel, "type": "Flickable", "unnamed": 1, "visible": True} diff --git a/test/e2e/gui/screens/community_settings.py b/test/e2e/gui/screens/community_settings.py index 60cf372e72..fac0359bf6 100644 --- a/test/e2e/gui/screens/community_settings.py +++ b/test/e2e/gui/screens/community_settings.py @@ -3,6 +3,7 @@ import typing import allure import driver +from driver.objects_access import walk_children from gui.components.color_select_popup import ColorSelectPopup from gui.components.community.tags_select_popup import TagsSelectPopup from gui.components.os.open_file_dialogs import OpenFileDialog @@ -30,6 +31,7 @@ class LeftPanel(QObject): self._back_to_community_button = Button('mainWindow_communitySettingsBackToCommunityButton_StatusBaseText') self._overview_button = Button('overview_StatusNavigationListItem') self._members_button = Button('members_StatusNavigationListItem') + self._permissions_button = Button('permissions_StatusNavigationListItem') @allure.step('Open community main view') def back_to_community(self): @@ -47,6 +49,11 @@ class LeftPanel(QObject): self._members_button.click() return MembersView().wait_until_appears() + @allure.step('Open permissions') + def open_permissions(self) -> 'PermissionsIntroView': + self._permissions_button.click() + return PermissionsIntroView().wait_until_appears() + class OverviewView(QObject): @@ -204,3 +211,127 @@ class MembersView(QObject): @allure.step('Get community members') def members(self) -> typing.List[str]: return [str(member.title) for member in driver.findAllObjects(self._member_list_item.real_name)] + + +class PermissionsIntroView(QObject): + def __init__(self): + super(PermissionsIntroView, self).__init__('o_IntroPanel') + self._add_new_permission_button = Button('add_new_permission_button') + self._welcome_image = QObject('community_welcome_screen_image') + self._welcome_title = TextLabel('community_welcome_screen_title') + self._welcome_subtitle = TextLabel('community_welcome_screen_subtitle') + self._welcome_checklist_1 = TextLabel('community_welcome_screen_checkList_element1') + self._welcome_checklist_2 = TextLabel('community_welcome_screen_checkList_element2') + self._welcome_checklist_3 = TextLabel('community_welcome_screen_checkList_element3') + + @property + @allure.step('Get permission welcome image') + def permission_welcome_image(self) -> Image: + return self._welcome_image.image + + @property + @allure.step('Get permission welcome title') + def permission_welcome_title(self) -> str: + return self._welcome_title.text + + @property + @allure.step('Get permission welcome subtitle') + def permission_welcome_subtitle(self) -> str: + return self._welcome_subtitle.text + + @property + @allure.step('Get permission checklist') + def permission_checklist(self) -> typing.List[str]: + permission_checklist = [str(self._welcome_checklist_1.object.text), str(self._welcome_checklist_2.object.text), + str(self._welcome_checklist_3.object.text)] + return permission_checklist + + @allure.step('Click add new permission button') + def add_new_permission(self) -> 'PermissionsSettingsView': + self._add_new_permission_button.click() + return PermissionsSettingsView().wait_until_appears() + + +class PermissionsSettingsView(QObject): + def __init__(self): + super(PermissionsSettingsView, self).__init__('mainWindow_PermissionsSettingsPanel') + self._who_holds_checkbox = CheckBox('editPermissionView_whoHoldsSwitch_StatusSwitch') + self._who_holds_asset_field = TextEdit('edit_TextEdit') + self._who_holds_amount_field = TextEdit('inputValue_StyledTextField') + self._asset_item = QObject('o_TokenItem') + self._is_allowed_to_option_button = Button('customPermissionListItem') + self._in_general_button = Button('communityItem_CommunityListItem') + self._hide_permission_checkbox = CheckBox('editPermissionView_switchItem_StatusSwitch') + self._create_permission_button = Button('editPermissionView_Create_permission_StatusButton') + self._add_button = Button('add_StatusButton') + self._who_holds_list_item = QObject('editPermissionView_Who_holds_StatusItemSelector') + self._is_allowed_to_list_item = QObject('editPermissionView_Is_allowed_to_StatusFlowSelector') + self._in_list_item = QObject('editPermissionView_In_StatusItemSelector') + self._tag_item = QObject('o_StatusListItemTag') + + @property + @allure.step('Get permission tags') + def tags(self) -> typing.List[str]: + _tags = driver.findAllObjects(self._tag_item.real_name) + return [str(getattr(tag, 'title', '')) for tag in _tags] + + @allure.step('Set state of who holds checkbox') + def set_who_holds_checkbox_state(self, state): + if state is False: + self._who_holds_checkbox.set(state) + + @allure.step('Set asset and amount') + def set_who_holds_asset_and_amount(self, asset: str, amount: str): + if asset is not False: + self.open_who_holds_context_menu() + self._who_holds_asset_field.clear().text = asset + self._asset_item.click() + self._who_holds_asset_field.wait_until_hidden() + self._who_holds_amount_field.text = amount + self._add_button.click() + self._who_holds_amount_field.wait_until_hidden() + + @allure.step('Choose option from Is allowed to context menu') + def set_is_allowed_to(self, name): + self.open_is_allowed_to_context_menu() + self._is_allowed_to_option_button.real_name['objectName'] = name + self._is_allowed_to_option_button.wait_until_appears().click() + self._add_button.click() + self._add_button.wait_until_hidden() + + @allure.step('Choose channel from In context menu') + def set_in(self, in_general): + if in_general == '#general': + self.open_in_context_menu() + self._in_general_button.wait_until_appears().click() + self._add_button.click() + self._add_button.wait_until_hidden() + + @allure.step('Click create permission') + def create_permission(self): + self._create_permission_button.click() + self._create_permission_button.wait_until_hidden() + + @allure.step('Open Who holds context menu') + def open_who_holds_context_menu(self): + for child in walk_children(self._who_holds_list_item.object): + if getattr(child, 'id', '') == 'addItemButton': + driver.mouseClick(child) + return + raise LookupError('Add button for who holds not found') + + @allure.step('Open Is allowed to context menu') + def open_is_allowed_to_context_menu(self): + for child in walk_children(self._is_allowed_to_list_item.object): + if getattr(child, 'id', '') == 'addItemButton': + driver.mouseClick(child) + return + raise LookupError('Add button for allowed to not found') + + @allure.step('Open In context menu') + def open_in_context_menu(self): + for child in walk_children(self._in_list_item.object): + if getattr(child, 'id', '') == 'addItemButton': + driver.mouseClick(child) + return + raise LookupError('Add button for in not found') diff --git a/test/e2e/tests/communities/test_permissions.py b/test/e2e/tests/communities/test_permissions.py new file mode 100644 index 0000000000..7843ff351a --- /dev/null +++ b/test/e2e/tests/communities/test_permissions.py @@ -0,0 +1,77 @@ +import allure +import pytest +from allure_commons._allure import step + +import constants +import driver +from constants.permissions import PermissionsElements +from gui.main_window import MainWindow +from scripts.tools import image + +pytestmark = allure.suite("Communities") + + +@allure.testcase('https://ethstatus.testrail.net/index.php?/cases/view/703198', + 'Manage community: Manage Permissions screen overview') +@pytest.mark.case(703198) +@pytest.mark.parametrize('params', [constants.community_params]) +def test_permissions_screen_overview(main_screen: MainWindow, params): + main_screen.create_community(params) + + with step('Open permissions in community settings'): + community_screen = main_screen.left_panel.select_community(params['name']) + community_setting = community_screen.left_panel.open_community_settings() + permissions_settings = community_setting.left_panel.open_permissions() + + with step('Verify all elements on permissions screen'): + with step('Permission welcome image is correct'): + welcome_image = permissions_settings.permission_welcome_image + image.compare(welcome_image, 'permission_welcome_image.png') + with step('Permission welcome title is correct'): + assert permissions_settings.permission_welcome_title == PermissionsElements.WELCOME_TITLE.value + with step('Permission welcome subtitle is correct'): + assert permissions_settings.permission_welcome_subtitle == PermissionsElements.WELCOME_SUBTITLE.value + with step('Permission welcome checklist is correct'): + assert PermissionsElements.WELCOME_CHECKLIST_ELEMENT_1.value == permissions_settings.permission_checklist[0] + assert PermissionsElements.WELCOME_CHECKLIST_ELEMENT_2.value == permissions_settings.permission_checklist[1] + assert PermissionsElements.WELCOME_CHECKLIST_ELEMENT_3.value == permissions_settings.permission_checklist[2] + + +@allure.testcase('https://ethstatus.testrail.net/index.php?/cases/view/703632', + 'Manage community: Adding new permissions') +@pytest.mark.case(703632) +@pytest.mark.parametrize('params', [constants.community_params]) +@pytest.mark.parametrize( + 'checkbox_state, first_asset, second_asset, amount, allowed_to, in_general, asset_title, second_asset_title, allowed_to_title', + [ + pytest.param(True, 'Dai Stablecoin', False, '10', 'becomeMember', False, '10 DAI', False, 'Become member'), + pytest.param(True, 'Ether', False, '1', 'becomeAdmin', False, '1 ETH', False, 'Become an admin'), + pytest.param(True, 'Ether', 'Dai Stablecoin', '10', 'viewAndPost', '#general', '10 ETH', '10 DAI', + 'View and post'), + pytest.param(True, 'Ether', 'Dai Stablecoin', '10', 'viewOnly', '#general', '10 ETH', '10 DAI', 'View only'), + pytest.param(False, False, False, False, 'becomeAdmin', False, False, False, 'Become an admin') + ]) +def test_adding_permissions(main_screen: MainWindow, params, checkbox_state: bool, first_asset, second_asset, amount, + allowed_to: str, in_general, asset_title, second_asset_title, allowed_to_title: str): + main_screen.create_community(params) + + with step('Open add new permission page'): + community_screen = main_screen.left_panel.select_community(params['name']) + community_setting = community_screen.left_panel.open_community_settings() + permissions_settings = community_setting.left_panel.open_permissions().add_new_permission() + + with step('Create new permission'): + permissions_settings.set_who_holds_checkbox_state(checkbox_state) + permissions_settings.set_who_holds_asset_and_amount(first_asset, amount) + permissions_settings.set_who_holds_asset_and_amount(second_asset, amount) + permissions_settings.set_is_allowed_to(allowed_to) + permissions_settings.set_in(in_general) + permissions_settings.create_permission() + + with step('Created permission is displayed on permission page'): + if asset_title is not False: + assert driver.waitFor(lambda: asset_title in permissions_settings.tags) + if second_asset_title is not False: + assert driver.waitFor(lambda: second_asset_title in permissions_settings.tags) + if allowed_to_title is not False: + assert driver.waitFor(lambda: allowed_to_title in permissions_settings.tags)