From 0af669bad53d823aa439ba6f6e1938b2b967a27c Mon Sep 17 00:00:00 2001 From: Sue Tairaku <42981334+stairaku@users.noreply.github.com> Date: Thu, 16 Nov 2023 16:02:09 -0800 Subject: [PATCH] Automation Refactoring (#3598) * Digital Documents refactoring * Research File uncomment steps * Digital Documents refactoring * Research File uncomment steps * Refactoring on Wait() method * Refactoring on Wait() method * Calibrating previous Waits refactoring for all test cases to run successfully * Calibrating previous Waits refactoring for all test cases to run successfully * Acquisition File - Checklist * Acquisition File refactoring and Stakeholders * Acquisition Files Stakeholders * Acquisition Files - Compensation Requisition, Changing Digital Documents - Upload test documents * Testing queries update * Leases Refactoring * Refactoring on Automation - Verify Views, Reserach Files * Acquisition Expropriation and Takes * Nuget package updates, refactoring Contacts, Help desk and AF Checklist * Changes on leases * Update nuget packages * Automation refactoring in Digital Documents, Projects, Notes, Financial Codes, Leases and Contacts --------- Co-authored-by: devinleighsmith <41091511+devinleighsmith@users.noreply.github.com> Co-authored-by: Alejandro Sanchez --- .../Classes/AcquisitionFile.cs | 17 +- .../Data/PIMS_Testing_Data.xlsx | Bin 82871 -> 83196 bytes .../Features/AcquisitionFiles.feature | 2 +- .../Features/AcquisitionFiles.feature.cs | 2 +- .../Features/AdminTools.feature | 4 + .../Features/AdminTools.feature.cs | 28 ++ .../Features/Projects.feature | 47 ++- .../Features/Projects.feature.cs | 126 +++++-- .../Features/ResearchFiles.feature | 3 +- .../Features/ResearchFiles.feature.cs | 25 +- .../PageObjects/AcquisitionFilesDetails.cs | 47 ++- .../PageObjects/AcquisitionTakes.cs | 126 +++---- .../PageObjects/Activities.cs | 294 ---------------- .../PageObjects/Contacts.cs | 2 +- .../PageObjects/DigitalDocuments.cs | 202 +++++++---- .../PageObjects/FinancialCodes.cs | 192 +++++++---- .../PageObjects/LeaseDetails.cs | 2 +- .../PageObjects/Notes.cs | 74 ++-- .../PageObjects/Projects.cs | 229 +++++++------ .../PageObjects/ResearchFiles.cs | 2 +- .../PageObjects/SearchAcquisitionFiles.cs | 56 +++- .../PageObjects/SearchContacts.cs | 2 +- .../PageObjects/SearchLease.cs | 2 +- .../PageObjects/SearchProjects.cs | 115 +++++-- .../PageObjects/SearchResearchFiles.cs | 2 +- .../PageObjects/SharedPagination.cs | 49 +++ .../StepDefinitions/AcquisitionFileSteps.cs | 79 ++++- .../StepDefinitions/ActivitiesSteps.cs | 316 ------------------ .../StepDefinitions/AdminToolSteps.cs | 107 ++++++ .../StepDefinitions/DigitalDocumentSteps.cs | 55 ++- .../StepDefinitions/NotesSteps.cs | 12 +- .../StepDefinitions/ProjectSteps.cs | 184 ++++++---- .../StepDefinitions/ResearchFileSteps.cs | 4 +- 33 files changed, 1249 insertions(+), 1158 deletions(-) delete mode 100644 testing/PIMS.Tests.Automation/PageObjects/Activities.cs create mode 100644 testing/PIMS.Tests.Automation/PageObjects/SharedPagination.cs delete mode 100644 testing/PIMS.Tests.Automation/StepDefinitions/ActivitiesSteps.cs diff --git a/testing/PIMS.Tests.Automation/Classes/AcquisitionFile.cs b/testing/PIMS.Tests.Automation/Classes/AcquisitionFile.cs index 023266b8ea..3f67fce617 100644 --- a/testing/PIMS.Tests.Automation/Classes/AcquisitionFile.cs +++ b/testing/PIMS.Tests.Automation/Classes/AcquisitionFile.cs @@ -197,14 +197,15 @@ public class Take public string TakeStatus { get; set; } = null!; public string? SiteContamination { get; set; } = String.Empty; public string? TakeDescription { get; set; } = String.Empty; - public string? IsNewRightWay { get; set; } = String.Empty; - public string? IsNewRightWayArea { get; set; } = String.Empty; - public string? IsStatutoryRightWay { get; set; } = String.Empty; - public string? IsStatutoryRightWayArea { get; set; } = String.Empty; - public string? IsLandNotation { get; set; } = String.Empty; - public string? IsLandNotationDetail { get; set; } = String.Empty; - public string? IsLandNotationArea { get; set; } = String.Empty; - public string? IsLandNotationDate { get; set; } = String.Empty; + public string? IsNewHighwayDedication { get; set; } = String.Empty; + public string? IsNewHighwayDedicationArea { get; set; } = String.Empty; + public string? IsMotiInventory { get; set; } = String.Empty; + public string? IsNewInterestLand { get; set; } = String.Empty; + public string? IsNewInterestLandArea { get; set; } = String.Empty; + public string? IsLandActTenure { get; set; } = String.Empty; + public string? IsLandActTenureDetail { get; set; } = String.Empty; + public string? IsLandActTenureArea { get; set; } = String.Empty; + public string? IsLandActTenureDate { get; set; } = String.Empty; public string? IsLicenseConstruct { get; set; } = String.Empty; public string? IsLicenseConstructArea { get; set; } = String.Empty; public string IsLicenseConstructDate { get; set; } = String.Empty; diff --git a/testing/PIMS.Tests.Automation/Data/PIMS_Testing_Data.xlsx b/testing/PIMS.Tests.Automation/Data/PIMS_Testing_Data.xlsx index c752888540b4379245cf27c4ba8c602b2ab6f88a..303d99f76485a00209375979abd8b607ade83141 100644 GIT binary patch delta 46714 zcmZ^KV{|7?&~I$pcCxW;+s-E0*mnN0ZCjg-ZQHhOZmgSq-h1wOzuXV=JJmhaJvG%e zH9b`|&7t7$;ovnYkkE(bhNIc8yEj6S4-Lf zz^N^Zg*&;|Q=5li(VZr0C!-a%NHdyhmE&X_m0^>#b|mi1$^1gggb%k@6mrSATO%Ww$O48Z-JXVZc{BFp%og)C<^Li6E>la+-NWD$TQClSl8K1X+rzNdtPR1 z!K$QiUsOqs55rKaHC!gr-o)O#H&|8$=v@c>T#xNFNuW#K!|Zc%uZiH^wn%o0JH!h< zT|<!oItl3@Livk7+}p8F!=FPnR~K7DLY*3fgt2L;R`Lv9}L; z6R}imkchU0Gc{84>)}!G7&{pJU`qzOgv-cX`2eo0iQ_}UVsRvg3_MOVW53%HAk4IY zpa`|$PaC1zP-PlMt}HiS%j=*)NONP~Sa$39;1x~PuS7CweoGmn*_iRelop~(sIkh_ z4KebZoUYue+7vtqf5s4Tvk2sH@Fz#B|gAl}K5F@cf>0Pwz-o_IRoBs)m>ns1ceRq0-GO4YR+T4EaPZ;IFz zz_Q>_2(n1GYL**GFpg2w_H+hpv(C|Wv_!_AaVxeCK=T!7ZMg1o4E4x;lf1EVIe<2h zURNNCja;s^Mvw*V@U&Wvm`bgl{O&V_w#MdO+Fi9v<0b!Dmyi2SEOHLuQdrg`NKc`& zfeKc<<%jO|=MN+i*S|rj1fF>|x0e`l9QOZtEC@vyY`~3B762&+3ZanEp2Q(Gj{@V# zr!ih{B%I!&3)>m#LJ;Ki28_8ZC<+YuNN7JqO;5%(Mj9|Dh1@UXxKMHqGQk_XdC25J z>@exT6=?6A2U16EGCKo!`U`z{a9x5i^^>>-()d!P@(D{#k5p_s>wY~Ii}zy93|1QA zSP7UuGQ!!gL!l8G%U1?_k~<&B6_2s-J`LM*U&0I$!t9-Cd5zjOhBnGPDQL!4EbRpI zpjsgwMdfj+Aoy3Ts0&|=J92{<6ohlNO0*~BYGJsauF*m`9K$f6Fp@6=YUHV!i&eK* zTcn7B^$b-2{DiD`)=8R%qChO-ly45o{5srdLWQ(|M{R{P)=!`DZ&V^lG!yzQiSYwL zr0BXKSf9rtS_D;I;sHT11<2UG9?aa*ZWwVLR>IBYj$AYO4{2!}SYa&Omz`C1QjuR& zWCx-nMQm8JTBZBRCUm9cHZ$Da6LxT zoB;8(y$YGL7NT^ssSHXkM}^e5k6+QcdV#v7l|yA^wiSDT+WewkTWCPH;$%+BH^CVj zfQkCemj7G9_q?GQv~aziKsLdk6sD@0Req|fdVPYfP$eVzRyF~pTXUMfcL3W(}yJPB2og@ z7?FT>yox_VN1i&ikqsMRi#K)D9vs+XMCkT78z*JdzTV_z{gPXPlKr5;06Dj^rV0{U z+Fms1sCwbv!y*`$VP%@l)U(yOv^*jyb1i@DX}PrvP}NQ>K40c9hz``*k}P3^wHD|Y{Ew3Gu<(KJkv?KXSvQBsYU^6M2xs6)!E#7~st@JqA# zNfVkhMLx?7JKM~&WOq4J*7fXAd%cL3DokE~DgJU$?y%)1zHJL`i}ei(cS*W|*}>Ou zV(Q+$9Kenj4%g-(YCq1p9-rRa7(AfaTowqwCDoYY!^Lqg42Ug07}lU|G28_})*eK_ z50gjY|B?R7pfFDccgNs*@RE)%HeH(y&XE3*0It*&hPg#z@Gfz$HJH~gqLxzR5}xz1 zXBD>bGBGi2Cyscw*~k{PuN`)2zmMK@E2!8|{0j>XR%B%!+-4o+M?aYOYqe0Q718FO zm(SO|>Io=7s=Am}ht&h3!?QSGwPg0DLsTBF7`|RfwUk^9EChw!ttr%?WcyCR0i~ zgIFloK^2||A(h1&C(TNNBta&ZHK9OqjSQZ^{#&r42&7St7yhJ33(f(cn!L_<1&D;Q9>v@0s}T7DW@$Qd7X~IIZ@!>N8Q3K>VPnYSBRWR%BSnXG}E zgbWPVg_Cbb&Nq**PowM0DOTARpBvuW!2loXw_O1P9kKIYZ_8I759=@I>&=sI{6~Zu zwoL}UUv7Wv*1NnB0pq^3+6x}wv#!SGr=@kmJ#at3AjFD-Atii z=FK#rVu;Dfycmeh3?V)EHkLr5r#`rVJsB3Lh;1DqJ*v;25JI=f*Z{D>Wm6iHePuP1SkP^y!wXfgyP zq%B+vyn?(A4wY8O)6Vp9K1(|ar`Wa3)s4bOQ|_m-&h%;YMh?`rf=5$vjfE}Q(}=Z9 zE7sV zqXw#mnKXOwj)f!RQS&Ev(_pb9`m>kXE~+sneI4pjZ=d;b3uUuwNpUVTdt79Z@V7qI zoeD3~yy$WJxi-einNG9s_L4CAVA)doB0sih84~V<6k7lu#UiykjRl(Xg?Uu`3U#=2 z&su^Q$P69ee?kw0rYtc!^tXlI)KY5m!shjcIxwo+qXvaGb845$H%Il}KITukh9egB zdQse5?CtFxJ9q1xu^atjA07_}ho>BBI9ItIK_8fvYOR>nKgRYoy6^r58a}O0CTvD% zjZ-ib6NCaVV|YCgmiLi17fR`de@|J~wS_eTx|}gk4DRR~qIUV6u$*>lmhx=nWtuby z8at8j8*x``u?q1k9%Tg=dgA>!w;bSHg}i*jTuH{|*5slvI=W=73>&s@DqXNq$v(u7 zib~|&xauxf=A!Gf#PoPGa zPY~fBj5K@$ZuT^WGf?1kmXit+7tma2Wr|i7x%9aiL`wqLl;Mt1o~6aa`O?C%tf_i! z-V~U$#Q(fxy8j$q<4KizIqi>J&oWL$?M_zJqD#)ZL2G&=`eSNr04=>;0dBKI7hLb8 zx(f%GmD{D$8Z2Sc+Q2k@4D7>iD8vlFGh zEs_Ja3qzbxf{q~_A#jPipFvvXy38A97P6{B#J^DH?sJnzISIO$3RPN>VxeLyNH@7w zK5K$GQd~%0pQbsQ8JD&Sp9dbv%Yh9Qj_tX}0l4?RK{EahsrAq9sQnkbm>!45Z z>k;b<$>Uj$pr8;Il&~`3&XENrN#Fx63f<=7wRXkz9`+1SPmkvg3_fd~%eGYi2R|AV zfXjpwYyf@;oZ;SiK|v+vCbHpm*Pk38q07pE?^7JKZF!HTQkaZBj8^|B zrEkUx%Wcc;=s-J`4;WcMck{5WXftSx1fz5z8|$V_AbNnY2gG$}pFAU%Aw_VEb4i>o>s z%>LyI;OJcr^=hrRJ(uHEvcXF&o)~po+p562R5?;6=3qFZU#VN;_<_l;`+Q-U$AbU$bliOJE8zF!-kKDNkVdqdQTx(woQ6xo`wJBcAp=QbHg zF<%sm9Cn>Y!5^m_&A(+gT4Qn9g>z1MWsK$sPNTRVFJR@n@Dc^q^`*iS@dX2T)Y4IA z46I|VapLu@aS-*bL><;}9DSLS;65oD!@(sRQ}DHKkL?!#f?11mL2*)OGv93yEQMI) z5Nt}6sq*4g36&q4-P@c9UmtN~8~d{p%2N|N8Hn&zN;&7e@Q5e&7pnLKM8>1y5co1v zI7;OQK86|eIbw*aCcl=#+PJmEHEe%qK03a+=XwMZ?If6CAZ;(dnq8i?HO!~M=ws8&1WJ8z=R@I0^odFjyz;Ar=WG6QT41w-^-{%cuI;HO|EdY_`TKf0lkws%v8s;V ze5x(PE=EqrgztToKV-9YanEg|(`g34n9$G3J^JP2W}Xqg-rLbrz?T-6qF-GAv&C;Hf&n&MED@8#)F?ka zW5T{|ZL*lt`U5Z^Uy^HFqJE*jS$&{aq&}MJ)wFlcK$6hzoJ-aY_*l;r0j7;AywmpC zc+FikZI1l7c{Bw&nHKJLX1OGeMU=Y_GVl&QuIMe8FP;L#!!ZONX^JyZ+Q=)>nbkjqB9JGOab#X2Mi2|P zuh)^+x&Rq0n##ezK-{`OlK?(`%rwg$cK|!zKVS%uzd@P2^OJ=e#SOPFXp(bRh^!Tt zDoRqwFwE^R8kL4>#8ikg>!%RYt7ICL%+hmGH-8@#rMTkE&%JQubxo?uTP=N=Y)l-~ zYc}#})Xa}4q{a=!aro;dV`B3cIPD{OTuMtNx~=}KG%-WRPHOv{sr-nhLHuCdY4X@15rFQZe-+EkB6Iw)SJ8Go%5C_dkcUI1{;}4wi zSn*(Yef8tOm|@oB8F!mPl|eLd{0`R|p?+QhaOyZYAq(i@r?5jw9 zdq?WFOo_m}02PBOWPBUF{fUY?L1nHAYsy8Dq2%q?mu4=0>#r3PZi*(F?}QK?Zh~eS zlf8^*&;h50H+X{j!@U&^b)1Td;7J1taQoNSA|)c&%0C?X7aH0`fRnl`Q6b|=i~4rZ z_Z_f5a(o2=i3@EOKcti4ZRLGJ{=cufB<*!uTrRken@<0|BEw_9&`zyY% zb3ku%rpRXP?SO8)SlmbnNQk?o1T?YuV?{i!z>nPNX}kX6=Hc_+^KpOxX0=9VhguXE6o!nhcjqw-A6e1#Q%1#w{D9X{3fN8^pf{Wj9EJ zUpS|&_xJRXu_?!ya+!V?lv|#FID6=^&eO*=1$|g6VXyLYcO6gwXL|@LD+%cL>Qhw_ zQsXPM1Sh|b`h&hO!BVHL$U42EEd;?^Xa!Dw8&!?IFo4>Z0RxEGgEk(=Q|Y17G1kH| zLr%3BFlc(8Lhmz!~pL`^Vs7MF+cEMLUB^T>TA()wDG|L0t&z zMU?L@xBRs?sxVP|p*%i0g>n*urkF|Glg0U!Da zng<&N=!M8bS;@8nqVZ?KVz~Yu!?YjOi^1~E{r@B6v8?G#v-G+#n5M9zKB#M8R}8gQ z;4fu~LLNTkUI zjG6j5ZNEv(O7ITv=tecdx)*pB5UkeaE@A_#%HT%C+NJ?5$HHY{jup!vqMbbL)lX&| zkGt=d!2*FMe_;S(gxB8SJLvYk5LKGedCaOv7I=r|kV&^}(-RXEq@!CBki! z_B5)B&Dc|cFz4(ds#G=Wc+-_LwoYKtJ)M&nThlN{>>dorY0ZBkxJB@SG4@LN&FkO* zdbDvm?^Mt*2d7gYcl}e?t8HTL4KC?XGC2Dy`GG_3F^NNVQS~aYQ~Q-R;ic+wD@UAp zPqSYZzKInc({M^FiVx27$}acA_KfN5HR!^p>y zZ1k;QZf}32W%JYrM2a#>s$*>@$-dexgrH-|>h{NJ#Zs)1i)ZELS#~Xp%nD@KZYAU8 z!AgXggj0*dQ8rflet-@`tNY*};wzB5n{@*Y=$0kh7Jj>}!Ud&cPKzOtRLn6z*m0zF zk9cu+1mhrx>9a-)3T~tmp9pwGgbes1CO(i5CNilg*^(C%@~qurrn%tP1F>|3i>TCz za=)g|&hn{b<=|6#CVLF3A&a*Pj+M{ds6DRNw8Kv3NoT&r;X5cI9*=s6vBVRKG2bU*(VzgOj)LUCIza4BN; zAr$M!5~cV)ZZG2!#&bIVoRvQghYcQb;VrU5#RGI9WvyE%!--1qU@m~qR2#NM&-}-N zQE_9KHuQN<-vMNhe9rr?ozmwYTv#0%@kj59fm9r9Fm-v;y@qzq>12D*@JYAL)SP#RoinyWM$(tOO%cXwPgcGU^i-%e}vy`X{$1roW(B znEBu`HeEIy@(bIE%h9loRnYKYE%7~ZJXj26pg&-BG+E1#5F}Wn9Dy{rw<>pLoF8F&qlN4t5({Tm@a zHn_qF@IprQaOwMz3mkSym9va973S?_f5OSfy?ZD4w4@%GSNWSi|Y`Ipvyr{)H}((C3f8GtMp9#Tw|Z61t36m`*~?J&@tIaJ`;K z(QYL@IUztn8-!?#nWEHTX4g1TmGR&tPY-h8gM+Og+Y${^w~r&G@niBX{0JNd3*7;W z4E&q)SRz1PsTTQJJw*tV2$PxzQ>S3!%mM}kR0;p@8>rrtLka`{($rf*B1ukmfRjY> zKq-Z8zP8oHZtIWFBl!}Uw#vji$?fsAa7v;5Z8~tucwt^#wnrAB#7$* z3a6e$dkgjV9$*guRel9wKCfKL;+()~(%+@7d=dRx5(e_@hd~*4K^aO5=dz6+1?e>I z^>d;&piFfbB+>qJ2+q(&e@xmYNOp#YbW=o$@J=-0S}I;GVFepWv$Mv9fKHEow6`Eg zW@-SXmtn_6At9ZBoN51+2XGc?YL%K0TwDcNf& zWjl40NqR!Sc5tMYc2T5L1j&d)?yjtrf07p_x*-+E63rb!$M3nrrk4RkdF5^iR+aRa zpXV&oujsYVEK?`IMGatpwHCLDJ&8bIjse34i9$TqFwaeg8}#3cwFQ@`q>Yox$O;Tz zzr;fU0+_T7WJC%w0C!+`Ml>b~P-To;4x>_1us|OR|l&^$SRuYA4V}*!JnY8A`S%rFoG3(4~FPe_;4C zsJEjNJ*kej3*BQwF6VAF(KP+~cMe|!(sto8FJR$m!HQr-p}vl=_?`Pw8~@4+!HR&% z%P7#vbgYSy?I^v31bU{S_%R<#3zqmdSb{H(>f{h!BHY+gVjR)K5KO6Xed?M$Z!~4p z?veouxO~-LM`Z%+dG4?4reS_B3S$|*I755=9Qcb)_c3II8 zVE`ek=Fhr3f|3o-^{^lIQ63h!FsY>t#RNO{GqeKm%hK(xEcQg|JiRkgq-}pcIdO4H zm3m3YEM)qEM#^f`6o>Qvr~RtxT&aCqOOuKQxR|NhkN zn)eQ*TH|Y@d-15cl!)ysiudvXq5Ew7)Wwy%`-#T+;`hc~KIUQf+0^J06W?Qh zH(zVts$MeF%x_J!8n92K*#GImdqKFxrIlLv0ql53PZ=H0j4XW`XDL^#4NcE_?wAx4 z$CApqFeALDSXn%f-&sv2AMwEpn>8abrM(9>vMPx;XHVF!k&q&gfoaU1Dx(GlFa7PG-xdh8|hn*3BMW*Ar^3< znkjmjWYn-nwKA-mU~jk89BbJAn9q_xoE6vZh^ZbWPsCNsMVHB+iT$*Fy$cTslWDg| zX6ULt*Me4<42a(11#=8W95q>q(e?hx9B?XmK)(@hwdxEKV4qj>Qb+VyQv(<ZAO;b`W1z|2cc^H;ZlURayFCA<}TnwTTUi31^;RJg+r6rie zF9R#cwrH^S`X$grLo!`uZ-cUft;8*5C2Da9uP*OBwq?W~uA`~ys%(^t@C;3FlhoCb z9PPVTq|qxP&wPPMdFlsaLSN3Uz$E%2WToU$ALv^DPS>c^W=Rv%S3LJV<_K`y1aM~AX+<<72Q1OrB-tV19=1N&b&Gxh*Qbdg1A{9?dZ@6~ zSBZbWUQieh$O9Hudbp9q&J+@8W*RnqC>tVts^iH&k&a`G5pswJZ?>KaEry%uY?rGS zFR{pHEuYO90(J459DSlx8_xJcZ#}E3o1J*%-!O#|rCC2xL0= zm(tF_;2fXyDWtRqp6bHdza~bf%aWKq=?m@g0W7Jbj4G2RjuQ(`>F}l*trL&w;e$IW z#t}IEU1aa9#dCb=AmvMvY|5TA`*Y3;v>J+;vtw+^uKuj)%|sHze6ohHC$vbn-IVGy6rLQ$T7(9YJgN7x{3a=yf@M2U6c*2;XeSt zmDlrs5*ru^^#Q{QqRW9rCp}u~p1FZ7c;fpfwfz>dG(*x{p{pg@^#jj~FwGH{_F@z4 zjIsZ{jjWhCzhLfX>Pp}rJRCasG7@wg5L6kQMX>=*?b0Pah7Y_@zoWbjQZ<3^zpw@g z+x{(r^$+V4E(OU`E;i*WsMJ?{;6~&v-JaxDQa{^Esh4`BbpgWe#L&1n7#{=>8%RVT zAUxH7@0LV%8GOJ(sKwf0x?f@*$P}Z6w%pq_4+Mg!CHk(kh4)&Yn{{riamq4-i6LL4 z_F-KFbfcb8I8Cya{-x2~{jetniVT}nGI?-?sH}c4$+AYSzz>BwUu7?199XF2h|w+! z1lVDvQ~jjyx_0| zJb&-@?}Qp>JYL%|CwpkikT*xe|0>PAUq6(PKOj35^lbl>!aCz>bf0nomOy)3Nh%Yl zS%KOo3<3v$%Gzmkavo{PepWr79c|rjV4FDe-+LcT_GN}mUIn1HBQ7`7A72o*YMXMY zYF3Yx53*CxwrTnlBRf>3R0?%FIw+gfE{^mUuCO;3P#HPOgcrkaO1>0Td;3k$3no*E zmh07`VC9IpJ&;Z)d|1p2LSbhS4|+tME>+HNThanh*AFyVw+~MvN8H{Z2#BU14J)-% z#2!5OTGRHuOZfufUeK&gQ4vO&=JeDqu_mncH3W>5nO-NPir`VD-PnFo} z-Z%9`y;LFng&UDHMG*66p<3+=m$#wz(>Cw9Oy(2&lWiQayddsv2<$O36a#WVj1_i| z-WUPb#Eg5Y6T~x@YY#nPNTzQDEVNP!DnGr=XfUOP^FLh01^pI-KonH{5ri#1c(l^Y zjO7@}#UrV}KC(YIT>Gj1w)jV((OqENbj7G(2H4Ii$>U%N;GjJ$^eTp*u7~T-Daj5^ znE9K|v9PsrL2MS8Ikp`+3L{?1u%1ENjNbry&CJUYW>hVwwRRvOJ_7S=xdmm-C906Y z4owO>WaF@ZeO$zH5*s5W<$EUL3Crpf~ zDiMZWadMI1iWh+$z1RQd?V5l0%+Iw0=mj{;;` zds{m+Xh6CnIo->N$M0sFowQZm9_5X^%O1R_#%Djuo&Qh0(SNlSNxI{XxLhdj=%MoU zsp!3-lJX-FK-;7;wmKv>;T*wBs9x!}A%`9p+YEwvVydPEomq*c<%(tWswA@~1@s1= zABW>lgY!?Nf5z<$zC7yu9M*_&eT_Xj4pyE z(T-lp2qw7PYo_O*Ouc><0&{z!#Xyj1zICz&kldkE^J)4rAf0CgLU;C9_wXlWVwSns zLY?oC+lI!`GWeapY62AW1vxZ(VLXBLmkEV8J;1l~MGQc?ZBJslrut*v+Abdr*DtpW z0v{aA@MVeG>y`O>eQdV`tVast&tr!e9Sz0x1+(cU8*Jgm8$sB9+1L~YMDM4j`8AvM zi&*!^_m5Onb_w{?xG$egvvh9=#sGyhv*T=>N!t)w{H`_LBG;}684c_AJKrUoSKULF>@GerAPE%u-G@V88}MTEf| z{;m+wBN%8I4GK^_%126ePoz27%M;be=iSFb3oUOj3Ou#9WtRADD+_s!GOtL?Qg|h2 zxSl=S+Sg0BYX)FF3;ycq|1OR~m}zG{>k5?6^T)}m7K%QR-yJ;h^|^mXQ;5@8H{B%! zybd3}R5JzlD-kw-o$u$B5&m540{wuZ==6^Ycx_Tu7`hRZ`<;zIv`Hv!(+%1Bng)`I zX9+szt#S5q>P;E)ZL!ICqbkajF(5woVh#@Jja}xs2oVqnhJp2vHgL1!Mg5>3DIztT zEa3=Wj5k=L&7V{){F6$D9O1A$D~LIHMq#v4&|n&=ydLzmKQWK6Lgu8OpNDo)RQw*} zE@Emt9<{)U<;Of%S^QM=H4_LwMPB4oWzK2GV)q=^0aV%Ul6au=R(kJHj2JfuDr$D= z1!?v%8!&)7wP~H~yNd}qd%c*L85c=cCVB5F<+HD``8%2=3Q8ap+4r3-c!MER5|oDAnyG0aA5NwVvd0cpgfp$TJm^;T))ul*ODwLE|kZEvP+hN^v(crH8S`puEQ;Q*zl-La{S0mlc3119l@|q zHj*n+Q9(b7x2znfw53+0WP>WR=^EXOvn%fBd!}loMl1bvrtPDRK(E~Awe-DQa~A_$ zplvz#C#Bg?T_d!+0jZ?vHIogpD|zC5>|NnC^J;cmWrJ_ci!6rCuNr+Jc)ifCOX7gQ zpw0i3(#MX9YWS@b!*8YZrTo)LA3GDW;kQouAlOh`V?d#G{+CV+DVaI}R_7)dsD@Ve zjTm;y;A)JOgUeLxX#}}Jr$09zKK076=N-xkZyIl>y=@jImh;5BAlU9)V6H{G_z~v3 z;XU`PQ0HqP0YM8%mPb~Jww}H6Dpp3dVuglltsvj$T0>vMH~4m^Jh>uo zQu5M~d zm^RN0nBckk?0&N23^@NM1d|N~h3xlIl-y?kl@wpHOCirwQ1mtE;qVY)4BttbS&VNR{@bI3FvPa`0wK9vy0K2AYgoBCD z-;Jhhx)AD-thpsNTH@;~I0N>G{OVSG@&x><|LNeFT4}!v@b`zkT?s}DB;W2?eqTt-{r4H+SAvz6M@>hznl^u zYH6k&{5JnH=Vmf<@qQ8a?Dh)&!Tlx0nD_Rv605j+d&ci- z+gcaY8rw1|$8IMoLm>U|bRHI;y%mdGzYm*ytIs8RBR%e!00AR_evgRQ85Q&I-Mm)H zelyDtgpO*jK~pXHWd|+!CkJ$a@d$6V+j?6<0Bm>uq3ZIE!Kr)U>W_D0%1P)Oj!6lT zj^k{ud9y(Q#1VYaj7K>DCR;bwviwXJ^kj7Sqs<$ZKYt^d%S;y=Qo}Y5o&{lDu!i$d zJlLfh#rN8YzL`3f_^fKVU}i-q3_WSVA=XS9abIPsvRtkw8?Al&Azy@Sa|8Z4eF0^F zU+2}2NH#iwS`)7Mt|o&f-?YaEKNpidIo*?(ec$5EA6`6D|1@Rut*BE)oX49x`oFaV z29N^|0vzNP8<|VgL!CA;1r)9e_S@`LgKQc;7qfsThi*2`J%YO6PCJTU z{%=#i*cmhIw>Q61cw$alay6i0-vD(QR+-sISM8ZQKZ~)R1k3}iL?}1LiJoli*nGX_ zv7xG8+8Atd4x_wmx~)GLuV_E)lfyY$?<~CyEW*dPEWa&_lX7S4FFm}M{c9%Ie9549 z?wapfa-81Pkl3>iN>i&&C+Fq*6|F?6&&)hToDuIs0{~Br>oO2H_mQ~K53oPP+st{H zIWZ6U#L0c3ojmXRyXb$8;gRfc&8){u;TwzXlb3cc`)Y-^HWm6zQWzgG0vRp#aTBiG zN7_qA^she=xh`*-&T9(4tMa?&SS0FomSTVKQ05V?W#x&QRn?!L50!1!K;oN3&ql&< zY_;~OnC{SA(sQD7C;^_dWCh5QE9H2?IuNm5f;_2Wrt=7UoKM)&H$U6bE) zwW{&cw0B}+T@@o5=r3&~+XJF*s@k3~ykmN1b`oi8(vi`ql&adR*35%?c1O|=PzG+c zQJ&m>^;ces#<2utw;J~1mp1{o#)`w9h2ui23XZvzr(r~uZtTqOmk%PYAv~AHDf2O9 z>uMeBh&%;Nxd4rW$Ovz(_-dLv7qPDJ)f1|DX%+;JdJ`NkV0o(fI)G8c@KO5t1w|{< z8TDsn9K^z3Nb)GBEd-POK0SMyW)bQw%kxmWA%Vb~vdJfHyho8uoo{z(1h*a4;H?zT zKzpYq*7fa;9EiDLD(8rWx0Lg<3BO(^{-;zK2q+OLH3Qtf-dW$FURE0w1fcXU$SGPK z;O!R>9iBQuM1DXLM)E*gX_VB^JS|Lnp@*mXMQj>HxUZ%2#1u1Mocp@8#ZS0eiLCtV z>Q6VfH+KrjTS^;Y%(X!3Ed0KUrRc4?dO>6V1>fY6cpf}>sNHpC(%8|{(ouizamRxn zm!bmZecECo>DpMS^7BjwAi8h++xyKrchQoS2gM_ZR%~Sqbl8BM{-L7VJ**!M0 z7)me8$VF50aSVb`HlMjD)sr$9G{{nf=nswf;X9kf9Sk{{BSA|sg*x^?LD2LJ9!r-% zFXnuWJZS*CHb|%TiJJX(e%IQB9eX#2;kawjS+3| zUpZsQK4-0-P?0hfxVZKRDq}>0!lo+H`j#(3PS|uU8}(UgdH24+Q;wJ2#^}r2sdG9Z zeW>T%%l`6-Q^w)y$@~3{gKIb60Xy!;)Z*^*&8L|!H=zPyss%+Cnu)qXO!jlFib6dJ zE|=FQmWX~uBp7o^rpH-MQtNJ z56SA<=*?ixRhF0isy`;4SXdutDaOw0@p`!g(cnl>)sS!kLcI(HP~( z&<9p-zTBA!pzpX&@XSPi`n4KRwK=9kqN;_hf-(2^3BqgR0*leEPYQJ%G>Ib0YzwdL z)Tw1kx_p>idF%#O*|Hp6*)o+)+3{y!k{1DWGmreQGh;urXx{zuG>hFJPg8*#T1kuC*;4h$KSwOw0T#}Gbt#NO`aUELp$_6Mj zvh$DEJW}O-s}}^_!1WzWnf0az1)oit6~l*ZcxZnPrrmy3hBeE_fQNUOAK zc7X+YA0{C|&~HG|R139I#xO2FoJI3alXV8mdvnaT+1Sc~H{ zPqKt(p236jZe?JE_BGG~hN`K-qPG>HaJq|;SbZgk&EIo`xL7|0iOs#mzZ>!2-2X

jwStDrFsB0NXy10d@rpQqu9xu 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

MOn`YOkwevAuJ|C&1 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 delta 46324 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 KE3iRwp#Bfs-I%ig diff --git a/testing/PIMS.Tests.Automation/Features/AcquisitionFiles.feature b/testing/PIMS.Tests.Automation/Features/AcquisitionFiles.feature index b3794928b9..05ad683e86 100644 --- a/testing/PIMS.Tests.Automation/Features/AcquisitionFiles.feature +++ b/testing/PIMS.Tests.Automation/Features/AcquisitionFiles.feature @@ -75,5 +75,5 @@ Scenario: 11. Acquisition File from Pin Then A new Acquisition file is created successfully Scenario: 12. Acquisition Files List View - Given I search for an existing Acquisition File from row number 1 + Given I search for an existing Acquisition File from row number 2 Then Expected Acquisition File Content is displayed on Acquisition File Table diff --git a/testing/PIMS.Tests.Automation/Features/AcquisitionFiles.feature.cs b/testing/PIMS.Tests.Automation/Features/AcquisitionFiles.feature.cs index 4e5037c0ac..3aa92bfcac 100644 --- a/testing/PIMS.Tests.Automation/Features/AcquisitionFiles.feature.cs +++ b/testing/PIMS.Tests.Automation/Features/AcquisitionFiles.feature.cs @@ -490,7 +490,7 @@ public void _12_AcquisitionFilesListView() { this.ScenarioStart(); #line 78 - testRunner.Given("I search for an existing Acquisition File from row number 1", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); + testRunner.Given("I search for an existing Acquisition File from row number 2", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line hidden #line 79 testRunner.Then("Expected Acquisition File Content is displayed on Acquisition File Table", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); diff --git a/testing/PIMS.Tests.Automation/Features/AdminTools.feature b/testing/PIMS.Tests.Automation/Features/AdminTools.feature index 23148711a4..248a1a778b 100644 --- a/testing/PIMS.Tests.Automation/Features/AdminTools.feature +++ b/testing/PIMS.Tests.Automation/Features/AdminTools.feature @@ -23,3 +23,7 @@ Scenario: 04. Financial Codes Scenario: 05. Duplicate existing Financial Code Given I attempt to duplicate a Financial Code from row number 1 Then Financial Code cannot be duplicated successfully + +Scenario: 06. Financial Codes List View + Given I search for an existing Financial Code from row number 1 + Then Financial Codes rendered successfully diff --git a/testing/PIMS.Tests.Automation/Features/AdminTools.feature.cs b/testing/PIMS.Tests.Automation/Features/AdminTools.feature.cs index a3b6e0f3e9..cb5fbe3c06 100644 --- a/testing/PIMS.Tests.Automation/Features/AdminTools.feature.cs +++ b/testing/PIMS.Tests.Automation/Features/AdminTools.feature.cs @@ -225,6 +225,34 @@ public void _05_DuplicateExistingFinancialCode() this.ScenarioCleanup(); } + [Xunit.SkippableFactAttribute(DisplayName="06. Financial Codes List View")] + [Xunit.TraitAttribute("FeatureTitle", "AdminTools")] + [Xunit.TraitAttribute("Description", "06. Financial Codes List View")] + public void _06_FinancialCodesListView() + { + string[] tagsOfScenario = ((string[])(null)); + System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("06. Financial Codes List View", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 27 +this.ScenarioInitialize(scenarioInfo); +#line hidden + if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 28 + testRunner.Given("I search for an existing Financial Code from row number 1", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 29 + testRunner.Then("Financial Codes rendered successfully", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + } + this.ScenarioCleanup(); + } + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "3.9.0.0")] [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class FixtureData : System.IDisposable diff --git a/testing/PIMS.Tests.Automation/Features/Projects.feature b/testing/PIMS.Tests.Automation/Features/Projects.feature index 1bdf306dd3..3862728ab0 100644 --- a/testing/PIMS.Tests.Automation/Features/Projects.feature +++ b/testing/PIMS.Tests.Automation/Features/Projects.feature @@ -1,25 +1,36 @@ @Regression-Projects Feature: Projects -Scenario Outline: Create new Projects +Scenario Outline: Type of Projects Given I create a new Project from row number - When I verify The Project View Form - And I create Digital Documents for a "Project" row number - And I search for an existing project - Then Expected Content is displayed on Projects Table + Then A new Project is created successfully Examples: - | RowNumber | DocRowNumber | - | 1 | 8 | - | 2 | 9 | - | 3 | 10 | - | 4 | 11 | + | RowNumber | + | 1 | + | 2 | + | 3 | -Scenario: Update Project - Given I update an existing project from row number 5 - When I edit a Digital Document for a "Project" from row number 12 - And I navigate back to Project Details - Then The Project is updated successfully +Scenario: 01. Project Details + Given I create a new Project from row number 4 + When I update an existing project from row number 5 + Then A new Project is created successfully -Scenario: Duplicate Project - Given I create a new Project from row number 1 - Then Duplicate Project Alert is displayed +Scenario: 02. Project Documents + Given I create a new Project from row number 6 + When I create Digital Documents for a "Project" row number 8 + And I edit a Digital Document for a "Project" from row number 9 + Then A new Project is created successfully + +Scenario: 03. Project Notes + Given I create a new Project from row number 7 + When I create a new Note on the Notes Tab from row number 6 + And I edit a Note on the Notes Tab from row number 7 + Then A new Project is created successfully + +Scenario: 04. Project List View + Given I search for existing Projects from row number 2 + Then Expected Project Content is displayed on Projects Table + +#Scenario: Duplicate Project +# Given I create a new Project from row number 2 +# Then Duplicate Project Alert is displayed diff --git a/testing/PIMS.Tests.Automation/Features/Projects.feature.cs b/testing/PIMS.Tests.Automation/Features/Projects.feature.cs index eb792b06bd..d0d339e6b3 100644 --- a/testing/PIMS.Tests.Automation/Features/Projects.feature.cs +++ b/testing/PIMS.Tests.Automation/Features/Projects.feature.cs @@ -82,20 +82,18 @@ void System.IDisposable.Dispose() this.TestTearDown(); } - [Xunit.SkippableTheoryAttribute(DisplayName="Create new Projects")] + [Xunit.SkippableTheoryAttribute(DisplayName="Type of Projects")] [Xunit.TraitAttribute("FeatureTitle", "Projects")] - [Xunit.TraitAttribute("Description", "Create new Projects")] - [Xunit.InlineDataAttribute("1", "8", new string[0])] - [Xunit.InlineDataAttribute("2", "9", new string[0])] - [Xunit.InlineDataAttribute("3", "10", new string[0])] - [Xunit.InlineDataAttribute("4", "11", new string[0])] - public void CreateNewProjects(string rowNumber, string docRowNumber, string[] exampleTags) + [Xunit.TraitAttribute("Description", "Type of Projects")] + [Xunit.InlineDataAttribute("1", new string[0])] + [Xunit.InlineDataAttribute("2", new string[0])] + [Xunit.InlineDataAttribute("3", new string[0])] + public void TypeOfProjects(string rowNumber, string[] exampleTags) { string[] tagsOfScenario = exampleTags; System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); argumentsOfScenario.Add("RowNumber", rowNumber); - argumentsOfScenario.Add("DocRowNumber", docRowNumber); - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Create new Projects", null, tagsOfScenario, argumentsOfScenario, featureTags); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Type of Projects", null, tagsOfScenario, argumentsOfScenario, featureTags); #line 4 this.ScenarioInitialize(scenarioInfo); #line hidden @@ -110,30 +108,52 @@ public void CreateNewProjects(string rowNumber, string docRowNumber, string[] ex testRunner.Given(string.Format("I create a new Project from row number {0}", rowNumber), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line hidden #line 6 - testRunner.When("I verify The Project View Form", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); + testRunner.Then("A new Project is created successfully", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden -#line 7 - testRunner.And(string.Format("I create Digital Documents for a \"Project\" row number {0}", docRowNumber), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + } + this.ScenarioCleanup(); + } + + [Xunit.SkippableFactAttribute(DisplayName="01. Project Details")] + [Xunit.TraitAttribute("FeatureTitle", "Projects")] + [Xunit.TraitAttribute("Description", "01. Project Details")] + public void _01_ProjectDetails() + { + string[] tagsOfScenario = ((string[])(null)); + System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("01. Project Details", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 13 +this.ScenarioInitialize(scenarioInfo); #line hidden -#line 8 - testRunner.And("I search for an existing project", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 14 + testRunner.Given("I create a new Project from row number 4", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 15 + testRunner.When("I update an existing project from row number 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden -#line 9 - testRunner.Then("Expected Content is displayed on Projects Table", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line 16 + testRunner.Then("A new Project is created successfully", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden } this.ScenarioCleanup(); } - [Xunit.SkippableFactAttribute(DisplayName="Update Project")] + [Xunit.SkippableFactAttribute(DisplayName="02. Project Documents")] [Xunit.TraitAttribute("FeatureTitle", "Projects")] - [Xunit.TraitAttribute("Description", "Update Project")] - public void UpdateProject() + [Xunit.TraitAttribute("Description", "02. Project Documents")] + public void _02_ProjectDocuments() { string[] tagsOfScenario = ((string[])(null)); System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Update Project", null, tagsOfScenario, argumentsOfScenario, featureTags); -#line 17 + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("02. Project Documents", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 18 this.ScenarioInitialize(scenarioInfo); #line hidden if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) @@ -143,31 +163,31 @@ public void UpdateProject() else { this.ScenarioStart(); -#line 18 - testRunner.Given("I update an existing project from row number 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); -#line hidden #line 19 - testRunner.When("I edit a Digital Document for a \"Project\" from row number 12", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); + testRunner.Given("I create a new Project from row number 6", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line hidden #line 20 - testRunner.And("I navigate back to Project Details", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.When("I create Digital Documents for a \"Project\" row number 8", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden #line 21 - testRunner.Then("The Project is updated successfully", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); + testRunner.And("I edit a Digital Document for a \"Project\" from row number 9", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 22 + testRunner.Then("A new Project is created successfully", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden } this.ScenarioCleanup(); } - [Xunit.SkippableFactAttribute(DisplayName="Duplicate Project")] + [Xunit.SkippableFactAttribute(DisplayName="03. Project Notes")] [Xunit.TraitAttribute("FeatureTitle", "Projects")] - [Xunit.TraitAttribute("Description", "Duplicate Project")] - public void DuplicateProject() + [Xunit.TraitAttribute("Description", "03. Project Notes")] + public void _03_ProjectNotes() { string[] tagsOfScenario = ((string[])(null)); System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Duplicate Project", null, tagsOfScenario, argumentsOfScenario, featureTags); -#line 23 + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("03. Project Notes", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 24 this.ScenarioInitialize(scenarioInfo); #line hidden if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) @@ -177,11 +197,45 @@ public void DuplicateProject() else { this.ScenarioStart(); -#line 24 - testRunner.Given("I create a new Project from row number 1", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); -#line hidden #line 25 - testRunner.Then("Duplicate Project Alert is displayed", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); + testRunner.Given("I create a new Project from row number 7", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 26 + testRunner.When("I create a new Note on the Notes Tab from row number 6", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 27 + testRunner.And("I edit a Note on the Notes Tab from row number 7", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 28 + testRunner.Then("A new Project is created successfully", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + } + this.ScenarioCleanup(); + } + + [Xunit.SkippableFactAttribute(DisplayName="04. Project List View")] + [Xunit.TraitAttribute("FeatureTitle", "Projects")] + [Xunit.TraitAttribute("Description", "04. Project List View")] + public void _04_ProjectListView() + { + string[] tagsOfScenario = ((string[])(null)); + System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("04. Project List View", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 30 +this.ScenarioInitialize(scenarioInfo); +#line hidden + if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 31 + testRunner.Given("I search for existing Projects from row number 2", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 32 + testRunner.Then("Expected Project Content is displayed on Projects Table", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden } this.ScenarioCleanup(); diff --git a/testing/PIMS.Tests.Automation/Features/ResearchFiles.feature b/testing/PIMS.Tests.Automation/Features/ResearchFiles.feature index ebcae9e062..12e0461795 100644 --- a/testing/PIMS.Tests.Automation/Features/ResearchFiles.feature +++ b/testing/PIMS.Tests.Automation/Features/ResearchFiles.feature @@ -17,7 +17,8 @@ Scenario: 02. Research File Properties Scenario: 03. Research File Documents Given I create a basic Research File from row number 3 - When I create Digital Documents for a "Research File" row number 3 + When I create Digital Documents for a "Research File" row number 3 + And I edit a Digital Document for a "Research File" from row number 6 Then A new Research File is created successfully Scenario: 04. Research File Notes diff --git a/testing/PIMS.Tests.Automation/Features/ResearchFiles.feature.cs b/testing/PIMS.Tests.Automation/Features/ResearchFiles.feature.cs index 332c2a2fa4..7d3eafd420 100644 --- a/testing/PIMS.Tests.Automation/Features/ResearchFiles.feature.cs +++ b/testing/PIMS.Tests.Automation/Features/ResearchFiles.feature.cs @@ -175,6 +175,9 @@ public void _03_ResearchFileDocuments() testRunner.When("I create Digital Documents for a \"Research File\" row number 3", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden #line 21 + testRunner.And("I edit a Digital Document for a \"Research File\" from row number 6", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 22 testRunner.Then("A new Research File is created successfully", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden } @@ -189,7 +192,7 @@ public void _04_ResearchFileNotes() string[] tagsOfScenario = ((string[])(null)); System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("04. Research File Notes", null, tagsOfScenario, argumentsOfScenario, featureTags); -#line 23 +#line 24 this.ScenarioInitialize(scenarioInfo); #line hidden if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) @@ -199,16 +202,16 @@ public void _04_ResearchFileNotes() else { this.ScenarioStart(); -#line 24 +#line 25 testRunner.Given("I create a basic Research File from row number 1", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line hidden -#line 25 +#line 26 testRunner.When("I create a new Note on the Notes Tab from row number 1", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden -#line 26 +#line 27 testRunner.And("I edit a Note on the Notes Tab from row number 2", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden -#line 27 +#line 28 testRunner.Then("Notes update have been done successfully", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden } @@ -223,7 +226,7 @@ public void _05_ResearchFileFromPin() string[] tagsOfScenario = ((string[])(null)); System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("05. Research File from pin", null, tagsOfScenario, argumentsOfScenario, featureTags); -#line 29 +#line 30 this.ScenarioInitialize(scenarioInfo); #line hidden if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) @@ -233,10 +236,10 @@ public void _05_ResearchFileFromPin() else { this.ScenarioStart(); -#line 30 +#line 31 testRunner.Given("I create a Research File from a pin on map and from row number 6", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line hidden -#line 31 +#line 32 testRunner.Then("A new Research File is created successfully", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden } @@ -251,7 +254,7 @@ public void _06_ResearchFileListView() string[] tagsOfScenario = ((string[])(null)); System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("06. Research File List View", null, tagsOfScenario, argumentsOfScenario, featureTags); -#line 33 +#line 34 this.ScenarioInitialize(scenarioInfo); #line hidden if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) @@ -261,10 +264,10 @@ public void _06_ResearchFileListView() else { this.ScenarioStart(); -#line 34 +#line 35 testRunner.Given("I search for Research Files from row number 8", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line hidden -#line 35 +#line 36 testRunner.Then("Research File Properties remain unchanged", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden } diff --git a/testing/PIMS.Tests.Automation/PageObjects/AcquisitionFilesDetails.cs b/testing/PIMS.Tests.Automation/PageObjects/AcquisitionFilesDetails.cs index 5d5e4e1ae4..a8eb921edf 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/AcquisitionFilesDetails.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/AcquisitionFilesDetails.cs @@ -9,7 +9,7 @@ namespace PIMS.Tests.Automation.PageObjects public class AcquisitionFilesDetails : PageObjectBase { //Acquisition Files Menu Elements - private By menuAcquisitionButton = By.XPath("//a/label[contains(text(),'Acquisition')]/parent::a"); + private By menuAcquisitionButton = By.CssSelector("div[data-testid='nav-tooltip-acquisition'] a"); private By createAcquisitionFileButton = By.XPath("//a[contains(text(),'Create an Acquisition File')]"); private By acquisitionFileSummaryBttn = By.XPath("//div[contains(text(),'File Summary')]"); @@ -72,17 +72,19 @@ public class AcquisitionFilesDetails : PageObjectBase private By acquisitionFileOwnerSubtitle = By.XPath("//div[contains(text(),'Owner Information')]"); - //Acquisition File Main Form Input Elements private By acquisitionFileMainFormDiv = By.XPath("//h1[contains(text(),'Create Acquisition File')]/parent::div/parent::div/parent::div/parent::div"); private By acquisitionFileDeliveryDateInput = By.Id("datepicker-deliveryDate"); private By acquisitionFileCompletedDateInput = By.Id("datepicker-completionDate"); + private By acquisitionFileNameInput = By.Id("input-fileName"); + private By acquisitionFileNameInvalidMessage = By.XPath("//div[contains(text(),'Acquisition file name must be at most 500 characters')]"); + private By acquisitionFileHistoricalNumberLabel = By.XPath("//label[contains(text(),'Historical file number')]"); private By acquisitionFileHistoricalNumberInput = By.Id("input-legacyFileNumber"); + private By acquisitionFileHistoricalInvalidMessage = By.XPath("//div[contains(text(),'Legacy file number must be at most 18 characters')]"); private By acquisitionFileHistoricalNumberTooltip = By.XPath("//label[contains(text(),'Historical file number')]/span/span[@data-testid='tooltip-icon-section-field-tooltip']"); - private By acquisitionFileNameInput = By.Id("input-fileName"); private By acquisitionFilePhysicalStatusSelect = By.Id("input-acquisitionPhysFileStatusType"); private By acquisitionFileDetailsTypeSelect = By.Id("input-acquisitionType"); private By acquisitionFileDetailsRegionSelect = By.Id("input-region"); @@ -90,6 +92,8 @@ public class AcquisitionFilesDetails : PageObjectBase private By acquisitionFileAddAnotherMemberLink = By.CssSelector("button[data-testid='add-team-member']"); private By acquisitionFileTeamMembersGroup = By.XPath("//div[contains(text(),'Acquisition Team')]/parent::div/parent::h2/following-sibling::div/div[@class='py-3 row']"); private By acquisitionFileTeamFirstMemberDeleteBttn = By.XPath("//div[contains(text(),'Acquisition Team')]/parent::div/parent::h2/following-sibling::div/div[@class='py-3 row'][1]/div[3]/button"); + private By acquisitionFileTeamInvalidTeamMemberMessage = By.XPath("//div[contains(text(),'Select a team member')]"); + private By acquisitionFileTeamInvalidProfileMessage = By.XPath("//div[contains(text(),'Select a profile')]"); private By acquisitionFileCreateOwnerSubtitle = By.XPath("//div[contains(text(),'Owners')]"); private By acquisitionFileOwnerInfo = By.XPath("//p[contains(text(),'Each property in this file should be owned by the owner(s) in this section')]"); @@ -646,10 +650,15 @@ public void VerifyAcquisitionFileCreate() AssertTrueIsDisplayed(acquisitionFileDetailsMOTIRegionLabel); AssertTrueIsDisplayed(acquisitionFileDetailsRegionSelect); + VerifyMaximumFields(); + //Team members AssertTrueIsDisplayed(acquisitionFileTeamSubtitle); AssertTrueIsDisplayed(acquisitionFileAddAnotherMemberLink); + VerifyRequiredTeamMemberMessages(); + DeleteFirstStaffMember(); + //Owners AssertTrueIsDisplayed(acquisitionFileCreateOwnerSubtitle); AssertTrueIsDisplayed(acquisitionFileOwnerInfo); @@ -758,5 +767,37 @@ private void DeleteOwner() sharedModals.ModalClickOKBttn(); } + + private void VerifyRequiredTeamMemberMessages() + { + //Add a new Team member form + WaitUntilClickable(acquisitionFileAddAnotherMemberLink); + webDriver.FindElement(acquisitionFileAddAnotherMemberLink).Click(); + + //Verify that invalid team member message is displayed + ChooseSpecificSelectOption(By.Id("input-team.0.contactTypeCode"), "Expropriation agent"); + AssertTrueIsDisplayed(acquisitionFileTeamInvalidTeamMemberMessage); + + //verify that invalid profile message is displayed + ChooseSpecificSelectOption(By.Id("input-team.0.contactTypeCode"), "Select profile..."); + webDriver.FindElement(By.CssSelector("div[data-testid='contact-input'] button[title='Select Contact']")).Click(); + sharedSelectContact.SelectContact("Test", ""); + AssertTrueIsDisplayed(acquisitionFileTeamInvalidProfileMessage); + } + + private void VerifyMaximumFields() + { + //Verify File Name Input + webDriver.FindElement(acquisitionFileNameInput).SendKeys("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus"); + webDriver.FindElement(acquisitionFileDetailsNameLabel).Click(); + AssertTrueIsDisplayed(acquisitionFileNameInvalidMessage); + ClearInput(acquisitionFileNameInput); + + //Verify Historical File Number Input + webDriver.FindElement(acquisitionFileHistoricalNumberInput).SendKeys("Lorem ipsum dolor s"); + webDriver.FindElement(acquisitionFileHistoricalNumberLabel).Click(); + AssertTrueIsDisplayed(acquisitionFileHistoricalInvalidMessage); + ClearInput(acquisitionFileHistoricalNumberInput); + } } } diff --git a/testing/PIMS.Tests.Automation/PageObjects/AcquisitionTakes.cs b/testing/PIMS.Tests.Automation/PageObjects/AcquisitionTakes.cs index 85b72c61c6..d2f5b300a2 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/AcquisitionTakes.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/AcquisitionTakes.cs @@ -29,17 +29,19 @@ public class AcquisitionTakes : PageObjectBase private By takeDescriptionLabel = By.XPath("//label[contains(text(),'Description of this Take')]"); private By take1DescriptionInput = By.Id("input-takes.0.description"); private By takeAreaSubtitle = By.XPath("//h2/div/div[contains(text(),'Area')]"); - private By takeRightOfWayLabel = By.XPath("//label[contains(text(),'Is there a new right of way?')]"); - private By takeRightOfWayRadioBttnGroup = By.CssSelector("input[name='takes.0.isNewRightOfWay']"); - private By takeSRWLabel = By.XPath("//label[contains(text(),'Is there a Statutory Right of Way: (SRW)?')]"); - private By takeSRWRadioBttnGroup = By.CssSelector("input[name='takes.0.isStatutoryRightOfWay']"); - private By takeLandActLabel = By.XPath("//label[contains(text(),'Is there Land Act-Reserve(s)/Withdrawal(s)/Notation(s)?')]"); - private By takeLandActRadioBttnGroup = By.CssSelector("input[name='takes.0.isLandAct']"); - private By takeLicenseConstructLabel = By.XPath("//label[contains(text(),'Is there a License to Construct (LTC)?')]"); - private By takeLicenseConstructRadioBttnGroup = By.CssSelector("input[name='takes.0.isLicenseToConstruct']"); + private By takeRightOfWayLabel = By.XPath("//label[contains(text(),'Is there a new highway dedication?')]"); + private By takeRightOfWayRadioBttnGroup = By.CssSelector("input[name='takes.0.isNewHighwayDedication']"); + private By takeMOTIInventoryLabel = By.XPath("//label[contains(text(),'Is this being acquired for MoTI inventory? *')]"); + private By takeMOTIInventoryBttnGroup = By.CssSelector("input[name='takes.0.isAcquiredForInventory']"); + private By takeSRWLabel = By.XPath("//label[contains(text(),'Is there a new registered interest in land (SRW, Easement or Covenant)?')]"); + private By takeSRWRadioBttnGroup = By.CssSelector("input[name='takes.0.isNewInterestInSrw']"); + private By takeLandActLabel = By.XPath("//label[contains(text(),'Is a there a new Land Act tenure?')]"); + private By takeLandActRadioBttnGroup = By.CssSelector("input[name='takes.0.isNewLandAct']"); + private By takeLicenseConstructLabel = By.XPath("//label[contains(text(),'Is there a new License for Construction Access (TLCA/LTC)?')]"); + private By takeLicenseConstructRadioBttnGroup = By.CssSelector("input[name='takes.0.isNewLicenseToConstruct']"); private By takeSurplusSubtitle = By.XPath("//h2/div/div[contains(text(),'Surplus')]"); private By takeSurplusLabel = By.XPath("//label[contains(text(),'Is there a Surplus?')]"); - private By takeSurplusRadioBttnGroup = By.CssSelector("input[name='takes.0.isSurplus']"); + private By takeSurplusRadioBttnGroup = By.CssSelector("input[name='takes.0.isThereSurplus']"); private By createTakeBttn = By.XPath("//div/div/div[2]/div/div/div[3]/div/div/div/div/div/button"); @@ -105,8 +107,8 @@ public void InsertTake(Take take) } //Areas - //New Right of Way - ChooseSpecificRadioButton(By.Name("takes."+ index +".isNewRightOfWay"), take.IsNewRightWay); + //New Highway Dedication + ChooseSpecificRadioButton(By.Name("takes."+ index +".isNewHighwayDedication"), take.IsNewHighwayDedication); Wait(); if (webDriver.FindElements(acquisitionFileConfirmationModal).Count() > 0) @@ -117,18 +119,21 @@ public void InsertTake(Take take) sharedModals.ModalClickOKBttn(); } - if (take.IsNewRightWay.Equals("true") && take.IsNewRightWayArea != "") + if (take.IsNewHighwayDedication.Equals("true") && take.IsNewHighwayDedicationArea != "") { - ClearDigitsInput(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewrightofway-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")); - webDriver.FindElement(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewrightofway-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")).SendKeys(take.IsNewRightWayArea); + ClearDigitsInput(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewhighwaydedication-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")); + webDriver.FindElement(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewhighwaydedication-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")).SendKeys(take.IsNewHighwayDedicationArea); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewrightofway-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-hectares']"), TransformSqMtToHectares(take.IsNewRightWayArea)); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewrightofway-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-feet']"), TransformSqMtToSqFt(take.IsNewRightWayArea)); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewrightofway-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-acres']"), TransformSqMtToAcres(take.IsNewRightWayArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewhighwaydedication-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-hectares']"), TransformSqMtToHectares(take.IsNewHighwayDedicationArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewhighwaydedication-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-feet']"), TransformSqMtToSqFt(take.IsNewHighwayDedicationArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewhighwaydedication-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-acres']"), TransformSqMtToAcres(take.IsNewHighwayDedicationArea)); } - //Statutory Right of Way - ChooseSpecificRadioButton(By.Name("takes."+ index +".isStatutoryRightOfWay"), take.IsStatutoryRightWay); + //MOTI Inventory + ChooseSpecificRadioButton(By.Name("takes."+ index +".isAcquiredForInventory"), take.IsMotiInventory); + + //New Registered Interest in Land + ChooseSpecificRadioButton(By.Name("takes."+ index +".isNewInterestInSrw"), take.IsNewInterestLand); Wait(); if (webDriver.FindElements(acquisitionFileConfirmationModal).Count() > 0) @@ -139,18 +144,18 @@ public void InsertTake(Take take) sharedModals.ModalClickOKBttn(); } - if (take.IsStatutoryRightWay.Equals("true") && take.IsStatutoryRightWayArea != "") + if (take.IsNewInterestLand.Equals("true") && take.IsNewInterestLandArea != "") { - ClearDigitsInput(By.XPath("//input[@data-testid='radio-takes."+ index +".isstatutoryrightofway-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")); - webDriver.FindElement(By.XPath("//input[@data-testid='radio-takes."+ index +".isstatutoryrightofway-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")).SendKeys(take.IsStatutoryRightWayArea); + ClearDigitsInput(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewinterestinsrw-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")); + webDriver.FindElement(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewinterestinsrw-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")).SendKeys(take.IsNewInterestLandArea); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isstatutoryrightofway-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-hectares']"), TransformSqMtToHectares(take.IsStatutoryRightWayArea)); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isstatutoryrightofway-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-feet']"), TransformSqMtToSqFt(take.IsStatutoryRightWayArea)); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isstatutoryrightofway-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-acres']"), TransformSqMtToAcres(take.IsStatutoryRightWayArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewinterestinsrw-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-hectares']"), TransformSqMtToHectares(take.IsNewInterestLandArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewinterestinsrw-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-feet']"), TransformSqMtToSqFt(take.IsNewInterestLandArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewinterestinsrw-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-acres']"), TransformSqMtToAcres(take.IsNewInterestLandArea)); } - //Land Act-Reserve - ChooseSpecificRadioButton(By.Name("takes."+ index +".isLandAct"), take.IsLandNotation); + //Land Act Tenure + ChooseSpecificRadioButton(By.Name("takes."+ index +".isNewLandAct"), take.IsLandActTenure); Wait(); if (webDriver.FindElements(acquisitionFileConfirmationModal).Count() > 0) @@ -161,27 +166,27 @@ public void InsertTake(Take take) sharedModals.ModalClickOKBttn(); } - if (take.IsLandNotation.Equals("true")) + if (take.IsLandActTenure.Equals("true")) { - ChooseSpecificSelectOption(By.Id("input-takes."+ index +".landActTypeCode"), take.IsLandNotationDetail); + ChooseSpecificSelectOption(By.Id("input-takes."+ index +".landActTypeCode"), take.IsLandActTenureDetail); - if (take.IsLandNotationArea != "") + if (take.IsLandActTenureArea != "") { - ClearDigitsInput(By.XPath("//input[@data-testid='radio-takes."+ index +".islandact-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")); - webDriver.FindElement(By.XPath("//input[@data-testid='radio-takes."+ index +".islandact-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")).SendKeys(take.IsLandNotationArea); + ClearDigitsInput(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewlandact-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")); + webDriver.FindElement(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewlandact-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")).SendKeys(take.IsLandActTenureArea); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".islandact-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-hectares']"), TransformSqMtToHectares(take.IsLandNotationArea)); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".islandact-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-feet']"), TransformSqMtToSqFt(take.IsLandNotationArea)); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".islandact-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-acres']"), TransformSqMtToAcres(take.IsLandNotationArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewlandact-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-hectares']"), TransformSqMtToHectares(take.IsLandActTenureArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewlandact-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-feet']"), TransformSqMtToSqFt(take.IsLandActTenureArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewlandact-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-acres']"), TransformSqMtToAcres(take.IsLandActTenureArea)); } ClearInput(By.Id("datepicker-takes."+ index +".landActEndDt")); - webDriver.FindElement(By.Id("datepicker-takes."+ index +".landActEndDt")).SendKeys(take.IsLandNotationDate); + webDriver.FindElement(By.Id("datepicker-takes."+ index +".landActEndDt")).SendKeys(take.IsLandActTenureDate); webDriver.FindElement(By.Id("datepicker-takes."+ index +".landActEndDt")).SendKeys(Keys.Enter); } //License to Construct - ChooseSpecificRadioButton(By.Name("takes."+ index +".isLicenseToConstruct"), take.IsLicenseConstruct); + ChooseSpecificRadioButton(By.Name("takes."+ index +".isNewLicenseToConstruct"), take.IsLicenseConstruct); Wait(); if (webDriver.FindElements(acquisitionFileConfirmationModal).Count() > 0) @@ -196,12 +201,12 @@ public void InsertTake(Take take) { if (take.IsLicenseConstructArea != "") { - ClearDigitsInput(By.XPath("//input[@data-testid='radio-takes."+ index +".islicensetoconstruct-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")); - webDriver.FindElement(By.XPath("//input[@data-testid='radio-takes."+ index +".islicensetoconstruct-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")).SendKeys(take.IsLicenseConstructArea); + ClearDigitsInput(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewlicensetoconstruct-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")); + webDriver.FindElement(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewlicensetoconstruct-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")).SendKeys(take.IsLicenseConstructArea); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".islicensetoconstruct-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-hectares']"), TransformSqMtToHectares(take.IsLicenseConstructArea)); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".islicensetoconstruct-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-feet']"), TransformSqMtToSqFt(take.IsLicenseConstructArea)); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".islicensetoconstruct-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-acres']"), TransformSqMtToAcres(take.IsLicenseConstructArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewlicensetoconstruct-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-hectares']"), TransformSqMtToHectares(take.IsLicenseConstructArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewlicensetoconstruct-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-feet']"), TransformSqMtToSqFt(take.IsLicenseConstructArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".isnewlicensetoconstruct-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-acres']"), TransformSqMtToAcres(take.IsLicenseConstructArea)); } ClearInput(By.Id("datepicker-takes."+ index +".ltcEndDt")); @@ -210,7 +215,7 @@ public void InsertTake(Take take) } //Surplus - ChooseSpecificRadioButton(By.Name("takes."+ index +".isSurplus"), take.IsSurplus); + ChooseSpecificRadioButton(By.Name("takes."+ index +".isThereSurplus"), take.IsSurplus); Wait(); if (webDriver.FindElements(acquisitionFileConfirmationModal).Count() > 0) @@ -223,12 +228,12 @@ public void InsertTake(Take take) if (take.IsSurplus.Equals("true") && take.IsSurplusArea != "") { - ClearDigitsInput(By.XPath("//input[@data-testid='radio-takes."+ index +".issurplus-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")); - webDriver.FindElement(By.XPath("//input[@data-testid='radio-takes."+ index +".issurplus-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")).SendKeys(take.IsSurplusArea); + ClearDigitsInput(By.XPath("//input[@data-testid='radio-takes."+ index +".istheresurplus-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")); + webDriver.FindElement(By.XPath("//input[@data-testid='radio-takes."+ index +".istheresurplus-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-meters']")).SendKeys(take.IsSurplusArea); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".issurplus-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-hectares']"), TransformSqMtToHectares(take.IsSurplusArea)); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".issurplus-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-feet']"), TransformSqMtToSqFt(take.IsSurplusArea)); - AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".issurplus-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-acres']"), TransformSqMtToAcres(take.IsSurplusArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".istheresurplus-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-hectares']"), TransformSqMtToHectares(take.IsSurplusArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".istheresurplus-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-sq-feet']"), TransformSqMtToSqFt(take.IsSurplusArea)); + AssertTrueDoublesEquals(By.XPath("//input[@data-testid='radio-takes."+ index +".istheresurplus-yes']/parent::div/parent::div/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/input[@name='area-acres']"), TransformSqMtToAcres(take.IsSurplusArea)); } } @@ -274,10 +279,11 @@ public void VerifyInitCreateForm() AssertTrueIsDisplayed(take1SiteContaminationSelect); AssertTrueIsDisplayed(takeDescriptionLabel); AssertTrueIsDisplayed(take1DescriptionInput); - AssertTrueIsDisplayed(takeAreaSubtitle); AssertTrueIsDisplayed(takeRightOfWayLabel); AssertTrueIsDisplayed(takeRightOfWayRadioBttnGroup); + AssertTrueIsDisplayed(takeMOTIInventoryLabel); + AssertTrueIsDisplayed(takeMOTIInventoryBttnGroup); AssertTrueIsDisplayed(takeSRWLabel); AssertTrueIsDisplayed(takeSRWRadioBttnGroup); AssertTrueIsDisplayed(takeLandActLabel); @@ -314,31 +320,31 @@ public void VerifyCreatedTakeViewForm(Take take) AssertTrueIsDisplayed(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there a new right of way?')]")); Assert.True(webDriver.FindElements(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/div/div/div/div/input[@id='input-newRightOfWayToggle']")).Count.Equals(2)); - if (take.IsNewRightWay.Equals("True") && take.IsNewRightWayArea != "") - AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there a new right of way?')]/parent::div/parent::div/parent::div/div/div/div/div/div/div/div[contains(text(),'sq. metres')]/preceding-sibling::div"), take.IsNewRightWayArea); + if (take.IsNewHighwayDedication.Equals("True") && take.IsNewHighwayDedicationArea != "") + AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there a new right of way?')]/parent::div/parent::div/parent::div/div/div/div/div/div/div/div[contains(text(),'sq. metres')]/preceding-sibling::div"), take.IsNewHighwayDedicationArea); AssertTrueIsDisplayed(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there a Statutory Right of Way: (SRW)?')]")); Assert.True(webDriver.FindElements(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/div/div/div/div/input[@id='input-statutoryRightOfWayToggle']")).Count.Equals(2)); - if (take.IsStatutoryRightWay.Equals("True") && take.IsStatutoryRightWayArea != "") - AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there Land Act-Reserve(s)/Withdrawal(s)/Notation(s)?')]/parent::div/parent::div/parent::div/div/div/div/div/div/div/div[contains(text(),'sq. metres')]/preceding-sibling::div"), take.IsStatutoryRightWayArea); + if (take.IsNewInterestLand.Equals("True") && take.IsNewInterestLandArea != "") + AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there Land Act-Reserve(s)/Withdrawal(s)/Notation(s)?')]/parent::div/parent::div/parent::div/div/div/div/div/div/div/div[contains(text(),'sq. metres')]/preceding-sibling::div"), take.IsNewInterestLandArea); AssertTrueIsDisplayed(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there Land Act-Reserve(s)/Withdrawal(s)/Notation(s)?')]")); Assert.True(webDriver.FindElements(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/div/div/div/div/input[@id='input-statutoryRightOfWayToggle']")).Count.Equals(2)); - if (take.IsLandNotation.Equals("True")) + if (take.IsLandActTenure.Equals("True")) { - AssertTrueContentEquals(By.XPath("(//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there Land Act-Reserve(s)/Withdrawal(s)/Notation(s)?')]/parent::div/parent::div/parent::div/div/div/label[contains(text(),'Land Act')]/parent::div/following-sibling::div)[2]"),take.IsLandNotationDetail); + AssertTrueContentEquals(By.XPath("(//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there Land Act-Reserve(s)/Withdrawal(s)/Notation(s)?')]/parent::div/parent::div/parent::div/div/div/label[contains(text(),'Land Act')]/parent::div/following-sibling::div)[2]"),take.IsLandActTenureDetail); - if(take.IsLandNotationArea != "") - AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there Land Act-Reserve(s)/Withdrawal(s)/Notation(s)?')]/parent::div/parent::div/parent::div/div/div/div/div/div/div/div[contains(text(),'sq. metres')]/preceding-sibling::div"), take.IsStatutoryRightWayArea); + if(take.IsLandActTenureArea != "") + AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there Land Act-Reserve(s)/Withdrawal(s)/Notation(s)?')]/parent::div/parent::div/parent::div/div/div/div/div/div/div/div[contains(text(),'sq. metres')]/preceding-sibling::div"), take.IsNewInterestLandArea); - AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there Land Act-Reserve(s)/Withdrawal(s)/Notation(s)?')]/parent::div/parent::div/parent::div/div/div/label[contains(text(),'End date')]/parent::div/following-sibling::div"), TransformDateFormat(take.IsLandNotationDate)); + AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there Land Act-Reserve(s)/Withdrawal(s)/Notation(s)?')]/parent::div/parent::div/parent::div/div/div/label[contains(text(),'End date')]/parent::div/following-sibling::div"), TransformDateFormat(take.IsLandActTenureDate)); } AssertTrueIsDisplayed(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there a License to Construct (LTC)?')]")); Assert.True(webDriver.FindElements(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/div/div/div/div/input[@id='input-licenseToConstructToggle']")).Count.Equals(2)); if (take.IsLicenseConstruct.Equals("True")) { - if (take.IsLandNotationArea != "") + if (take.IsLandActTenureArea != "") AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there a License to Construct (LTC)?')]/parent::div/parent::div/parent::div/div/div/div/div/div/div/div[contains(text(),'sq. metres')]/preceding-sibling::div"), take.IsLicenseConstructArea); AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there a License to Construct (LTC)?')]/parent::div/parent::div/parent::div/div/div/label[contains(text(),'LTC end date')]/parent::div/following-sibling::div"), TransformDateFormat(take.IsLicenseConstructDate)); @@ -349,7 +355,7 @@ public void VerifyCreatedTakeViewForm(Take take) AssertTrueIsDisplayed(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there a Surplus?')]")); Assert.True(webDriver.FindElements(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/div/div/div/div/input[@id='input-surplusToggle']")).Count.Equals(2)); - if (take.IsNewRightWay.Equals("True") && take.IsSurplusArea != "") + if (take.IsNewHighwayDedication.Equals("True") && take.IsSurplusArea != "") AssertTrueContentEquals(By.XPath("//div[@data-testid='take-"+ index +"']/div/div/div/div/div/div/div/label[contains(text(),'Is there a Surplus?')]/parent::div/parent::div/parent::div/div/div/div/div/div/div/div[contains(text(),'sq. metres')]/preceding-sibling::div"), take.IsSurplusArea); } diff --git a/testing/PIMS.Tests.Automation/PageObjects/Activities.cs b/testing/PIMS.Tests.Automation/PageObjects/Activities.cs deleted file mode 100644 index 11d15f4545..0000000000 --- a/testing/PIMS.Tests.Automation/PageObjects/Activities.cs +++ /dev/null @@ -1,294 +0,0 @@ - - -using OpenQA.Selenium; - -namespace PIMS.Tests.Automation.PageObjects -{ - public class Activities : PageObjectBase - { - //Activity List View Elements - //Add Activities Elements - // private By activitiesTab = By.CssSelector("a[data-rb-event-key='activities']"); - // private By activitiesTitle = By.XPath("//div[contains(text(),'Activities')]"); - // private By activityTypeSelect = By.Id("input-activityTypeId"); - // private By activityAddBttn = By.CssSelector("div[class='col-md-4'] button"); - - // //Activities Filter Elements - // private By activityFilterLabel = By.XPath("//form/div/div/label[contains(text(),'Filter by')]"); - // private By activityTypeFilterSelect = By.Id("input-activityTypeId"); - // private By activityStatusFilterSelect = By.Id("input-status"); - // private By activityFilterSearchBttn = By.XPath("//div[contains(text(),'Activities')]/parent::div/parent::h2/following-sibling::div/form/div/div[4]/button"); - // private By activityFilterResetBttn = By.XPath("//div[contains(text(),'Activities')]/parent::div/parent::h2/following-sibling::div/form/div/div[5]/button"); - - // //Activity List View Results - // private By activityTable = By.CssSelector("div[data-testid='ActivityTable']"); - // private By activityTypeColumn = By.XPath("//div[@data-testid='ActivityTable']/div/div/div/div[contains(text(),'Activity type')]"); - // private By activityDescColumn = By.XPath("//div[@data-testid='ActivityTable']/div/div/div/div[contains(text(),'Description')]"); - // private By activityPropertyColumn = By.XPath("//div[@data-testid='ActivityTable']/div/div/div/div[contains(text(),'Property')]"); - // private By activityStatusColumn = By.XPath("//div[@data-testid='ActivityTable']/div/div/div/div[contains(text(),'Status')]"); - // private By activityActionsColumn = By.XPath("//div[@data-testid='ActivityTable']/div/div/div/div[contains(text(),'Actions')]"); - // private By activity1stGeneralActBttn = By.XPath("(//div[contains(text(),'General')]/parent::button)[1]"); - // private By activity1stViewActionBttn = By.XPath("(//button[@title='View Activity'])[1]"); - // private By activity1stDeleteActionBttn = By.XPath("(//button[@title='View Activity']/following-sibling::button)[1]"); - // private By activity1stPropertyCell = By.CssSelector("div[data-testid='ActivityTable'] div[class='tbody'] div[class='tr-wrapper']:nth-child(1) div:nth-child(3)"); - // private By activity1stStatusCell = By.CssSelector("div[data-testid='ActivityTable'] div[class='tbody'] div[class='tr-wrapper']:nth-child(1) div:nth-child(4)"); - // private By activityNoFound = By.XPath("//div[contains(text(),'No matching Activity found')]"); - // private By activitiesListTotal = By.CssSelector("div[data-testid='ActivityTable'] div[class='tbody'] div[class='tr-wrapper']"); - - // //Activity Pagination Elements - // private By activityPaginationSpan = By.CssSelector("div[class='align-self-center col-auto'] span"); - // private By activityPagination = By.CssSelector("ul[class='pagination']"); - - // //Activity Details Elements - // //Activity Details Header - // private By activityHeaderTittle = By.XPath("//div[@data-testid='activity-tray']/div[contains(text(),'Activity')]"); - // private By activityHeaderFileLabel = By.XPath("//div[@data-testid='activity-tray']/div/div/div/div/div/div/div/div/label[contains(text(),'File')]"); - // private By activityHeaderFileContent = By.XPath("//div[@data-testid='activity-tray']/div/div/div/div/div/div/div/div/label[contains(text(),'File')]/parent::div/following-sibling::div/strong"); - // private By activityHeaderCreatedLabel = By.XPath("//div[@data-testid='activity-tray']/div/div/div/div/div/div[contains(text(),'Created')]"); - // private By activityHeaderCreatedDate = By.XPath("//div[@data-testid='activity-tray']/div/div/div/div/div/div[contains(text(),'Created')]/strong"); - // private By activityHeaderCreatedByUser = By.XPath("//div[@data-testid='activity-tray']/div/div/div/div/div/div[contains(text(),'Created')]/span"); - // private By activityHeaderUpdatedLabel = By.XPath("//div[@data-testid='activity-tray']/div/div/div/div/div/div[contains(text(),'Last updated')]"); - // private By activityHeaderUpdatedDate = By.XPath("//div[@data-testid='activity-tray']/div/div/div/div/div/div[contains(text(),'Last updated')]/strong"); - // private By activityHeaderUpdateByUser = By.XPath("//div[@data-testid='activity-tray']/div/div/div/div/div/div[contains(text(),'Last updated')]/span"); - // private By activityHeaderStatusLabel = By.XPath("//div[@data-testid='activity-tray']/div/div/div/div/div/div/div/div/label[contains(text(),'Status')]"); - // private By activityHeaderStatusContent = By.XPath("//div[@data-testid='activity-tray']/div/div/div/div/div/div/div/div/label[contains(text(),'Status')]/parent::div/following-sibling::div/strong"); - - // //Activity Details Elements - // private By activityDetailsTitle = By.XPath("//div[@data-testid='activity-tray']/div/div/div[2]/div[1]/h2/div/div[contains(text(),'Details')]"); - // private By activityDetailsRelatedPropsBttn = By.XPath("//div[contains(text(),'Related properties')]/parent::button"); - // private By activityDescriptionLabel = By.XPath("//h2/div/div[contains(text(),'Description')]"); - // private By activityDescriptionTextArea = By.Id("input-description"); - // private By activityStatusSelect = By.Id("input-activityStatusTypeCode.id"); - // private By activityDetailsEditBttn = By.XPath("//div[@data-testid='activity-tray']/div[2]/div/div[3]/div/button"); - - // //Related Properties Pop-up - // private By activityPropertiesModal = By.CssSelector("div[class='modal-content']"); - // private By activityPropertiesAllInput = By.CssSelector("input[data-testid='selectrow-parent']"); - - // private SharedDocumentsTab digitalDocuments; - // private Notes notes; - // private SharedModals sharedModals; - - - public Activities(IWebDriver webDriver) : base(webDriver) - { - // digitalDocuments = new SharedDocumentsTab(webDriver); - // notes = new Notes(webDriver); - // sharedModals = new SharedModals(webDriver); - } - - // public void AccessActivitiesTab() - // { - // Wait(2000); - // webDriver.FindElement(activitiesTab).Click(); - // } - - // public void CreateNewActivity(string activityType) - // { - // Wait(); - // ChooseSpecificSelectOption(activityTypeSelect, activityType); - // webDriver.FindElement(activityAddBttn).Click(); - - // Wait(); - // var lastActivityIndex = webDriver.FindElements(activitiesListTotal).Count(); - // webDriver.FindElement(By.CssSelector("div[class='tbody'] div[class='tr-wrapper']:nth-child("+ lastActivityIndex +") div[role='row'] div[role='cell']:nth-child(1) button")).Click(); - // } - - // public void SelectFirstActivity() - // { - // Wait(); - // webDriver.FindElement(activity1stGeneralActBttn).Click(); - // } - - // public void VerifyActivityListView() - // { - // Wait(); - // webDriver.FindElement(activity1stViewActionBttn).Click(); - - // Wait(); - // Assert.True(webDriver.FindElement(activitiesTitle).Displayed); - // Assert.True(webDriver.FindElement(activityTypeSelect).Displayed); - // Assert.True(webDriver.FindElement(activityAddBttn).Displayed); - - // Assert.True(webDriver.FindElement(activityFilterLabel).Displayed); - // Assert.True(webDriver.FindElement(activityTypeFilterSelect).Displayed); - // Assert.True(webDriver.FindElement(activityStatusFilterSelect).Displayed); - // Assert.True(webDriver.FindElement(activityFilterSearchBttn).Displayed); - // Assert.True(webDriver.FindElement(activityFilterResetBttn).Displayed); - - // Assert.True(webDriver.FindElement(activityTable).Displayed); - // Assert.True(webDriver.FindElement(activityTypeColumn).Displayed); - // Assert.True(webDriver.FindElement(activityDescColumn).Displayed); - // Assert.True(webDriver.FindElement(activityPropertyColumn).Displayed); - // Assert.True(webDriver.FindElement(activityStatusColumn).Displayed); - // Assert.True(webDriver.FindElement(activityActionsColumn).Displayed); - // Assert.True(webDriver.FindElement(activity1stGeneralActBttn).Displayed); - // Assert.True(webDriver.FindElement(activity1stViewActionBttn).Displayed); - // Assert.True(webDriver.FindElement(activity1stDeleteActionBttn).Displayed); - - // Assert.True(webDriver.FindElement(activityPaginationSpan).Displayed); - // Assert.True(webDriver.FindElement(activityPagination).Displayed); - - // } - - // public void VerifyActivityDetails() - // { - // Wait(); - - // //Header - // Assert.True(webDriver.FindElement(activityHeaderTittle).Displayed); - // Assert.True(webDriver.FindElement(activityHeaderFileLabel).Displayed); - // Assert.True(webDriver.FindElement(activityHeaderFileContent).Displayed); - // Assert.True(webDriver.FindElement(activityHeaderCreatedLabel).Displayed); - // Assert.True(webDriver.FindElement(activityHeaderCreatedDate).Displayed); - // Assert.True(webDriver.FindElement(activityHeaderCreatedByUser).Displayed); - // Assert.True(webDriver.FindElement(activityHeaderUpdatedLabel).Displayed); - // Assert.True(webDriver.FindElement(activityHeaderUpdatedDate).Displayed); - // Assert.True(webDriver.FindElement(activityHeaderUpdateByUser).Displayed); - // Assert.True(webDriver.FindElement(activityHeaderStatusLabel).Displayed); - // Assert.True(webDriver.FindElement(activityHeaderStatusContent).Displayed); - - // //Details & Description - // Assert.True(webDriver.FindElement(activityDetailsTitle).Displayed); - // Assert.True(webDriver.FindElement(activityDetailsRelatedPropsBttn).Displayed); - // Assert.True(webDriver.FindElement(activityDescriptionLabel).Displayed); - - // //Documents - // digitalDocuments.VerifyActivityDocumentsListView(); - - // //Notes - // notes.VerifyNotesListView(); - - // //Edit button - // Assert.True(webDriver.FindElement(activityDetailsEditBttn).Displayed); - - // } - - // public void FilterActivities() - // { - // Wait(); - // ChooseSpecificSelectOption(activityStatusFilterSelect, "In Progress"); - // webDriver.FindElement(activityFilterSearchBttn).Click(); - - // Wait(); - // Assert.True(webDriver.FindElement(activityNoFound).Displayed); - - // webDriver.FindElement(activityFilterResetBttn).Click(); - - // ChangeStatus("In Progress"); - - // ChooseSpecificSelectOption(activityStatusFilterSelect, "In Progress"); - // webDriver.FindElement(activityFilterSearchBttn).Click(); - - // Wait(); - // Assert.True(webDriver.FindElements(activitiesListTotal).Count() > 0); - - // } - - // public void SelectAllProperties() - // { - // Wait(); - // Assert.True(webDriver.FindElement(activity1stPropertyCell).Text == ""); - - // Wait(); - // ButtonElement("Related properties"); - - // WaitUntil(activityPropertiesModal); - // webDriver.FindElement(activityPropertiesAllInput).Click(); - // sharedModals.ModalClickOKBttn(); - - // Wait(); - // Assert.True(webDriver.FindElement(activity1stPropertyCell).Text == "All"); - - // } - - // public void DesectAllProperties() - // { - // Wait(); - // Assert.True(webDriver.FindElement(activity1stPropertyCell).Text == "All"); - - // Wait(); - // ButtonElement("Related properties"); - - // WaitUntil(activityPropertiesModal); - // webDriver.FindElement(activityPropertiesAllInput).Click(); - // sharedModals.ModalClickOKBttn(); - - // Wait(); - // Assert.True(webDriver.FindElement(activity1stPropertyCell).Text == ""); - // } - - // public void NoProperties() - // { - // Wait(); - // ButtonElement("Related properties"); - - // WaitUntil(activityPropertiesModal); - // Assert.True(sharedModals.ModalHeader() == "Related properties"); - // Assert.True(sharedModals.ModalContent() == "To link activity to one or more properties, add properties to the parent file first"); - // sharedModals.ModalClickOKBttn(); - // } - - // public void EditActivity() - // { - // Wait(); - // webDriver.FindElement(activityDetailsEditBttn).Click(); - // } - - // public void ChangeStatus(string toStatus) - // { - // Wait(); - // var previousStatus = webDriver.FindElement(activity1stStatusCell).Text; - - // webDriver.FindElement(activityDetailsEditBttn).Click(); - - // ChooseSpecificSelectOption(activityStatusSelect, toStatus); - // ButtonElement("Save"); - - // Wait(); - // notes.VerifyAutomaticNotes(previousStatus, toStatus); - // } - - // public void InsertDescription(string description) - // { - // Wait(); - // webDriver.FindElement(activityDetailsEditBttn).Click(); - - // webDriver.FindElement(activityDescriptionTextArea).SendKeys(description); - - // } - - // public void DeleteActivity() - // { - // Wait(); - // webDriver.FindElement(activity1stDeleteActionBttn).Click(); - - // WaitUntil(activityPropertiesModal); - // sharedModals.ModalClickOKBttn(); - // } - - // public void SaveActivityChanges() - // { - // Wait(); - // ButtonElement("Save"); - // } - - // public void CancelActivityChanges() - // { - // Wait(); - // ButtonElement("Cancel"); - // } - - // public Boolean IsActivityBlocked() - // { - // Wait(); - // webDriver.FindElement(activityDetailsEditBttn).Click(); - // return webDriver.FindElements(activityDescriptionTextArea).Count() == 0; - // } - - // public int totalActivities() - // { - // return webDriver.FindElements(activitiesListTotal).Count(); - // } - } -} diff --git a/testing/PIMS.Tests.Automation/PageObjects/Contacts.cs b/testing/PIMS.Tests.Automation/PageObjects/Contacts.cs index adce518e5e..1e8b413b04 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/Contacts.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/Contacts.cs @@ -7,7 +7,7 @@ namespace PIMS.Tests.Automation.PageObjects public class Contacts : PageObjectBase { //Contact Menu Elements - private By menuContactsButton = By.XPath("//a/label[contains(text(),'Contacts')]/parent::a"); + private By menuContactsButton = By.CssSelector("div[data-testid='nav-tooltip-contacts'] a"); private By createContactButton = By.XPath("//a[contains(text(),'Add a Contact')]"); //Contacts Create Elements diff --git a/testing/PIMS.Tests.Automation/PageObjects/DigitalDocuments.cs b/testing/PIMS.Tests.Automation/PageObjects/DigitalDocuments.cs index d7768d0378..6a5f885d1c 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/DigitalDocuments.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/DigitalDocuments.cs @@ -271,25 +271,34 @@ public class DigitalDocuments: PageObjectBase private By documentFilterNameInput = By.XPath("//input[@data-testid='document-filename']"); private By documentFilterSearchBttn = By.XPath("//input[@id='input-filename']/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/button[@data-testid='search']"); private By documentFilterResetBttn = By.XPath("//input[@id='input-filename']/parent::div/parent::div/parent::div/parent::div/following-sibling::div/div/div/button[@data-testid='reset-button']"); - + + //Document List Sortable Columns Elements + private By documentDocumentTypeSortBttn = By.CssSelector("div[data-testid='sort-column-documentType']"); + private By documentDocumentNameSortBttn = By.CssSelector("div[data-testid='sort-column-fileName']"); + private By documentDocumentUploadedDateSortBttn = By.CssSelector("div[data-testid='sort-column-appCreateTimestamp']"); + private By documentDocumentStatusSortBttn = By.CssSelector("div[data-testid='sort-column-statusTypeCode']"); + //Documents Tab List Results - private By documentTableResults = By.XPath("//div[@data-testid='documentsTable']"); + private By documentTableListView = By.XPath("//div[@data-testid='documentsTable']"); private By documentTableTypeColumn = By.XPath("//div[@data-testid='documentsTable']/div/div/div/div[contains(text(),'Document type')]"); private By documentTableNameColumn = By.XPath("//div[@data-testid='documentsTable']/div/div/div/div[contains(text(),'File name')]"); private By documentTableDateColumn = By.XPath("//div[@data-testid='documentsTable']/div/div/div/div[contains(text(),'Uploaded')]"); private By documentTableStatusColumn = By.XPath("//div[@data-testid='documentsTable']/div/div/div/div[contains(text(),'Status')]"); private By documentTableActionsColumn = By.XPath("//div[@data-testid='documentsTable']/div/div/div/div[contains(text(),'Actions')]"); - private By documentTableContentTotal = By.XPath("//div[@data-testid='documentsTable']/div[@class='tbody']/div"); + private By documentTableContentTotal = By.CssSelector("div[data-testid='documentsTable'] div[class='tbody'] div[class='tr-wrapper']"); private By documentTableWaitSpinner = By.CssSelector("div[class='table-loading']"); //Activities Documents List 1st Result Elements - private By documentTableResults1stDownloadBttn = By.XPath("//div[@data-testid='documentsTable']/div[@class='tbody']/div[1]/div/div[5]/div/div/div/button[@data-testid='document-download-button']"); + private By documentTableResults1stDocumentTypeContent = By.XPath("//div[@data-testid='documentsTable']/div[@class='tbody']/div[1]/div/div[1]"); + private By documentTableResults1stDocumentNameContent = By.XPath("//div[@data-testid='documentsTable']/div[@class='tbody']/div[1]/div/div[2]/button/div"); + private By documentTableResults1stDocumentStatusContent = By.XPath("//div[@data-testid='documentsTable']/div[@class='tbody']/div[1]/div/div[4]"); private By documentTableResults1stViewBttn = By.XPath("//div[@data-testid='documentsTable']/div[@class='tbody']/div[1]/div/div[5]/div/div/button[@data-testid='document-view-button']"); private By documentTableResults1stDeleteBttn = By.XPath("//div[@data-testid='documentsTable']/div[@class='tbody']/div[1]/div/div[5]/div/div/button[@data-testid='document-delete-button']"); //Documents Tab Pagination private By documentPagination = By.XPath("//div[@class='row']/div[4]/ul[@class='pagination']"); private By documentMenuPagination = By.XPath("//div[@class='row']/div[3]/div[@class='Menu-root']"); + private By documentPaginationPrevPageLink = By.CssSelector("ul[class='pagination'] a[aria-label='Previous page']"); private By documentPaginationNextPageLink = By.CssSelector("ul[class='pagination'] a[aria-label='Next page']"); public DigitalDocuments(IWebDriver webDriver) : base(webDriver) @@ -301,6 +310,12 @@ public void NavigateDocumentsTab() webDriver.FindElement(documentsTab).Click(); } + public void NavigateToFirstPageDocumentsTable() + { + WaitUntilVisible(documentPaginationPrevPageLink); + FocusAndClick(documentPaginationPrevPageLink); + } + public void AddNewDocument(string fileType) { if (fileType.Equals("Lease") || fileType.Equals("CDOGS Templates") || fileType.Equals("Project")) @@ -390,27 +405,76 @@ public void VerifyDocumentsListView(string fileType) WaitUntilVisible(documentFilterTypeSelect); if (fileType.Equals("CDOGS Templates") || fileType.Equals("Project")) { - Assert.True(webDriver.FindElement(documentsTitle).Displayed); - Assert.True(webDriver.FindElement(addDocumentBttn).Displayed); + AssertTrueIsDisplayed(documentsTitle); + AssertTrueIsDisplayed(addDocumentBttn); } else { - Assert.True(webDriver.FindElement(documentsFileTitle).Displayed); - Assert.True(webDriver.FindElement(addFileDocumentBttn).Displayed); - + AssertTrueIsDisplayed(documentsFileTitle); + AssertTrueIsDisplayed(addFileDocumentBttn); } - Assert.True(webDriver.FindElement(documentFilterTypeSelect).Displayed); - Assert.True(webDriver.FindElement(documentFilterStatusSelect).Displayed); - Assert.True(webDriver.FindElement(documentFilterNameInput).Displayed); - Assert.True(webDriver.FindElement(documentFilterSearchBttn).Displayed); - Assert.True(webDriver.FindElement(documentFilterResetBttn).Displayed); - - Assert.True(webDriver.FindElement(documentTableResults).Displayed); - Assert.True(webDriver.FindElement(documentTableTypeColumn).Displayed); - Assert.True(webDriver.FindElement(documentTableNameColumn).Displayed); - Assert.True(webDriver.FindElement(documentTableDateColumn).Displayed); - Assert.True(webDriver.FindElement(documentTableStatusColumn).Displayed); - Assert.True(webDriver.FindElement(documentTableActionsColumn).Displayed); + AssertTrueIsDisplayed(documentFilterTypeSelect); + AssertTrueIsDisplayed(documentFilterStatusSelect); + AssertTrueIsDisplayed(documentFilterNameInput); + AssertTrueIsDisplayed(documentFilterSearchBttn); + AssertTrueIsDisplayed(documentFilterResetBttn); + + AssertTrueIsDisplayed(documentTableListView); + AssertTrueIsDisplayed(documentTableTypeColumn); + AssertTrueIsDisplayed(documentTableNameColumn); + AssertTrueIsDisplayed(documentTableDateColumn); + AssertTrueIsDisplayed(documentTableStatusColumn); + AssertTrueIsDisplayed(documentTableActionsColumn); + } + + public void VerifyPaginationElements() + { + AssertTrueIsDisplayed(documentPagination); + AssertTrueIsDisplayed(documentMenuPagination); + AssertTrueIsDisplayed(documentPaginationPrevPageLink); + AssertTrueIsDisplayed(documentPaginationNextPageLink); + } + + public int DigitalDocumentsTableResultNumber() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElements(documentTableContentTotal).Count; + } + + public void OrderByDocumentFileType() + { + WaitUntilClickable(documentDocumentTypeSortBttn); + webDriver.FindElement(documentDocumentTypeSortBttn).Click(); + } + + public void OrderByDocumentFileName() + { + WaitUntilClickable(documentDocumentNameSortBttn); + webDriver.FindElement(documentDocumentNameSortBttn).Click(); + } + + public void OrderByDocumentFileStatus() + { + WaitUntilClickable(documentDocumentStatusSortBttn); + webDriver.FindElement(documentDocumentStatusSortBttn).Click(); + } + + public string FirstDocumentFileType() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(documentTableResults1stDocumentTypeContent).Text; + } + + public string FirstDocumentFileName() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(documentTableResults1stDocumentNameContent).Text; + } + + public string FirstDocumentFileStatus() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(documentTableResults1stDocumentStatusContent).Text; } public void FilterByType(string documentType) @@ -1331,24 +1395,24 @@ private void VerifyBCAssessmentFields() VerifyGeneralUploadDocumentForm(); AssertTrueIsDisplayed(documentCivicAddressLabel); AssertTrueIsDisplayed(documentCivicAddressInput); - webDriver.FindElement(documentCivicAddressInput).Click(); - webDriver.FindElement(documentCivicAddressLabel).Click(); - AssertTrueIsDisplayed(documentBCAssessmentTypeAddressMandatory); + //webDriver.FindElement(documentCivicAddressInput).Click(); + //webDriver.FindElement(documentCivicAddressLabel).Click(); + //AssertTrueIsDisplayed(documentBCAssessmentTypeAddressMandatory); AssertTrueIsDisplayed(documentBCAssessmentTypeJurisdictionLabel); AssertTrueIsDisplayed(documentBCAssessmentTypeJurisdictionInput); - webDriver.FindElement(documentBCAssessmentTypeJurisdictionInput).Click(); - webDriver.FindElement(documentBCAssessmentTypeJurisdictionLabel).Click(); - AssertTrueIsDisplayed(documentBCAssessmentTypeJurisdictionMandatory); + //webDriver.FindElement(documentBCAssessmentTypeJurisdictionInput).Click(); + //webDriver.FindElement(documentBCAssessmentTypeJurisdictionLabel).Click(); + //AssertTrueIsDisplayed(documentBCAssessmentTypeJurisdictionMandatory); AssertTrueIsDisplayed(documentBCAssessmentTypeRollLabel); AssertTrueIsDisplayed(documentBCAssessmentTypeRollInput); AssertTrueIsDisplayed(documentYearLabel); AssertTrueIsDisplayed(documentYearInput); - webDriver.FindElement(documentYearInput).Click(); - webDriver.FindElement(documentYearLabel).Click(); - AssertTrueIsDisplayed(documentBCAssessmentTypeYearMandatory); + //webDriver.FindElement(documentYearInput).Click(); + //webDriver.FindElement(documentYearLabel).Click(); + //AssertTrueIsDisplayed(documentBCAssessmentTypeYearMandatory); } private void VerifyTransferAdministrationFields() @@ -1361,24 +1425,24 @@ private void VerifyTransferAdministrationFields() AssertTrueIsDisplayed(documentMOTIFileLabel); AssertTrueIsDisplayed(documentTypeMotiFileInput); - webDriver.FindElement(documentTypeMotiFileInput).Click(); - webDriver.FindElement(documentMOTIFileLabel).Click(); - AssertTrueIsDisplayed(documentTransferAdmTypeMOTIFileMandatory); + //webDriver.FindElement(documentTypeMotiFileInput).Click(); + //webDriver.FindElement(documentMOTIFileLabel).Click(); + //AssertTrueIsDisplayed(documentTransferAdmTypeMOTIFileMandatory); AssertTrueIsDisplayed(documentTransferAdmTypeProIdLabel); AssertTrueIsDisplayed(documentTypePropertyIdentifierInput); AssertTrueIsDisplayed(documentRoadNameLabel); AssertTrueIsDisplayed(documentRoadNameInput); - webDriver.FindElement(documentRoadNameInput).Click(); - webDriver.FindElement(documentRoadNameLabel).Click(); - AssertTrueIsDisplayed(documentTransferAdmTypeRoadNameMandatory); + //webDriver.FindElement(documentRoadNameInput).Click(); + //webDriver.FindElement(documentRoadNameLabel).Click(); + //AssertTrueIsDisplayed(documentTransferAdmTypeRoadNameMandatory); AssertTrueIsDisplayed(documentTransferAdmTypeTransferLabel); AssertTrueIsDisplayed(documentTransferAdmTypeTransferInput); - webDriver.FindElement(documentTransferAdmTypeTransferInput).Click(); - webDriver.FindElement(documentTransferAdmTypeTransferLabel).Click(); - AssertTrueIsDisplayed(documentTransferAdmTypeTransferMandatory); + //webDriver.FindElement(documentTransferAdmTypeTransferInput).Click(); + //webDriver.FindElement(documentTransferAdmTypeTransferLabel).Click(); + //AssertTrueIsDisplayed(documentTransferAdmTypeTransferMandatory); } private void VerifyMinisterialOrderFields() @@ -1405,15 +1469,15 @@ private void VerifyCanadaLandsSurveyFields() VerifyGeneralUploadDocumentForm(); AssertTrueIsDisplayed(documentCanLandSurveyTypeCanLandSurveyLabel); AssertTrueIsDisplayed(documentCanLandSurveyTypeCanLandSurveyInput); - webDriver.FindElement(documentCanLandSurveyTypeCanLandSurveyInput).Click(); - webDriver.FindElement(documentCanLandSurveyTypeCanLandSurveyLabel).Click(); - AssertTrueIsDisplayed(documentCanLandSurveyTypeCanLandSurveyMandatory); + //webDriver.FindElement(documentCanLandSurveyTypeCanLandSurveyInput).Click(); + //webDriver.FindElement(documentCanLandSurveyTypeCanLandSurveyLabel).Click(); + //AssertTrueIsDisplayed(documentCanLandSurveyTypeCanLandSurveyMandatory); AssertTrueIsDisplayed(documentCanLandSurveyTypeIndianReserveLabel); AssertTrueIsDisplayed(documentCanLandSurveyTypeIndianReserveInput); - webDriver.FindElement(documentCanLandSurveyTypeIndianReserveInput).Click(); - webDriver.FindElement(documentCanLandSurveyTypeIndianReserveLabel).Click(); - AssertTrueIsDisplayed(documentCanLandSurveyTypeIndianReserveMandatory); + //webDriver.FindElement(documentCanLandSurveyTypeIndianReserveInput).Click(); + //webDriver.FindElement(documentCanLandSurveyTypeIndianReserveLabel).Click(); + //AssertTrueIsDisplayed(documentCanLandSurveyTypeIndianReserveMandatory); } private void VerifyPhotosCorrespondenceFields() @@ -1465,9 +1529,9 @@ private void VerifyHistoricalFileFields() AssertTrueIsDisplayed(documentHistoricFileTypeFileLabel); AssertTrueIsDisplayed(documentHistoricFileTypeFileInput); - webDriver.FindElement(documentHistoricFileTypeFileInput).Click(); - webDriver.FindElement(documentHistoricFileTypeFileLabel).Click(); - AssertTrueIsDisplayed(documentHistoricFileTypeFileMandatory); + //webDriver.FindElement(documentHistoricFileTypeFileInput).Click(); + //webDriver.FindElement(documentHistoricFileTypeFileLabel).Click(); + //AssertTrueIsDisplayed(documentHistoricFileTypeFileMandatory); AssertTrueIsDisplayed(documentHistoricFileTypePhyLocationLabel); AssertTrueIsDisplayed(documentHistoricFileTypePhyLocationInput); @@ -1484,9 +1548,9 @@ private void VerifyCrownGrantFields() VerifyGeneralUploadDocumentForm(); AssertTrueIsDisplayed(documentCrownGrantTypeCrownLabel); AssertTrueIsDisplayed(documentCrownGrantTypeCrownInput); - webDriver.FindElement(documentCrownGrantTypeCrownInput).Click(); - webDriver.FindElement(documentCrownGrantTypeCrownLabel).Click(); - AssertTrueIsDisplayed(documentCrownGrantTypeCrownMandatory); + //webDriver.FindElement(documentCrownGrantTypeCrownInput).Click(); + //webDriver.FindElement(documentCrownGrantTypeCrownLabel).Click(); + //AssertTrueIsDisplayed(documentCrownGrantTypeCrownMandatory); } private void VerifyPrivyCouncilFields() @@ -1496,9 +1560,9 @@ private void VerifyPrivyCouncilFields() VerifyGeneralUploadDocumentForm(); AssertTrueIsDisplayed(documentPrivyCouncilTypePrivyLabel); AssertTrueIsDisplayed(documentPrivyCouncilTypePrivyInput); - webDriver.FindElement(documentPrivyCouncilTypePrivyInput).Click(); - webDriver.FindElement(documentPrivyCouncilTypePrivyLabel).Click(); - AssertTrueIsDisplayed(documentPrivyCounciltTypePrivyMandatory); + //webDriver.FindElement(documentPrivyCouncilTypePrivyInput).Click(); + //webDriver.FindElement(documentPrivyCouncilTypePrivyLabel).Click(); + //AssertTrueIsDisplayed(documentPrivyCounciltTypePrivyMandatory); } private void VerifyOICFields() @@ -1560,15 +1624,15 @@ private void VerifyGazetteFields() AssertTrueIsDisplayed(documentGazettePublishedDateLabel); AssertTrueIsDisplayed(documentGazettePublishedDateInput); - webDriver.FindElement(documentGazettePublishedDateInput).Click(); - webDriver.FindElement(documentGazettePublishedDateLabel).Click(); - AssertTrueIsDisplayed(documentGazettePublishedDateMandatory); + //webDriver.FindElement(documentGazettePublishedDateInput).Click(); + //webDriver.FindElement(documentGazettePublishedDateLabel).Click(); + //AssertTrueIsDisplayed(documentGazettePublishedDateMandatory); AssertTrueIsDisplayed(documentGazettePublishedTypeLabel); AssertTrueIsDisplayed(documentGazettePublishedTypeInput); - webDriver.FindElement(documentGazettePublishedTypeInput).Click(); - webDriver.FindElement(documentGazettePublishedTypeLabel).Click(); - AssertTrueIsDisplayed(documentGazettePublishedTypeMandatory); + //webDriver.FindElement(documentGazettePublishedTypeInput).Click(); + //webDriver.FindElement(documentGazettePublishedTypeLabel).Click(); + //AssertTrueIsDisplayed(documentGazettePublishedTypeMandatory); AssertTrueIsDisplayed(documentGazetteLegalSurveyPlanLabel); AssertTrueIsDisplayed(documentLegalSurveyInput); @@ -1579,9 +1643,9 @@ private void VerifyGazetteFields() AssertTrueIsDisplayed(documentRoadNameLabel); AssertTrueIsDisplayed(documentRoadNameInput); - webDriver.FindElement(documentRoadNameInput).Click(); - webDriver.FindElement(documentRoadNameLabel).Click(); - AssertTrueIsDisplayed(documentGazetteRoadNameMandatory); + //webDriver.FindElement(documentRoadNameInput).Click(); + //webDriver.FindElement(documentRoadNameLabel).Click(); + //AssertTrueIsDisplayed(documentGazetteRoadNameMandatory); } private void VerifyPAPlansFields() @@ -1591,9 +1655,9 @@ private void VerifyPAPlansFields() VerifyGeneralUploadDocumentForm(); AssertTrueIsDisplayed(documentPAPlanNbrLabel); AssertTrueIsDisplayed(documentPAPlanNbrInput); - webDriver.FindElement(documentPAPlanNbrInput).Click(); - webDriver.FindElement(documentPAPlanNbrLabel).Click(); - AssertTrueIsDisplayed(documentPAPlanNbrMandatory); + //webDriver.FindElement(documentPAPlanNbrInput).Click(); + //webDriver.FindElement(documentPAPlanNbrLabel).Click(); + //AssertTrueIsDisplayed(documentPAPlanNbrMandatory); AssertTrueIsDisplayed(documentPAPlanRevisionLabel); AssertTrueIsDisplayed(documentPAPlanRevisionInput); @@ -1602,9 +1666,9 @@ private void VerifyPAPlansFields() AssertTrueIsDisplayed(documentPAPlanProjectNameLabel); AssertTrueIsDisplayed(documentPAPlanProjectNameInput); - webDriver.FindElement(documentPAPlanProjectNameInput).Click(); - webDriver.FindElement(documentPAPlanProjectNameLabel).Click(); - AssertTrueIsDisplayed(documentPAPlanProjectNameMandatory); + //webDriver.FindElement(documentPAPlanProjectNameInput).Click(); + //webDriver.FindElement(documentPAPlanProjectNameLabel).Click(); + //AssertTrueIsDisplayed(documentPAPlanProjectNameMandatory); } private void VerifyShortDescriptorField() diff --git a/testing/PIMS.Tests.Automation/PageObjects/FinancialCodes.cs b/testing/PIMS.Tests.Automation/PageObjects/FinancialCodes.cs index d727a2a52e..4b972e18e8 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/FinancialCodes.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/FinancialCodes.cs @@ -22,10 +22,15 @@ public class FinancialCodes : PageObjectBase //Financial Codes Table private By financialCodeTableHeaderCodeValue = By.XPath("//div[@data-testid='FinancialCodeTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Code value')]"); + private By financialCodeTableCodeSortBttn = By.CssSelector("div[data-testid='sort-column-code']"); private By financialCodeTableHeaderCodeDescription = By.XPath("//div[@data-testid='FinancialCodeTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Code description')]"); + private By financialCodeTableDescriptionSortBttn = By.CssSelector("div[data-testid='sort-column-description']"); private By financialCodeTableHeaderCodeType = By.XPath("//div[@data-testid='FinancialCodeTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Code type')]"); + private By financialCodeTableTypeSortBttn = By.CssSelector("div[data-testid='sort-column-type']"); private By financialCodeTableHeaderEffectiveDate = By.XPath("//div[@data-testid='FinancialCodeTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Effective date')]"); + private By financialCodeTableEffectiveDateSortBttn = By.CssSelector("div[data-testid='sort-column-effectiveDate']"); private By financialCodeTableHeaderExpiryDate = By.XPath("//div[@data-testid='FinancialCodeTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Expiry date')]"); + private By financialCodeTableExpiryDateSortBttn = By.CssSelector("div[data-testid='sort-column-expiryDate']"); private By financialCodeTableResultsTotal = By.XPath("//div[@data-testid='FinancialCodeTable']/div[@class='tbody']/div[@class='tr-wrapper']"); private By financialResults1stResultCodeValue = By.XPath("//div[@data-testid='FinancialCodeTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[1]/a"); @@ -142,9 +147,49 @@ public void FilterFinancialCode(string value) webDriver.FindElement(financialCodeSearchBttn).Click(); } + public void FilterFinancialCodeByType(string value) + { + WaitUntilClickable(financialCodeResetBttn); + webDriver.FindElement(financialCodeResetBttn).Click(); + + WaitUntilVisible(financialCodeTypeSelect); + ChooseSpecificSelectOption(financialCodeTypeSelect, value); + webDriver.FindElement(financialCodeSearchBttn).Click(); + } + + public void OrderByFinancialCodeValue() + { + WaitUntilClickable(financialCodeTableCodeSortBttn); + webDriver.FindElement(financialCodeTableCodeSortBttn).Click(); + } + + public void OrderByFinancialCodeDescription() + { + WaitUntilClickable(financialCodeTableDescriptionSortBttn); + webDriver.FindElement(financialCodeTableDescriptionSortBttn).Click(); + } + + public void OrderByFinancialCodeType() + { + WaitUntilClickable(financialCodeTableTypeSortBttn); + webDriver.FindElement(financialCodeTableTypeSortBttn).Click(); + } + + public void OrderByFinancialCodeEffectiveDate() + { + WaitUntilClickable(financialCodeTableEffectiveDateSortBttn); + webDriver.FindElement(financialCodeTableEffectiveDateSortBttn).Click(); + } + + public void OrderByFinancialCodeExpiryDate() + { + WaitUntilClickable(financialCodeTableExpiryDateSortBttn); + webDriver.FindElement(financialCodeTableExpiryDateSortBttn).Click(); + } + public int CountTotalFinancialCodeResults() { - Wait(); + WaitUntilTableSpinnerDisappear(); return webDriver.FindElements(financialCodeTableResultsTotal).Count(); } @@ -154,6 +199,36 @@ public Boolean DuplicateErrorMessageDisplayed() return webDriver.FindElement(financialCodeDuplicateErrorMessage).Displayed; } + public string FirstFinancialCodeValue() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(financialResults1stResultCodeValue).Text; + } + + public string FirstFinancialCodeDescription() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(financialResults1stResultCodeDescription).Text; + } + + public string FirstFinancialCodeType() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(financialResults1stResultCodeType).Text; + } + + public string FirstFinancialCodeEffectiveDate() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(financialResults1stResultEffectiveDate).Text; + } + + public string FirstFinancialCodeExpiryDate() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(financialResults1stResultExpiryDate).Text; + } + public void ChooseFirstSearchCodeValue() { WaitUntilClickable(financialResults1stResultCodeValue); @@ -162,95 +237,94 @@ public void ChooseFirstSearchCodeValue() public void VerifyFinancialCodeListView() { - WaitUntilVisible(financialCodeTitle); - Assert.True(webDriver.FindElement(financialCodeTitle).Displayed); - Assert.True(webDriver.FindElement(financialCodeTypeSelect).Displayed); - Assert.True(webDriver.FindElement(financialCodeDescriptionInput).Displayed); - Assert.True(webDriver.FindElement(financialCodeShowExpiredInput).Displayed); - Assert.True(webDriver.FindElement(financialCodeShowExpiredSpan).Displayed); - Assert.True(webDriver.FindElement(financialCodeSearchBttn).Displayed); - Assert.True(webDriver.FindElement(financialCodeResetBttn).Displayed); - Assert.True(webDriver.FindElement(financialCodeCreateNewBttn).Displayed); - - Assert.True(webDriver.FindElement(financialCodeTableHeaderCodeValue).Displayed); - Assert.True(webDriver.FindElement(financialCodeTableHeaderCodeDescription).Displayed); - Assert.True(webDriver.FindElement(financialCodeTableHeaderCodeType).Displayed); - Assert.True(webDriver.FindElement(financialCodeTableHeaderEffectiveDate).Displayed); - Assert.True(webDriver.FindElement(financialCodeTableHeaderExpiryDate).Displayed); - Assert.True(webDriver.FindElements(financialCodeTableResultsTotal).Count() > 1); - - Assert.True(webDriver.FindElement(financialCodePaginationEntries).Displayed); - Assert.True(webDriver.FindElement(financialCodePaginationList).Displayed); + AssertTrueIsDisplayed(financialCodeTitle); + AssertTrueIsDisplayed(financialCodeTypeSelect); + AssertTrueIsDisplayed(financialCodeDescriptionInput); + AssertTrueIsDisplayed(financialCodeShowExpiredInput); + AssertTrueIsDisplayed(financialCodeShowExpiredSpan); + AssertTrueIsDisplayed(financialCodeSearchBttn); + AssertTrueIsDisplayed(financialCodeResetBttn); + AssertTrueIsDisplayed(financialCodeCreateNewBttn); + + AssertTrueIsDisplayed(financialCodeTableHeaderCodeValue); + AssertTrueIsDisplayed(financialCodeTableHeaderCodeDescription); + AssertTrueIsDisplayed(financialCodeTableHeaderCodeType); + AssertTrueIsDisplayed(financialCodeTableHeaderEffectiveDate); + AssertTrueIsDisplayed(financialCodeTableHeaderExpiryDate); + + Assert.True(webDriver.FindElements(financialCodeTableResultsTotal).Count() > 0); + + AssertTrueIsDisplayed(financialCodePaginationEntries); + AssertTrueIsDisplayed(financialCodePaginationList); } public void VerifyCreateNewFinancialCodeForm() { - WaitUntilVisible(financialCodeCreateTitle); - Assert.True(webDriver.FindElement(financialCodeCreateTitle).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormTypeLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormTypeSelect).Displayed); + AssertTrueIsDisplayed(financialCodeCreateTitle); + + AssertTrueIsDisplayed(financialCodeFormTypeLabel); + AssertTrueIsDisplayed(financialCodeFormTypeSelect); webDriver.FindElement(financialCodeFormTypeSelect).Click(); webDriver.FindElement(financialCodeFormTypeLabel).Click(); - Assert.True(webDriver.FindElement(financialCodeFormTypeErrorMessage).Displayed); + AssertTrueIsDisplayed(financialCodeFormTypeErrorMessage); - Assert.True(webDriver.FindElement(financialCodeFormValueLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormValueInput).Displayed); + AssertTrueIsDisplayed(financialCodeFormValueLabel); + AssertTrueIsDisplayed(financialCodeFormValueInput); webDriver.FindElement(financialCodeFormValueInput).Click(); webDriver.FindElement(financialCodeFormValueLabel).Click(); - Assert.True(webDriver.FindElement(financialCodeFormValueErrorMessage).Displayed); + AssertTrueIsDisplayed(financialCodeFormValueErrorMessage); - Assert.True(webDriver.FindElement(financialCodeFormDescriptionLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormDescriptionInput).Displayed); + AssertTrueIsDisplayed(financialCodeFormDescriptionLabel); + AssertTrueIsDisplayed(financialCodeFormDescriptionInput); webDriver.FindElement(financialCodeFormDescriptionInput).Click(); webDriver.FindElement(financialCodeFormDescriptionLabel).Click(); - Assert.True(webDriver.FindElement(financialCodeFormDescriptionErrorMessage).Displayed); + AssertTrueIsDisplayed(financialCodeFormDescriptionErrorMessage); - Assert.True(webDriver.FindElement(financialCodeFormEffectiveDateLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormEffectiveDateTooltip).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormEffectiveDateInput).Displayed); + AssertTrueIsDisplayed(financialCodeFormEffectiveDateLabel); + AssertTrueIsDisplayed(financialCodeFormEffectiveDateTooltip); + AssertTrueIsDisplayed(financialCodeFormEffectiveDateInput); - Assert.True(webDriver.FindElement(financialCodeFormExpiryDateLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormExpiryDateTooltip).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormExpiryDateInput).Displayed); + AssertTrueIsDisplayed(financialCodeFormExpiryDateLabel); + AssertTrueIsDisplayed(financialCodeFormExpiryDateTooltip); + AssertTrueIsDisplayed(financialCodeFormExpiryDateInput); - Assert.True(webDriver.FindElement(financialCodeFormOrderLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormOrderInput).Displayed); + AssertTrueIsDisplayed(financialCodeFormOrderLabel); + AssertTrueIsDisplayed(financialCodeFormOrderInput); - Assert.True(webDriver.FindElement(financialCodeFormCancelBttn).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormSaveBttn).Displayed); + AssertTrueIsDisplayed(financialCodeFormCancelBttn); + AssertTrueIsDisplayed(financialCodeFormSaveBttn); } public void VerifyUpdateFinancialCodeForm() { - WaitUntilVisible(financialCodeUpdateTitle); - Assert.True(webDriver.FindElement(financialCodeUpdateTitle).Displayed); + AssertTrueIsDisplayed(financialCodeUpdateTitle); - Assert.True(webDriver.FindElement(financialCodeFormTypeLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormValueContent).Displayed); + AssertTrueIsDisplayed(financialCodeFormTypeLabel); + AssertTrueIsDisplayed(financialCodeFormValueContent); - Assert.True(webDriver.FindElement(financialCodeFormValueLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormValueInput).Displayed); + AssertTrueIsDisplayed(financialCodeFormValueLabel); + AssertTrueIsDisplayed(financialCodeFormValueInput); - Assert.True(webDriver.FindElement(financialCodeFormDescriptionLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormDescriptionInput).Displayed); + AssertTrueIsDisplayed(financialCodeFormDescriptionLabel); + AssertTrueIsDisplayed(financialCodeFormDescriptionInput); - Assert.True(webDriver.FindElement(financialCodeFormEffectiveDateLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormEffectiveDateTooltip).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormEffectiveDateInput).Displayed); + AssertTrueIsDisplayed(financialCodeFormEffectiveDateLabel); + AssertTrueIsDisplayed(financialCodeFormEffectiveDateTooltip); + AssertTrueIsDisplayed(financialCodeFormEffectiveDateInput); - Assert.True(webDriver.FindElement(financialCodeFormExpiryDateLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormExpiryDateTooltip).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormExpiryDateInput).Displayed); + AssertTrueIsDisplayed(financialCodeFormExpiryDateLabel); + AssertTrueIsDisplayed(financialCodeFormExpiryDateTooltip); + AssertTrueIsDisplayed(financialCodeFormExpiryDateInput); - Assert.True(webDriver.FindElement(financialCodeFormOrderLabel).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormOrderInput).Displayed); + AssertTrueIsDisplayed(financialCodeFormOrderLabel); + AssertTrueIsDisplayed(financialCodeFormOrderInput); - Assert.True(webDriver.FindElement(financialCodeFormCancelBttn).Displayed); - Assert.True(webDriver.FindElement(financialCodeFormSaveBttn).Displayed); + AssertTrueIsDisplayed(financialCodeFormCancelBttn); + AssertTrueIsDisplayed(financialCodeFormSaveBttn); } } } diff --git a/testing/PIMS.Tests.Automation/PageObjects/LeaseDetails.cs b/testing/PIMS.Tests.Automation/PageObjects/LeaseDetails.cs index ad62aa3a93..8727e042a0 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/LeaseDetails.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/LeaseDetails.cs @@ -8,7 +8,7 @@ namespace PIMS.Tests.Automation.PageObjects public class LeaseDetails : PageObjectBase { //Main Menu links Elements - private By menuManagementButton = By.XPath("//a/label[contains(text(),'Management')]/parent::a"); + private By menuManagementButton = By.CssSelector("div[data-testid='nav-tooltip-leases&licenses'] a"); private By createLicenseButton = By.XPath("//a[contains(text(),'Create a Lease/License File')]"); //File Details Edit Icon diff --git a/testing/PIMS.Tests.Automation/PageObjects/Notes.cs b/testing/PIMS.Tests.Automation/PageObjects/Notes.cs index dcbc7c92ba..bdb37048d0 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/Notes.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/Notes.cs @@ -22,17 +22,6 @@ public class Notes : PageObjectBase private By notesTab1stResultViewBttn = By.XPath("//div[@data-testid='notesTable']/div[@class='tbody']/div[@class='tr-wrapper'][2]/div/div[4]/div/button[@title='View Note']"); private By notesTab1stResultDeleteBttn = By.XPath("//div[@data-testid='notesTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[4]/div/button[@title='Delete Note']"); - //Notes Add New button Element - //private By notesAddNoteBttn = By.XPath("//div[@data-testid='activity-tray']/div[2]/div/div[2]/div[7]/div/div/h2/div/div/div/div[contains(text(),'Notes')]/following-sibling::div/button"); - - //Notes List View Elements - //private By notesTitle = By.XPath("//div[@data-testid='activity-tray']/div[2]/div/div[2]/div[7]/div/div/h2/div/div/div/div[contains(text(),'Notes')]"); - //private By notesTable = By.XPath("//div[@data-testid='activity-tray']/div[2]/div/div[2]/div[7]/div/div/div/div[@data-testid='notesTable']"); - //private By notesNoteColumn = By.XPath("//div[@data-testid='activity-tray']/div[2]/div/div[2]/div[7]/div/div/div/div[@data-testid='notesTable']/div/div/div/div[contains(text(),'Note')]"); - //private By notesCreatedDateColumn = By.XPath("//div[@data-testid='activity-tray']/div[2]/div/div[2]/div[7]/div/div/div/div[@data-testid='notesTable']/div/div/div/div[contains(text(),'Created date')]"); - //private By notesCreatedByColumn = By.XPath("//div[@data-testid='activity-tray']/div[2]/div/div[2]/div[7]/div/div/div/div[@data-testid='notesTable']/div/div/div/div[contains(text(),'Last updated by')]"); - //private By notesBodyRows = By.XPath("//div[@data-testid='activity-tray']/div[2]/div/div[2]/div[7]/div/div/div/div[@data-testid='notesTable']/div[@class='tbody']/div[@class='tr-wrapper']"); - //Notes 1st result Elements private By note1stViewNoteBttn = By.CssSelector("div[data-testid='notesTable'] div[class='tbody'] div[class='tr-wrapper']:nth-child(1) div[role='cell']:nth-child(4) div button[title='View Note']"); private By note1stNoteContent = By.CssSelector("div[data-testid='notesTable'] div[class='tbody'] div[class='tr-wrapper']:nth-child(1) div[class='tr'] div[class='td']:nth-child(1)"); @@ -81,8 +70,8 @@ public void NavigateNotesTab() public void CreateNotesTabButton() { - Wait(2000); - webDriver.FindElement(notesTabAddBttn).Click(); + Wait(3000); + FocusAndClick(notesTabAddBttn); } public void AddNewNoteDetails(string note) @@ -132,74 +121,69 @@ public void DeleteLastSecondNote() webDriver.FindElement(note2ndDeleteNoteBttn).Click(); WaitUntilVisible(notesDeletePopupHeader); - Assert.True(webDriver.FindElement(notesDeletePopupHeader).Text.Equals("Delete Note")); - Assert.True(webDriver.FindElement(notesDeletePopupBody).Text.Equals("Are you sure you want to delete this note?")); + AssertTrueContentEquals(notesDeletePopupHeader, "Delete Note"); + AssertTrueContentEquals(notesDeletePopupBody, "Are you sure you want to delete this note?"); + webDriver.FindElement(notesDeleteOkBttn).Click(); } public void VerifyNotesAddNew() { - WaitUntilVisible(notesAddDetailsHeader); - Assert.True(webDriver.FindElement(notesAddDetailsHeader).Displayed); - Assert.True(webDriver.FindElement(notesAddDetailsHeader).Text == "Notes"); - Assert.True(webDriver.FindElement(notesAddDetailsLabel).Displayed); - Assert.True(webDriver.FindElement(notesAddDetailsTextarea).Displayed); - Assert.True(webDriver.FindElement(notesAddDetailsSaveBttn).Displayed); - Assert.True(webDriver.FindElement(notesAddDetailsCancelBttn).Displayed); + AssertTrueIsDisplayed(notesAddDetailsHeader); + AssertTrueContentEquals(notesAddDetailsHeader, "Notes"); + AssertTrueIsDisplayed(notesAddDetailsLabel); + AssertTrueIsDisplayed(notesAddDetailsTextarea); + AssertTrueIsDisplayed(notesAddDetailsSaveBttn); + AssertTrueIsDisplayed(notesAddDetailsCancelBttn); } public void VerifyNotesEditForm() { - WaitUntilVisible(notesEditCreatedLabel); - Assert.True(webDriver.FindElement(notesEditCreatedLabel).Displayed); - Assert.True(webDriver.FindElement(notesEditCreatedDate).Displayed); - Assert.True(webDriver.FindElement(notesEditCreatedBy).Displayed); + AssertTrueIsDisplayed(notesEditCreatedLabel); + AssertTrueIsDisplayed(notesEditCreatedDate); + AssertTrueIsDisplayed(notesEditCreatedBy); if(webDriver.FindElements(notesEditUpdatedLabel).Count > 0) - Assert.True(webDriver.FindElement(notesEditUpdatedDate).Displayed); + AssertTrueIsDisplayed(notesEditUpdatedDate); - Assert.True(webDriver.FindElement(notesEditUpdatedBy).Displayed); - Assert.True(webDriver.FindElement(notedEditBttn).Displayed); - Assert.True(webDriver.FindElement(noteEditViewTextarea).Displayed); - Assert.True(webDriver.FindElement(notesAddDetailsSaveBttn).Displayed); + AssertTrueIsDisplayed(notesEditUpdatedBy); + AssertTrueIsDisplayed(notedEditBttn); + AssertTrueIsDisplayed(noteEditViewTextarea); + AssertTrueIsDisplayed(notesAddDetailsSaveBttn); } public void VerifyNotesTabListView() { Wait(3000); - Assert.True(webDriver.FindElement(notesTabTitle).Displayed); - Assert.True(webDriver.FindElement(notesTabAddBttn).Displayed); - Assert.True(webDriver.FindElement(notesTabTableHeaderNoteColumn).Displayed); - Assert.True(webDriver.FindElement(notesTabTableHeaderCreatedDateColumn).Displayed); - Assert.True(webDriver.FindElement(notesTabTableHeaderUpdatedByColumn).Displayed); + AssertTrueIsDisplayed(notesTabTitle); + AssertTrueIsDisplayed(notesTabAddBttn); + AssertTrueIsDisplayed(notesTabTableHeaderNoteColumn); + AssertTrueIsDisplayed(notesTabTableHeaderCreatedDateColumn); + AssertTrueIsDisplayed(notesTabTableHeaderUpdatedByColumn); if (webDriver.FindElements(notesTabTableContentTotal).Count > 0) - { - Assert.True(webDriver.FindElement(notesTabTableBody).Displayed); - } + AssertTrueIsDisplayed(notesTabTableBody); else - { - Assert.True(webDriver.FindElement(notesTabTableNoContent).Displayed); - } + AssertTrueIsDisplayed(notesTabTableNoContent); } public int NotesTabCount() { - Wait(); + WaitUntilTableSpinnerDisappear(); return webDriver.FindElements(notesTabTableContentTotal).Count(); } public void VerifyAutomaticNotes(string fileType, string fromStatus, string toStatus) { WaitUntilVisibleText(note1stNoteContent, webDriver.FindElement(note1stNoteContent).Text); - Assert.True(webDriver.FindElement(note1stNoteContent).Text == fileType + " status changed from "+ fromStatus +" to " + toStatus); + AssertTrueContentEquals(note1stNoteContent, fileType + " status changed from "+ fromStatus +" to " + toStatus); } public void VerifyAutomaticNotesCompensation(string CompensationNbr, string fromStatus, string toStatus) { WaitUntilVisibleText(note1stNoteContent, webDriver.FindElement(note1stNoteContent).Text); - Assert.True(webDriver.FindElement(note1stNoteContent).Text == "Compensation Requisition with # " + CompensationNbr + ", changed status from '"+ fromStatus +"' to '" + toStatus + "'"); + AssertTrueContentEquals(note1stNoteContent, "Compensation Requisition with # " + CompensationNbr + ", changed status from '"+ fromStatus +"' to '" + toStatus + "'"); } } } diff --git a/testing/PIMS.Tests.Automation/PageObjects/Projects.cs b/testing/PIMS.Tests.Automation/PageObjects/Projects.cs index 8148a9cf32..f6f37120ee 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/Projects.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/Projects.cs @@ -1,12 +1,13 @@ using OpenQA.Selenium; using PIMS.Tests.Automation.Classes; +using System.Text.RegularExpressions; namespace PIMS.Tests.Automation.PageObjects { public class Projects : PageObjectBase { //Menu Elements - private By projectMenuBttn = By.XPath("//a/label[contains(text(),'Project')]/parent::a"); + private By projectMenuBttn = By.CssSelector("div[data-testid='nav-tooltip-project'] a"); private By createProjectButton = By.XPath("//a[contains(text(),'Create Project')]"); private By projectDetailTabLink = By.CssSelector("a[data-rb-event-key='projectDetails]"); @@ -79,8 +80,9 @@ public class Projects : PageObjectBase private By projectSaveButton = By.XPath("//div[contains(text(),'Save')]/parent::button"); //Modals Elements - private By deleteProductModal = By.CssSelector("div[class='modal-dialog']"); - private By duplicateProjectToast = By.CssSelector("div[class='Toastify__toast-body']"); + private By productDeleteModal = By.CssSelector("div[class='modal-dialog']"); + private By projectDuplicateToast = By.CssSelector("div[class='Toastify__toast-body']"); + private By projectOverrideConfirmationModal = By.CssSelector("div[class='modal-content']"); private SharedModals sharedModals; @@ -218,34 +220,22 @@ public void UpdateProject(Project project) public void UpdateProduct(Product product, int index) { - By productCodeDynamicInput = By.Id("input-products."+ index +".code"); - By productNameDynamicInput = By.Id("input-products."+ index +".description"); By productStartDateDynamicInput = By.Id("datepicker-products."+ index +".startDate"); By productCostEstimateDynamicInput = By.Id("input-products."+ index +".costEstimate"); By productEstimateDateDynamicInput = By.Id("datepicker-products."+ index +".costEstimateDate"); By productObjectiveDynamicInput = By.Id("input-products."+ index +".objective"); By productScopeDynamicInput = By.Id("input-products."+ index +".scope"); - WaitUntilClickable(productCodeDynamicInput); + //Cleaning previous input - if (webDriver.FindElements(productEstimateDateDynamicInput).Count > 0) { ClearInput(productEstimateDateDynamicInput); } - ClearInput(productCodeDynamicInput); - ClearInput(productCodeDynamicInput); - ClearInput(productNameDynamicInput); + if (webDriver.FindElements(productEstimateDateDynamicInput).Count > 0) + ClearInput(productEstimateDateDynamicInput); + ClearInput(productStartDateDynamicInput); ClearInput(productCostEstimateDynamicInput); ClearInput(productObjectiveDynamicInput); ClearInput(productScopeDynamicInput); - - if (product.ProductCode != "") - { - webDriver.FindElement(productCodeDynamicInput).SendKeys(product.ProductCode); - } - if (product.ProductName != "") - { - webDriver.FindElement(productNameDynamicInput).SendKeys(product.ProductName); - } if (product.StartDate != "") { webDriver.FindElement(productStartDateDynamicInput).SendKeys(product.StartDate); @@ -275,8 +265,9 @@ public void DeleteProduct(int productIndex) WaitUntilClickable(deleteButtonElement); webDriver.FindElement(deleteButtonElement).Click(); - if (webDriver.FindElements(deleteProductModal).Count > 0) + if (webDriver.FindElements(productDeleteModal).Count > 0) { + Wait(); Assert.True(sharedModals.ModalHeader().Equals("Remove Product")); Assert.True(sharedModals.ModalContent().Equals("Deleting this product will remove it from all \"Product\" dropdowns. Are you certain you wish to proceed?")); sharedModals.ModalClickOKBttn(); @@ -287,6 +278,18 @@ public void SaveProject() { WaitUntilClickable(projectSaveButton); FocusAndClick(projectSaveButton); + + Wait(); + if (webDriver.FindElements(projectOverrideConfirmationModal).Count() > 0) + { + if (sharedModals.ModalHeader().Equals("User Override Required")) + { + Assert.Contains("can also be found in one or more other projects. Please verify the correct product is being added", sharedModals.ModalContent()); + } + sharedModals.ModalClickOKBttn(); + } + + AssertTrueIsDisplayed(projectEditButton); } public void CancelProject() @@ -297,33 +300,34 @@ public void CancelProject() public void VerifyCreateProjectForm() { - WaitUntilVisible(projectNameLabel); - Assert.True(webDriver.FindElement(projectCreateTitle).Displayed); - Assert.True(webDriver.FindElement(projectInstructionParagraph).Displayed); - - Assert.True(webDriver.FindElement(projectNameLabel).Displayed); - Assert.True(webDriver.FindElement(projectNameInput).Displayed); - Assert.True(webDriver.FindElement(projectNumberLabel).Displayed); - Assert.True(webDriver.FindElement(projectNumberInput).Displayed); - Assert.True(webDriver.FindElement(projectStatusLabel).Displayed); - Assert.True(webDriver.FindElement(projectStatusSelect).Displayed); - Assert.True(webDriver.FindElement(projectMOTIRegionLabel).Displayed); - Assert.True(webDriver.FindElement(projectMOTIRegionInput).Displayed); - Assert.True(webDriver.FindElement(projectSummaryLabel).Displayed); - Assert.True(webDriver.FindElement(projectSummaryTextarea).Displayed); - - Assert.True(webDriver.FindElement(projectCostTypeLabel).Displayed); - Assert.True(webDriver.FindElement(projectCostTypeSelect).Displayed); - Assert.True(webDriver.FindElement(projectWorkActivityLabel).Displayed); - Assert.True(webDriver.FindElement(projectWorkActivitySelect).Displayed); - Assert.True(webDriver.FindElement(projectBusinessFunctionLabel).Displayed); - Assert.True(webDriver.FindElement(projectBusinessFunctionSelect).Displayed); - - Assert.True(webDriver.FindElement(projectAssociatedProdsSubtitle).Displayed); - Assert.True(webDriver.FindElement(projectAddProductButton).Displayed); + Wait(2000); - Assert.True(webDriver.FindElement(projectCancelButton).Displayed); - Assert.True(webDriver.FindElement(projectSaveButton).Displayed); + AssertTrueIsDisplayed(projectCreateTitle); + AssertTrueIsDisplayed(projectInstructionParagraph); + + AssertTrueIsDisplayed(projectNameLabel); + AssertTrueIsDisplayed(projectNameInput); + AssertTrueIsDisplayed(projectNumberLabel); + AssertTrueIsDisplayed(projectNumberInput); + AssertTrueIsDisplayed(projectStatusLabel); + AssertTrueIsDisplayed(projectStatusSelect); + AssertTrueIsDisplayed(projectMOTIRegionLabel); + AssertTrueIsDisplayed(projectMOTIRegionInput); + AssertTrueIsDisplayed(projectSummaryLabel); + AssertTrueIsDisplayed(projectSummaryTextarea); + + AssertTrueIsDisplayed(projectCostTypeLabel); + AssertTrueIsDisplayed(projectCostTypeSelect); + AssertTrueIsDisplayed(projectWorkActivityLabel); + AssertTrueIsDisplayed(projectWorkActivitySelect); + AssertTrueIsDisplayed(projectBusinessFunctionLabel); + AssertTrueIsDisplayed(projectBusinessFunctionSelect); + + AssertTrueIsDisplayed(projectAssociatedProdsSubtitle); + AssertTrueIsDisplayed(projectAddProductButton); + + AssertTrueIsDisplayed(projectCancelButton); + AssertTrueIsDisplayed(projectSaveButton); } public void VerifyCreateProductForm() @@ -331,20 +335,20 @@ public void VerifyCreateProductForm() WaitUntilClickable(projectAddProductButton); webDriver.FindElement(projectAddProductButton).Click(); - WaitUntilVisible(productCodeLabel); - Assert.True(webDriver.FindElement(productCodeLabel).Displayed); - Assert.True(webDriver.FindElement(productCodeInput).Displayed); - Assert.True(webDriver.FindElement(productNameLabel).Displayed); - Assert.True(webDriver.FindElement(productNameInput).Displayed); - Assert.True(webDriver.FindElement(productStartDateLabel).Displayed); - Assert.True(webDriver.FindElement(productStartDateInput).Displayed); - Assert.True(webDriver.FindElement(productCostEstimateLabel).Displayed); - Assert.True(webDriver.FindElement(productCostEstimateInput).Displayed); - Assert.True(webDriver.FindElement(productObjectiveLabel).Displayed); - Assert.True(webDriver.FindElement(productObjectiveInput).Displayed); - Assert.True(webDriver.FindElement(productScopeLabel).Displayed); - Assert.True(webDriver.FindElement(productScopeInput).Displayed); - Assert.True(webDriver.FindElement(productDeleteButton).Displayed); + Wait(); + AssertTrueIsDisplayed(productCodeLabel); + AssertTrueIsDisplayed(productCodeInput); + AssertTrueIsDisplayed(productNameLabel); + AssertTrueIsDisplayed(productNameInput); + AssertTrueIsDisplayed(productStartDateLabel); + AssertTrueIsDisplayed(productStartDateInput); + AssertTrueIsDisplayed(productCostEstimateLabel); + AssertTrueIsDisplayed(productCostEstimateInput); + AssertTrueIsDisplayed(productObjectiveLabel); + AssertTrueIsDisplayed(productObjectiveInput); + AssertTrueIsDisplayed(productScopeLabel); + AssertTrueIsDisplayed(productScopeInput); + AssertTrueIsDisplayed(productDeleteButton); DeleteProduct(1); } @@ -406,86 +410,77 @@ public void VerifyProductViewForm(Product product, int index, string validationT By productScopeContent = By.XPath("//div[contains(text(),'Associated Products')]/parent::div/parent::h2/following-sibling::div/div[" + child + "]/div/div/label[contains(text(),'Scope')]/parent::div/following-sibling::div"); WaitUntilVisible(productStartDateLabel); + if (validationType == "Create") { - Assert.True(webDriver.FindElement(productHeader).Displayed); - Assert.True(webDriver.FindElement(productStartDateLabel).Displayed); - Assert.True(webDriver.FindElement(productStartDateContent).Text.Equals(TransformDateFormat(product.StartDate))); - Assert.True(webDriver.FindElement(productCostEstimateLabel).Displayed); + AssertTrueIsDisplayed(productHeader); + AssertTrueIsDisplayed(productStartDateLabel); + AssertTrueContentEquals(productStartDateContent, TransformDateFormat(product.StartDate)); + AssertTrueIsDisplayed(productCostEstimateLabel); + if (product.EstimateDate != "") - { - Assert.True(webDriver.FindElement(productCostEstimateContent).Text.Equals(TransformCurrencyFormat(product.CostEstimate) + " as of " + TransformDateFormat(product.EstimateDate))); - } + AssertTrueContentEquals(productCostEstimateContent, TransformCurrencyFormat(product.CostEstimate) + " as of " + TransformDateFormat(product.EstimateDate)); else - { - Assert.True(webDriver.FindElement(productCostEstimateContent).Text.Equals(TransformCurrencyFormat(product.CostEstimate) + " no estimate date entered")); - } - Assert.True(webDriver.FindElement(productObjectivesLabel).Displayed); + AssertTrueContentEquals(productCostEstimateContent, TransformCurrencyFormat(product.CostEstimate) + " no estimate date entered"); + + AssertTrueIsDisplayed(productObjectivesLabel); + if (product.Objectives != "") - { - Assert.True(webDriver.FindElement(productObjectivesContent).Text.Equals(product.Objectives)); - } + AssertTrueContentEquals(productObjectivesContent, product.Objectives); else - { - Assert.True(webDriver.FindElement(productObjectivesContent).Text.Equals("no objective entered")); - } - Assert.True(webDriver.FindElement(productScopeLabel).Displayed); + AssertTrueContentEquals(productObjectivesContent, "no objective entered"); + + AssertTrueIsDisplayed(productScopeLabel); if (product.Scope != "") - { - Assert.True(webDriver.FindElement(productScopeContent).Text.Equals(product.Scope)); - } + + AssertTrueContentEquals(productScopeContent, product.Scope); else - { - Assert.True(webDriver.FindElement(productScopeContent).Text.Equals("no scope entered")); - } + AssertTrueContentEquals(productScopeContent, "no scope entered"); } else { - Assert.True(webDriver.FindElement(productHeader).Displayed); - Assert.True(webDriver.FindElement(productStartDateLabel).Displayed); - Assert.True(webDriver.FindElement(productStartDateContent).Text.Equals(TransformDateFormat(product.StartDate))); - Assert.True(webDriver.FindElement(productCostEstimateLabel).Displayed); + AssertTrueIsDisplayed(productHeader); + AssertTrueIsDisplayed(productStartDateLabel); + AssertTrueContentEquals(productStartDateContent, TransformDateFormat(product.StartDate)); + AssertTrueIsDisplayed(productCostEstimateLabel); + if (product.EstimateDate != "") - { - Assert.True(webDriver.FindElement(productCostEstimateContent).Text.Equals(TransformCurrencyFormat(product.CostEstimate) + " as of " + TransformDateFormat(product.EstimateDate))); - } + AssertTrueContentEquals(productCostEstimateContent, TransformCurrencyFormat(product.CostEstimate) + " as of " + TransformDateFormat(product.EstimateDate)); else - { - Assert.True(webDriver.FindElement(productCostEstimateContent).Text.Equals(TransformCurrencyFormat(product.CostEstimate) + " no estimate date entered")); - } - Assert.True(webDriver.FindElement(productObjectivesLabel).Displayed); + AssertTrueContentEquals(productCostEstimateContent, TransformCurrencyFormat(product.CostEstimate) + " no estimate date entered"); + + AssertTrueIsDisplayed(productObjectivesLabel); + if (product.Objectives != "") - { - Assert.True(webDriver.FindElement(productObjectivesContent).Text.Equals(product.Objectives)); - } + AssertTrueContentEquals(productObjectivesContent, product.Objectives); else if (product.Objectives != "") - { - Assert.True(webDriver.FindElement(productObjectivesContent).Text.Equals(product.Objectives)); - } + AssertTrueContentEquals(productObjectivesContent, product.Objectives); else - { - Assert.True(webDriver.FindElement(productObjectivesContent).Text.Equals("no objective entered")); - } - Assert.True(webDriver.FindElement(productScopeLabel).Displayed); + AssertTrueContentEquals(productObjectivesContent, "no objective entered"); + + AssertTrueIsDisplayed(productScopeLabel); if (product.Scope != "") - { - Assert.True(webDriver.FindElement(productScopeContent).Text.Equals(product.Scope)); - } + AssertTrueContentEquals(productScopeContent, product.Scope); else if (product.Scope != "") - { - Assert.True(webDriver.FindElement(productScopeContent).Text.Equals(product.Scope)); - } - else - { - Assert.True(webDriver.FindElement(productScopeContent).Text.Equals("no scope entered")); - } + AssertTrueContentEquals(productScopeContent, product.Scope); + else + AssertTrueContentEquals(productScopeContent, "no scope entered"); } } - public Boolean duplicateProject() + public Boolean DuplicateProject() { Wait(); - return webDriver.FindElements(duplicateProjectToast).Count > 0; + return webDriver.FindElements(projectDuplicateToast).Count > 0; + } + + public string GetProjectName() + { + WaitUntilVisible(projectHeaderProjectNameContent); + + var totalProjectName = webDriver.FindElement(projectHeaderProjectNameContent).Text; + return Regex.Match(totalProjectName, "[^ ]* (.*)").Groups[1].Value; } + } } diff --git a/testing/PIMS.Tests.Automation/PageObjects/ResearchFiles.cs b/testing/PIMS.Tests.Automation/PageObjects/ResearchFiles.cs index 42bc697cee..1997cd169a 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/ResearchFiles.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/ResearchFiles.cs @@ -8,7 +8,7 @@ namespace PIMS.Tests.Automation.PageObjects public class ResearchFiles : PageObjectBase { //Research File Menu options - private By menuResearchButton = By.XPath("//a/label[contains(text(),'Research')]/parent::a"); + private By menuResearchButton = By.CssSelector("div[data-testid='nav-tooltip-research'] a"); private By createResearchFileButton = By.XPath("//a[contains(text(),'Create a Research File')]"); //File Details Tab Element diff --git a/testing/PIMS.Tests.Automation/PageObjects/SearchAcquisitionFiles.cs b/testing/PIMS.Tests.Automation/PageObjects/SearchAcquisitionFiles.cs index 9deb53d438..01b6521f98 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/SearchAcquisitionFiles.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/SearchAcquisitionFiles.cs @@ -7,7 +7,7 @@ namespace PIMS.Tests.Automation.PageObjects { public class SearchAcquisitionFiles : PageObjectBase { - private By menuAcquisitionButton = By.XPath("//a/label[contains(text(),'Acquisition')]/parent::a"); + private By menuAcquisitionButton = By.CssSelector("div[data-testid='nav-tooltip-acquisition'] a"); private By searchAcquisitionButton = By.XPath("//a[contains(text(),'Manage Acquisition Files')]"); //Acquisition File Search Filters Elements @@ -25,12 +25,16 @@ public class SearchAcquisitionFiles : PageObjectBase //Acquisition Files List Elements private By searchAcquisitionFileNumberHeader = By.XPath("//div[@role='table']/div[@class='thead thead-light']/div/div/div[contains(text(),'Acquisition file #')]"); + private By searchAcquisitionOrderFileNumberBttn = By.CssSelector("div[data-testid='sort-column-fileNumber']"); + private By searchAcquisitionLegacyNumberHeader = By.XPath("//div[@role='table']/div[@class='thead thead-light']/div/div/div[contains(text(),'Historical file #')]"); + private By searchAcquisitionOrderLegacyNumberBttn = By.CssSelector("div[data-testid='sort-column-legacyFileNumber']"); private By searchAcquisitionFileNameHeader = By.XPath("//div[@role='table']/div[@class='thead thead-light']/div/div/div[contains(text(),'Acquisition file name')]"); + private By searchAcquisitionOrderFileNameBttn = By.CssSelector("div[data-testid='sort-column-fileName']"); private By searchAcquisitionFileMOTIRegionHeader = By.XPath("//div[@role='table']/div[@class='thead thead-light']/div/div/div[contains(text(),'MOTI Region')]"); private By searchAcquisitionFileProjectHeader = By.XPath("//div[@role='table']/div[@class='thead thead-light']/div/div/div[contains(text(),'Project')]"); private By searchAcquisitionFileAddressHeader = By.XPath("//div[@role='table']/div[@class='thead thead-light']/div/div/div[contains(text(),'Civic Address')]"); private By searchAcquisitionFileStatusHeader = By.XPath("//div[@role='table']/div[@class='thead thead-light']/div/div/div[contains(text(),'Status')]"); - private By searchAcquisitionFileTableContent = By.XPath("//div[@role='table']/div[@class='tbody']/div"); + private By searchAcquisitionFileTableContent = By.CssSelector("div[data-testid='acquisitionFilesTable'] div[class='tbody'] div[class='tr-wrapper']"); //Search Acquisition File Pagination private By searchAcquisitionFilePaginationMenu = By.CssSelector("div[class='Menu-root']"); @@ -93,6 +97,24 @@ public void SearchLastAcquisitionFile() webDriver.FindElement(searchAcquisitionFileSortByAFileBttn).Click(); } + public void OrderByAcquisitionFileNumber() + { + WaitUntilClickable(searchAcquisitionOrderFileNumberBttn); + webDriver.FindElement(searchAcquisitionOrderFileNumberBttn).Click(); + } + + public void OrderByAcquisitionFileHistoricalNumber() + { + WaitUntilClickable(searchAcquisitionOrderLegacyNumberBttn); + webDriver.FindElement(searchAcquisitionOrderLegacyNumberBttn).Click(); + } + + public void OrderByAcquisitionFileName() + { + WaitUntilClickable(searchAcquisitionOrderFileNameBttn); + webDriver.FindElement(searchAcquisitionOrderFileNameBttn).Click(); + } + public void SelectFirstOption() { WaitUntilClickable(searchAcquisitionFile1stResultLink); @@ -122,6 +144,30 @@ public Boolean SearchFoundResults() return webDriver.FindElements(searchAcquisitionFile1stResult).Count > 0; } + public string FirstAcquisitionFileNumber() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(searchAcquisitionFile1stResultLink).Text; + } + + public string FirstAcquisitionLegacyFileNumber() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(searchAcquisitionFile1stResultHistoricalFile).Text; + } + + public string FirstAcquisitionFileName() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(searchAcquisitionFile1stResultName).Text; + } + + public int AcquisitionFileTableResultNumber() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElements(searchAcquisitionFileTableContent).Count; + } + public void VerifyAcquisitionFileListView() { Wait(); @@ -141,7 +187,11 @@ public void VerifyAcquisitionFileListView() //Acquisition Files List View AssertTrueIsDisplayed(searchAcquisitionFileNumberHeader); + AssertTrueIsDisplayed(searchAcquisitionOrderFileNumberBttn); + AssertTrueIsDisplayed(searchAcquisitionLegacyNumberHeader); + AssertTrueIsDisplayed(searchAcquisitionOrderLegacyNumberBttn); AssertTrueIsDisplayed(searchAcquisitionFileNameHeader); + AssertTrueIsDisplayed(searchAcquisitionOrderFileNameBttn); AssertTrueIsDisplayed(searchAcquisitionFileMOTIRegionHeader); AssertTrueIsDisplayed(searchAcquisitionFileProjectHeader); AssertTrueIsDisplayed(searchAcquisitionFileAddressHeader); @@ -160,7 +210,7 @@ public void VerifyAcquisitionFileTableContent(AcquisitionFile acquisition) AssertTrueContentEquals(searchAcquisitionFile1stResultName, acquisition.AcquisitionFileName); AssertTrueContentEquals(searchAcquisitionFile1stResultMOTIRegion, acquisition.AcquisitionMOTIRegion); AssertTrueContentEquals(searchAcquisitionFile1stResultProject, acquisition.AcquisitionProjCode + " " + acquisition.AcquisitionProject); - Assert.True(webDriver.FindElements(searchAcquisitionFile1stResultAddress).Count() > 0); + Assert.True(webDriver.FindElements(searchAcquisitionFile1stResultAddress).Count().Equals(0)); AssertTrueContentEquals(searchAcquisitionFile1stResultStatus, acquisition.AcquisitionStatus); } } diff --git a/testing/PIMS.Tests.Automation/PageObjects/SearchContacts.cs b/testing/PIMS.Tests.Automation/PageObjects/SearchContacts.cs index 8f243f7789..d8b9a4e27b 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/SearchContacts.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/SearchContacts.cs @@ -5,7 +5,7 @@ namespace PIMS.Tests.Automation.PageObjects { public class SearchContacts : PageObjectBase { - private By menuContactsButton = By.XPath("//a/label[contains(text(),'Contacts')]/parent::a"); + private By menuContactsButton = By.CssSelector("div[data-testid='nav-tooltip-contacts'] a"); private By searchContactButton = By.XPath("//a[contains(text(),'Manage Contacts')]"); private By searchContactOrgRadioBttn = By.Id("input-organizations"); diff --git a/testing/PIMS.Tests.Automation/PageObjects/SearchLease.cs b/testing/PIMS.Tests.Automation/PageObjects/SearchLease.cs index 3ef170565f..b185f02b21 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/SearchLease.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/SearchLease.cs @@ -7,7 +7,7 @@ namespace PIMS.Tests.Automation.PageObjects public class SearchLease : PageObjectBase { //Main Menu Elements - private By menuManagementButton = By.XPath("//a/label[contains(text(),'Management')]/parent::a"); + private By menuManagementButton = By.CssSelector("div[data-testid='nav-tooltip-leases&licenses'] a"); private By searchLicenseButton = By.XPath("//a[contains(text(),'Manage Lease/License Files')]"); private By searchLicenseTitle = By.XPath("//h3[contains(text(),'Leases & Licenses')]"); diff --git a/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs b/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs index 380989cdbc..851cd7efa2 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs @@ -9,7 +9,7 @@ namespace PIMS.Tests.Automation.PageObjects public class SearchProjects : PageObjectBase { //Menu Elements - private By projectMenuBttn = By.XPath("//a/label[contains(text(),'Project')]/parent::a"); + private By projectMenuBttn = By.CssSelector("div[data-testid='nav-tooltip-project'] a"); private By manageProjectButton = By.XPath("//a[contains(text(),'Manage Project')]"); //Search Projects Filters Elements @@ -24,13 +24,18 @@ public class SearchProjects : PageObjectBase //Search Projects Table Column header Elements private By searchProjectNbrHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Project #')]"); + private By searchProjectNbrOrderBttn = By.CssSelector("div[data-testid='sort-column-code']"); private By searchProjectNameHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Project name')]"); + private By searchProjectNameOrderBttn = By.CssSelector("div[data-testid='sort-column-description']"); private By searchProjectRegionHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Region')]"); private By searchProjectStatusHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Status')]"); private By searchProjectLastUpdatedByHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Last updated by')]"); + private By searchProjectLastUpdatedByOrderBttn = By.CssSelector("div[data-testid='sort-column-lastUpdatedBy']"); private By searchProjectUpdatedDateHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Updated date')]"); + private By searchProjectLastUpdatedDateOrderBttn = By.CssSelector("div[data-testid='sort-column-lastUpdatedDate']"); //Search Projects Table 1st result Element + private By searchProject1stResult = By.CssSelector("div[data-testid='projectsTable'] div[class='tbody'] div[class='tr-wrapper']:nth-child(1)"); private By searchProject1stResultNbrLink = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[1]/a"); private By searchProject1stResultNameLink = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[2]/a"); private By searchProject1stResultRegionContent = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[3]"); @@ -41,10 +46,13 @@ public class SearchProjects : PageObjectBase private By searchProjectTotalCount = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper']"); + //Search Projects Pagination elements private By searchProjectShowEntries = By.CssSelector("div[class='Menu-root']"); private By searchProjectPagination = By.CssSelector("ul[class='pagination']"); + public SearchProjects(IWebDriver webDriver) : base(webDriver) {} + //Navigates to Search a Project public void NavigateToSearchProject() { @@ -124,30 +132,54 @@ public void SelectFirstResult() webDriver.FindElement(searchProject1stResultNbrLink).Click(); } + public void OrderByProjectNumber() + { + WaitUntilClickable(searchProjectNbrOrderBttn); + webDriver.FindElement(searchProjectNbrOrderBttn).Click(); + } + + public void OrderByProjectName() + { + WaitUntilClickable(searchProjectNameOrderBttn); + webDriver.FindElement(searchProjectNameOrderBttn).Click(); + } + + public void OrderByProjectLastUpdatedBy() + { + WaitUntilClickable(searchProjectLastUpdatedByOrderBttn); + webDriver.FindElement(searchProjectLastUpdatedByOrderBttn).Click(); + } + + public void OrderByProjectLastUpdatedDate() + { + WaitUntilClickable(searchProjectLastUpdatedDateOrderBttn); + webDriver.FindElement(searchProjectLastUpdatedDateOrderBttn).Click(); + } + public void VerifySearchView() { WaitUntilVisible(searchProjectSubtitle); //Search Projects Filters Section - Assert.True(webDriver.FindElement(searchProjectSubtitle).Displayed); - Assert.True(webDriver.FindElement(searchProjectNumberInput).Displayed); - Assert.True(webDriver.FindElement(searchProjectNameInput).Displayed); - Assert.True(webDriver.FindElement(searchProjectRegionSelect).Displayed); - Assert.True(webDriver.FindElement(searchProjectStatusSelect).Displayed); - Assert.True(webDriver.FindElement(searchProjectButton).Displayed); - Assert.True(webDriver.FindElement(searchProjectResetButton).Displayed); - Assert.True(webDriver.FindElement(searchProjectAddProjectBttn).Displayed); + AssertTrueIsDisplayed(searchProjectSubtitle); + AssertTrueIsDisplayed(searchProjectNumberInput); + AssertTrueIsDisplayed(searchProjectNameInput); + AssertTrueIsDisplayed(searchProjectRegionSelect); + AssertTrueIsDisplayed(searchProjectStatusSelect); + AssertTrueIsDisplayed(searchProjectButton); + AssertTrueIsDisplayed(searchProjectResetButton); + AssertTrueIsDisplayed(searchProjectAddProjectBttn); //Search Projects Table Column header Elements - Assert.True(webDriver.FindElement(searchProjectNbrHeaderColumn).Displayed); - Assert.True(webDriver.FindElement(searchProjectNameHeaderColumn).Displayed); - Assert.True(webDriver.FindElement(searchProjectRegionHeaderColumn).Displayed); - Assert.True(webDriver.FindElement(searchProjectStatusHeaderColumn).Displayed); - Assert.True(webDriver.FindElement(searchProjectLastUpdatedByHeaderColumn).Displayed); - Assert.True(webDriver.FindElement(searchProjectUpdatedDateHeaderColumn).Displayed); - - Assert.True(webDriver.FindElement(searchProjectShowEntries).Displayed); - Assert.True(webDriver.FindElement(searchProjectPagination).Displayed); + AssertTrueIsDisplayed(searchProjectNbrHeaderColumn); + AssertTrueIsDisplayed(searchProjectNameHeaderColumn); + AssertTrueIsDisplayed(searchProjectRegionHeaderColumn); + AssertTrueIsDisplayed(searchProjectStatusHeaderColumn); + AssertTrueIsDisplayed(searchProjectLastUpdatedByHeaderColumn); + AssertTrueIsDisplayed(searchProjectUpdatedDateHeaderColumn); + + AssertTrueIsDisplayed(searchProjectShowEntries); + AssertTrueIsDisplayed(searchProjectPagination); } public void VerifyViewSearchResult(Project project) @@ -155,19 +187,48 @@ public void VerifyViewSearchResult(Project project) DateTime thisDay = DateTime.Today; string today = thisDay.ToString("MMM d, yyyy"); - WaitUntilVisible(searchProject1stResultNbrLink); - Assert.True(webDriver.FindElement(searchProject1stResultNbrLink).Text.Equals(project.Number)); - Assert.True(webDriver.FindElement(searchProject1stResultNameLink).Text.Equals(project.Name)); - Assert.True(webDriver.FindElement(searchProject1stResultRegionContent).Text.Equals(project.ProjectMOTIRegion)); - Assert.True(webDriver.FindElement(searchProject1stResultStatusContent).Text.Equals(project.ProjectStatus)); - Assert.True(webDriver.FindElement(searchProject1stResultLastUpdatedByContent).Text.Equals(project.UpdatedBy)); - Assert.True(webDriver.FindElement(searchProject1stResultLastUpdatedDateContent).Text.Equals(today)); + AssertTrueContentEquals(searchProject1stResultNbrLink, project.Number); + AssertTrueContentEquals(searchProject1stResultNameLink, project.Name); + AssertTrueContentEquals(searchProject1stResultRegionContent, project.ProjectMOTIRegion); + AssertTrueContentEquals(searchProject1stResultStatusContent, project.ProjectStatus); + AssertTrueContentEquals(searchProject1stResultLastUpdatedByContent, project.UpdatedBy); + AssertTrueContentEquals(searchProject1stResultLastUpdatedDateContent, today); } - public int TotalSearchedProjects() + public int ProjectsTableResultNumber() { - Wait(2000); + WaitUntilTableSpinnerDisappear(); return webDriver.FindElements(searchProjectTotalCount).Count(); } + + public Boolean SearchFoundResults() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElements(searchProject1stResult).Count > 0; + } + + public string FirstProjectCode() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(searchProject1stResultNbrLink).Text; + } + + public string FirstProjectName() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(searchProject1stResultNameLink).Text; + } + + public string FirstProjectLastUpdatedBy() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(searchProject1stResultLastUpdatedByContent).Text; + } + + public string FirstProjectLastUpdatedDate() + { + WaitUntilTableSpinnerDisappear(); + return webDriver.FindElement(searchProject1stResultLastUpdatedDateContent).Text; + } } } diff --git a/testing/PIMS.Tests.Automation/PageObjects/SearchResearchFiles.cs b/testing/PIMS.Tests.Automation/PageObjects/SearchResearchFiles.cs index 07df61dc6c..e3d20c6a4c 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/SearchResearchFiles.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/SearchResearchFiles.cs @@ -5,7 +5,7 @@ namespace PIMS.Tests.Automation.PageObjects { public class SearchResearchFiles : PageObjectBase { - private By menuResearchButton = By.XPath("//a/label[contains(text(),'Research')]/parent::a"); + private By menuResearchButton = By.CssSelector("div[data-testid='nav-tooltip-research'] a"); private By searchResearchButton = By.XPath("//a[contains(text(),'Manage Research File')]"); //Search Research File Elements diff --git a/testing/PIMS.Tests.Automation/PageObjects/SharedPagination.cs b/testing/PIMS.Tests.Automation/PageObjects/SharedPagination.cs new file mode 100644 index 0000000000..9eb058274d --- /dev/null +++ b/testing/PIMS.Tests.Automation/PageObjects/SharedPagination.cs @@ -0,0 +1,49 @@ +using OpenQA.Selenium; + +namespace PIMS.Tests.Automation.PageObjects +{ + public class SharedPagination : PageObjectBase + { + //Search Acquisition File Pagination + + private By searchTableEntriesSpan = By.XPath("//span[contains(text(),'Entries')]"); + private By searchTablePagination5 = By.CssSelector("div[title='menu-item-5']"); + private By searchTablePagination10 = By.CssSelector("div[title='menu-item-10']"); + private By searchTablePagination20 = By.CssSelector("div[title='menu-item-20']"); + private By searchTablePagination50 = By.CssSelector("div[title='menu-item-50']"); + private By searchTablePagination100 = By.CssSelector("div[title='menu-item-100']"); + + public SharedPagination(IWebDriver webDriver) : base(webDriver) + {} + + public void ChoosePaginationOption(int pagination) + { + WaitUntilClickable(searchTableEntriesSpan); + webDriver.FindElement(searchTableEntriesSpan).Click(); + + switch (pagination) + { + case 5: + WaitUntilVisible(searchTablePagination5); + webDriver.FindElement(searchTablePagination5).Click(); + break; + case 10: + WaitUntilVisible(searchTablePagination10); + webDriver.FindElement(searchTablePagination10).Click(); + break; + case 20: + WaitUntilClickable(searchTablePagination20); + webDriver.FindElement(searchTablePagination20).Click(); + break; + case 50: + WaitUntilClickable(searchTablePagination50); + webDriver.FindElement(searchTablePagination50).Click(); + break; + case 100: + WaitUntilClickable(searchTablePagination100); + webDriver.FindElement(searchTablePagination100).Click(); + break; + } + } + } +} diff --git a/testing/PIMS.Tests.Automation/StepDefinitions/AcquisitionFileSteps.cs b/testing/PIMS.Tests.Automation/StepDefinitions/AcquisitionFileSteps.cs index 23af72dbfe..6a15f7b640 100644 --- a/testing/PIMS.Tests.Automation/StepDefinitions/AcquisitionFileSteps.cs +++ b/testing/PIMS.Tests.Automation/StepDefinitions/AcquisitionFileSteps.cs @@ -15,6 +15,7 @@ public class AcquisitionFileSteps private readonly AcquisitionFilesDetails acquisitionFilesDetails; private readonly SearchAcquisitionFiles searchAcquisitionFiles; private readonly SharedSearchProperties sharedSearchProperties; + private readonly SharedPagination sharedPagination; private readonly SearchProperties searchProperties; private readonly AcquisitionProperties acquisitionProperties; private readonly AcquisitionTakes acquisitionTakes; @@ -27,7 +28,6 @@ public class AcquisitionFileSteps private readonly Notes notes; private readonly string userName = "TRANPSP1"; - //private readonly string userName = "sutairak"; private AcquisitionFile acquisitionFile; protected string acquisitionFileCode = ""; @@ -41,6 +41,7 @@ public AcquisitionFileSteps(BrowserDriver driver) acquisitionFilesDetails = new AcquisitionFilesDetails(driver.Current); searchAcquisitionFiles = new SearchAcquisitionFiles(driver.Current); sharedSearchProperties = new SharedSearchProperties(driver.Current); + sharedPagination = new SharedPagination(driver.Current); searchProperties = new SearchProperties(driver.Current); acquisitionProperties = new AcquisitionProperties(driver.Current); acquisitionTakes = new AcquisitionTakes(driver.Current); @@ -56,7 +57,7 @@ public AcquisitionFileSteps(BrowserDriver driver) [StepDefinition(@"I create a new Acquisition File from row number (.*)")] public void CreateAcquisitionFile(int rowNumber) { - /* TEST COVERAGE: PSP-4163, PSP-4164, PSP-4323, PSP-4553 */ + /* TEST COVERAGE: PSP-4163, PSP-4164, PSP-4165, PSP-4323, PSP-4472, PSP-4553 */ //Login to PIMS loginSteps.Idir(userName); @@ -81,7 +82,7 @@ public void CreateAcquisitionFile(int rowNumber) [StepDefinition(@"I add additional information to the Acquisition File Details")] public void AddAdditionalInfoAcquisitionFile() { - /* TEST COVERAGE: PSP-4469, PSP-4471, PSP-4553, PSP-5308, PSP-5590, PSP-5634, PSP-5637, PSP-5790, PSP-6041 */ + /* TEST COVERAGE: PSP-4469, PSP-4471, PSP-4553, PSP-5308, PSP-5590, PSP-5634, PSP-5637, PSP-5790, PSP-5979, PSP-6041 */ //Enter to Edit mode of Acquisition File acquisitionFilesDetails.EditAcquisitionFileBttn(); @@ -106,7 +107,7 @@ public void AddAdditionalInfoAcquisitionFile() [StepDefinition(@"I update the File details from an existing Acquisition File from row number (.*)")] public void UpdateFileDetails(int rowNumber) { - /* TEST COVERAGE: PSP-4331, PSP-4544, PSP-4545, PSP-5638, PSP-5639, PSP-5970 */ + /* TEST COVERAGE: PSP-4331, PSP-4544, PSP-4545, PSP-5638, PSP-5639, PSP-5970, PSP-5979s */ PopulateAcquisitionFile(rowNumber); @@ -775,7 +776,7 @@ public void UpdateExpropriation(int rowNumber) [StepDefinition(@"I create an Acquisition File from a pin on map from row number (.*)")] public void CreateAcquisitionFileFromPin(int rowNumber) { - /* TEST COVERAGE: PSP-1546, PSP-1556, PSP-4164, PSP-4167, PSP-4601, PSP-4704, PSP-5308 */ + /* TEST COVERAGE: PSP-1546, PSP-1556, PSP-4164, PSP-4165, PSP-4167, PSP-4472, PSP-4601, PSP-4704, PSP-5308 */ //Login to PIMS loginSteps.Idir(userName); @@ -880,7 +881,7 @@ public void NavigateMainResearchFileSection() [StepDefinition(@"I search for an existing Acquisition File from row number (.*)")] public void SearchExistingAcquisitionFile(int rowNumber) { - /* TEST COVERAGE: PSP-4252, PSP-5589 */ + /* TEST COVERAGE: PSP-4252, PSP-4255, PSP-5589 */ //Login to PIMS loginSteps.Idir(userName); @@ -889,15 +890,55 @@ public void SearchExistingAcquisitionFile(int rowNumber) PopulateAcquisitionFile(rowNumber); searchAcquisitionFiles.NavigateToSearchAcquisitionFile(); - //Filter research Files - searchAcquisitionFiles.FilterAcquisitionFiles(acquisitionFile.SearchProperties.PID, acquisitionFile.AcquisitionFileName, acquisitionFile.AcquisitionStatus); - Assert.True(searchAcquisitionFiles.SearchFoundResults()); + //Verify Pagination + sharedPagination.ChoosePaginationOption(5); + Assert.Equal(5, searchAcquisitionFiles.AcquisitionFileTableResultNumber()); + + sharedPagination.ChoosePaginationOption(10); + Assert.Equal(10, searchAcquisitionFiles.AcquisitionFileTableResultNumber()); + + sharedPagination.ChoosePaginationOption(20); + Assert.Equal(20, searchAcquisitionFiles.AcquisitionFileTableResultNumber()); + + sharedPagination.ChoosePaginationOption(50); + Assert.Equal(50, searchAcquisitionFiles.AcquisitionFileTableResultNumber()); + + sharedPagination.ChoosePaginationOption(100); + Assert.Equal(100, searchAcquisitionFiles.AcquisitionFileTableResultNumber()); + + //Verify Column Sorting by File Number + searchAcquisitionFiles.OrderByAcquisitionFileNumber(); + var firstFileNbrDescResult = searchAcquisitionFiles.FirstAcquisitionFileNumber(); + + searchAcquisitionFiles.OrderByAcquisitionFileNumber(); + var firstFileNbrAscResult = searchAcquisitionFiles.FirstAcquisitionFileNumber(); + + Assert.NotEqual(firstFileNbrDescResult, firstFileNbrAscResult); + //Verify Column Sorting by Historical File Number + searchAcquisitionFiles.OrderByAcquisitionFileHistoricalNumber(); + var firstHistoricalDescResult = searchAcquisitionFiles.FirstAcquisitionLegacyFileNumber(); + + searchAcquisitionFiles.OrderByAcquisitionFileHistoricalNumber(); + var firstHistoricalAscResult = searchAcquisitionFiles.FirstAcquisitionLegacyFileNumber(); + + Assert.NotEqual(firstHistoricalDescResult, firstHistoricalAscResult); + + //Verify Column Sorting by File Name + searchAcquisitionFiles.OrderByAcquisitionFileName(); + var firstFileNameDescResult = searchAcquisitionFiles.FirstAcquisitionFileName(); + + searchAcquisitionFiles.OrderByAcquisitionFileName(); + var firstFileNameAscResult = searchAcquisitionFiles.FirstAcquisitionFileName(); + + Assert.NotEqual(firstFileNameDescResult, firstFileNameAscResult); + + //Filter research Files searchAcquisitionFiles.FilterAcquisitionFiles("003-549-551", "Acquisition from Jonathan Doe", "Cancelled"); Assert.False(searchAcquisitionFiles.SearchFoundResults()); //Look for the last created research file - searchAcquisitionFiles.FilterAcquisitionFiles(acquisitionFile.SearchProperties.PID, acquisitionFile.AcquisitionFileName, acquisitionFile.AcquisitionStatus); + searchAcquisitionFiles.FilterAcquisitionFiles("", acquisitionFile.AcquisitionFileName, acquisitionFile.AcquisitionStatus); } [StepDefinition(@"A new Acquisition file is created successfully")] @@ -1152,15 +1193,17 @@ private void PopulateTakesCollection(int startRow, int rowsCount) take.SiteContamination = ExcelDataContext.ReadData(i, "SiteContamination"); take.TakeDescription = ExcelDataContext.ReadData(i, "TakeDescription"); - take.IsNewRightWay = ExcelDataContext.ReadData(i, "IsNewRightWay"); - take.IsNewRightWayArea = ExcelDataContext.ReadData(i, "IsNewRightWayArea"); - take.IsStatutoryRightWay = ExcelDataContext.ReadData(i, "IsStatutoryRightWay"); - take.IsStatutoryRightWayArea = ExcelDataContext.ReadData(i, "IsStatutoryRightWayArea"); + take.IsNewHighwayDedication = ExcelDataContext.ReadData(i, "IsNewHighwayDedication"); + take.IsNewHighwayDedicationArea = ExcelDataContext.ReadData(i, "IsNewHighwayDedicationArea"); + take.IsMotiInventory = ExcelDataContext.ReadData(i, "IsMotiInventory"); + + take.IsNewInterestLand = ExcelDataContext.ReadData(i, "IsNewInterestLand"); + take.IsNewInterestLandArea = ExcelDataContext.ReadData(i, "IsNewInterestLandArea"); - take.IsLandNotation = ExcelDataContext.ReadData(i, "IsLandNotation"); - take.IsLandNotationDetail = ExcelDataContext.ReadData(i, "IsLandNotationDetail"); - take.IsLandNotationArea = ExcelDataContext.ReadData(i, "IsLandNotationArea"); - take.IsLandNotationDate = ExcelDataContext.ReadData(i, "IsLandNotationDate"); + take.IsLandActTenure = ExcelDataContext.ReadData(i, "IsLandActTenure"); + take.IsLandActTenureDetail = ExcelDataContext.ReadData(i, "IsLandActTenureDetail"); + take.IsLandActTenureArea = ExcelDataContext.ReadData(i, "IsLandActTenureArea"); + take.IsLandActTenureDate = ExcelDataContext.ReadData(i, "IsLandActTenureDate"); take.IsLicenseConstruct = ExcelDataContext.ReadData(i, "IsLicenseConstruct"); take.IsLicenseConstructArea = ExcelDataContext.ReadData(i, "IsLicenseConstructArea"); diff --git a/testing/PIMS.Tests.Automation/StepDefinitions/ActivitiesSteps.cs b/testing/PIMS.Tests.Automation/StepDefinitions/ActivitiesSteps.cs deleted file mode 100644 index 2b835cceaf..0000000000 --- a/testing/PIMS.Tests.Automation/StepDefinitions/ActivitiesSteps.cs +++ /dev/null @@ -1,316 +0,0 @@ -using Microsoft.Extensions.Configuration; -using PIMS.Tests.Automation.Classes; - -namespace PIMS.Tests.Automation.StepDefinitions -{ - [Binding] - public class ActivitiesSteps - { - private readonly Activities activities; - private readonly Notes notes; - private readonly DigitalDocuments digitalDocuments; - private readonly IEnumerable documentFiles; - - private string activityDescription = "Automated Test - Description on activity"; - private string note1 = "Automated Test - Inserting a new note"; - private string note2 = "Automated Test - Editing existing note"; - private string note3 = "Automated Test - Editing existing note for second time"; - - private string dateSigned = "03/10/2020"; - private string motiFile = "1245-6778"; - private string pid = "004-537-360"; - private string roadName = "Automated Test Road"; - private string transferNbr = "9090876-1234"; - - private string gazettePage = "67"; - private string publishedDate = "04/15/2020"; - private string gazetteType = "Testing Gazette"; - private string legalPlan = "334-090980"; - private string LTSASchedule = "23-0909"; - private string motiPlan = "234-898999"; - - protected int totalDigitalDocumentsUploaded = 0; - - public ActivitiesSteps(BrowserDriver driver) - { - //activities = new Activities(driver.Current); - notes = new Notes(driver.Current); - digitalDocuments = new DigitalDocuments(driver.Current); - documentFiles = driver.Configuration.GetSection("UploadDocuments").Get>(); - } - - //[StepDefinition(@"I create a new activity")] - //public void CreateActivityWithproperties() - //{ - // /* TEST COVERAGE: PSP-4364, PSP-4363, PSP-4361, PSP-4360, PSP-4169, PSP-4170, PSP-4683, PSP-4478, PSP-4479, PSP-4275 */ - - // //Acess the activity tab - // activities.AccessActivitiesTab(); - - // //Create new activity - // activities.CreateNewActivity("General"); - - // //Verify activities list view - // activities.VerifyActivityListView(); - - // //Verify activity Details view - // activities.VerifyActivityDetails(); - - // //Filter Activities - // activities.FilterActivities(); - - // //Select All Properties - // activities.SelectAllProperties(); - - // //Deselect All Properties - // activities.DesectAllProperties(); - //} - - //[StepDefinition(@"I create and delete an activity")] - //public void CreateDeleteActivity() - //{ - // /* TEST COVERAGE: PSP-4275, PSP-4362, PSP-4477, PSP-4784, PSP-4785 */ - - // //Acess the activity tab - // activities.AccessActivitiesTab(); - - // //Create new activity - // activities.CreateNewActivity("General"); - - // //Verify activities list view - // activities.VerifyActivityListView(); - - // //Verify activity Details view - // activities.VerifyActivityDetails(); - - // //Check No Properties pop-up - // activities.NoProperties(); - - // //Change Status to Completed - // activities.ChangeStatus("Completed"); - // Assert.True(activities.IsActivityBlocked()); - // activities.CancelActivityChanges(); - - // //Change Status to In Progress - // activities.ChangeStatus("In Progress"); - // Assert.False(activities.IsActivityBlocked()); - // activities.CancelActivityChanges(); - - // //Change Status to Cancel - // activities.ChangeStatus("Cancelled"); - // Assert.True(activities.IsActivityBlocked()); - // activities.CancelActivityChanges(); - - // //Delete Activity - // activities.DeleteActivity(); - - //} - - //[StepDefinition(@"I create an activity with notes and delete notes")] - //public void ActivityWithNotes() - //{ - // /* TEST COVERAGE: PSP-4006, PSP-4008, PSP-4009, PSP-4010, PSP-4012, PSP-4013, PSP-4019, PSP-4021 */ - - // //Acess the activity tab - // activities.AccessActivitiesTab(); - - // //Create new activity - // activities.CreateNewActivity("File Document"); - - // //Add a new note - // notes.AddNewNote(); - - // //Verify New Note Create Form - // notes.VerifyNotesAddNew(); - - // //Create New Note - // notes.AddNewNoteDetails(note1); - - // //Save New Note - // notes.SaveNote(); - - // //Edit existing note - // notes.ViewFirstNoteButton(); - - // //Verify edit note form - // notes.VerifyNotesEditForm(); - - // //Save edited note - // notes.EditNote(note2); - // notes.SaveNote(); - - // //Edit existed note - // notes.ViewFirstNoteButton(); - // notes.EditNote(note3); - - // //Cancel edited note - // notes.CancelNote(); - - // //Create new note - // notes.AddNewNote(); - // notes.AddNewNoteDetails(note1); - - // //Cancel new note - // notes.CancelNote(); - - // //Verify List view UI/UX - // notes.VerifyNotesListView(); - - // //Delete created note - // notes.DeleteFirstNote(); - //} - - //[StepDefinition(@"I create an Acquisition File with activity and a document attached")] - //public void ActivityWithDocuments() - //{ - // /* TEST COVERAGE: PSP-4159, PSP-4339, PSP-4340, PSP-4341 PSP-4342, PSP-4343, PSP-4344, PSP-4345, PSP-4346, PSP-4347, PSP-4348, PSP-4349, PSP-4350, PSP-4351, PSP-4352, PSP-4353, PSP-4354, PSP-4355, PSP-4356, PSP-4357 */ - - // //Access the activity tab - // activities.AccessActivitiesTab(); - - // //Create new activity - // activities.CreateNewActivity("File Document"); - - // //Get total uploaded documents - // totalDigitalDocumentsUploaded = digitalDocuments.GetTotalUploadedDocuments(); - - // //Add a New Document - // digitalDocuments.AddNewDocument(); - - // //Verify different types of document types - // digitalDocuments.VerifyDocumentFields("BC assessment search"); - // digitalDocuments.VerifyDocumentFields("Privy council"); - // digitalDocuments.VerifyDocumentFields("Photos / Images/ Video"); - // digitalDocuments.VerifyDocumentFields("PA plans / Design drawings"); - // digitalDocuments.VerifyDocumentFields("Other"); - // digitalDocuments.VerifyDocumentFields("OIC"); - // digitalDocuments.VerifyDocumentFields("MoTI plan"); - // digitalDocuments.VerifyDocumentFields("Miscellaneous notes (LTSA)"); - // digitalDocuments.VerifyDocumentFields("Ministerial order"); - // digitalDocuments.VerifyDocumentFields("Title search / Historical title"); - // digitalDocuments.VerifyDocumentFields("Legal survey plan"); - // digitalDocuments.VerifyDocumentFields("Historical file"); - // digitalDocuments.VerifyDocumentFields("Gazette"); - // digitalDocuments.VerifyDocumentFields("Field notes"); - // digitalDocuments.VerifyDocumentFields("District road register"); - // digitalDocuments.VerifyDocumentFields("Crown grant"); - // digitalDocuments.VerifyDocumentFields("Correspondence"); - // digitalDocuments.VerifyDocumentFields("Canada lands survey"); - // digitalDocuments.VerifyDocumentFields("Transfer of administration"); - - // //Upload one digital document - // Random random = new Random(); - // var index = random.Next(0, documentFiles.Count()); - // var document = documentFiles.ElementAt(index); - - // digitalDocuments.UploadDocument(document.Url); - // digitalDocuments.UploadTransferAdminFile(dateSigned, motiFile, pid, roadName, transferNbr); - - // //Save digital document - // digitalDocuments.SaveDigitalDocument(); - //} - - //[StepDefinition(@"I create an Acquisition File with activity and edit attached document")] - //public void ActivityWithDocumentEdited() - //{ - // /* TEST COVERAGE: PSP-4030, PSP-4168, PSP-4335, PSP-4336, PSP-4338 */ - - // //Access the activity tab - // activities.AccessActivitiesTab(); - - // //Create new activity - // activities.CreateNewActivity("File Document"); - - // //Add a New Document - // digitalDocuments.AddNewDocument(); - - // //Upload one digital document - // Random random = new Random(); - // var index = random.Next(0, documentFiles.Count()); - // var document = documentFiles.ElementAt(index); - - // digitalDocuments.UploadDocument(document.Url); - // digitalDocuments.UploadGazetteFile(dateSigned, gazettePage, publishedDate, gazetteType, legalPlan, LTSASchedule, motiPlan, roadName); - - // //Save digital document - // digitalDocuments.SaveDigitalDocument(); - - // //Get total uploaded documents - // totalDigitalDocumentsUploaded = digitalDocuments.GetTotalUploadedDocuments(); - - // //Add new digital document - // digitalDocuments.AddNewDocument(); - // var index2 = random.Next(0, documentFiles.Count()); - // var document2 = documentFiles.ElementAt(index2); - - // digitalDocuments.UploadDocument(document2.Url); - // digitalDocuments.UploadTransferAdminFile(dateSigned, motiFile, pid, roadName, transferNbr); - - // //Cancel uploading a new document - // digitalDocuments.CancelDigitalDocument(); - - // //Edit digital document's details - // digitalDocuments.View1stDocument(); - // digitalDocuments.EditDocument(); - - // //Verify Edit Form - // digitalDocuments.VerifyGazetteEditForm(); - - // //Make changes on the document details - // digitalDocuments.ChangeStatus("Approved"); - - // //Save document's changes - // digitalDocuments.SaveEditDigitalDocument(); - - // //Edit digital document's details - // digitalDocuments.View1stDocument(); - // digitalDocuments.EditDocument(); - // digitalDocuments.ChangeStatus("None"); - - // //Cancel digital document's details - // digitalDocuments.CancelEditDigitalDocument(); - - // //Close Digital Documents Details View - // digitalDocuments.CloseDigitalDocumentViewDetails(); - - // //Delete digital document - // digitalDocuments.Delete1stDocument(); - //} - - //[StepDefinition(@"An activity is created successfully")] - //public void ActivityCreatedSuccess() - //{ - // Assert.True(activities.totalActivities() > 0); - //} - - //[StepDefinition(@"An activity is deleted successfully")] - //public void ActivityDeletedSuccess() - //{ - // Assert.True(activities.totalActivities() == 0); - //} - - //[StepDefinition(@"A note has been deleted successfully")] - //public void NoteDeletedSuccess() - //{ - // Assert.True(notes.NotesTotal() == 0); - //} - - //[StepDefinition(@"A digital document has been uploaded successfully")] - //public void DocumentUploadSuccess() - //{ - // Assert.True(digitalDocuments.GetTotalUploadedDocuments() == totalDigitalDocumentsUploaded + 1); - //} - - //[StepDefinition(@"A digital document has been deleted successfully")] - //public void DocumentDeleteSuccess() - //{ - // Assert.True(digitalDocuments.GetTotalUploadedDocuments() == 0); - //} - - } -} - -//public class DocumentFile -//{ -// public string Url { get; set; } = null!; -//} diff --git a/testing/PIMS.Tests.Automation/StepDefinitions/AdminToolSteps.cs b/testing/PIMS.Tests.Automation/StepDefinitions/AdminToolSteps.cs index e6d6f971a6..99ecba8534 100644 --- a/testing/PIMS.Tests.Automation/StepDefinitions/AdminToolSteps.cs +++ b/testing/PIMS.Tests.Automation/StepDefinitions/AdminToolSteps.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Configuration; using PIMS.Tests.Automation.Classes; using PIMS.Tests.Automation.Data; +using PIMS.Tests.Automation.PageObjects; using System.Data; namespace PIMS.Tests.Automation.StepDefinitions @@ -15,6 +16,7 @@ public class AdminToolSteps private readonly DigitalDocuments digitalDocuments; private readonly CDOGSTemplates cdogsTemplates; private readonly FinancialCodes financialCodes; + private readonly SharedPagination sharedPagination; private readonly IEnumerable documentFiles; private readonly string userName = "TRANPSP1"; @@ -30,6 +32,7 @@ public AdminToolSteps(BrowserDriver driver) digitalDocuments = new DigitalDocuments(driver.Current); financialCodes = new FinancialCodes(driver.Current); cdogsTemplates = new CDOGSTemplates(driver.Current); + sharedPagination = new SharedPagination(driver.Current); documentFiles = digitalDocumentSteps.UploadFileDocuments(); financialCode = new FinancialCode(); } @@ -215,6 +218,110 @@ public void DuplicateFinancialCode(int rowNumber) financialCodes.SaveFinancialCode(); } + [StepDefinition(@"I search for an existing Financial Code from row number (.*)")] + public void SearchFinancialCodes(int rowNumber) + { + /* TEST COVERAGE: PSP-5310, PSP-5318 */ + + //Login to PIMS + loginSteps.Idir(userName); + + //Navigate to Admin Tools + PopulateFinancialCode(rowNumber); + manageUsers.NavigateAdminTools(); + + //Navigate to Financial Codes + financialCodes.NavigateAdminFinancialCodes(); + + //Verify Pagination + sharedPagination.ChoosePaginationOption(5); + Assert.Equal(5, financialCodes.CountTotalFinancialCodeResults()); + + sharedPagination.ChoosePaginationOption(10); + Assert.Equal(10, financialCodes.CountTotalFinancialCodeResults()); + + sharedPagination.ChoosePaginationOption(20); + Assert.Equal(20, financialCodes.CountTotalFinancialCodeResults()); + + sharedPagination.ChoosePaginationOption(50); + Assert.Equal(50, financialCodes.CountTotalFinancialCodeResults()); + + sharedPagination.ChoosePaginationOption(100); + Assert.Equal(100, financialCodes.CountTotalFinancialCodeResults()); + + + //Verify Column Sorting by Financial Code Value + financialCodes.OrderByFinancialCodeValue(); + var firstCodeValueDescResult = financialCodes.FirstFinancialCodeValue(); + + financialCodes.OrderByFinancialCodeValue(); + var firstCodeValueAscResult = financialCodes.FirstFinancialCodeValue(); + + Assert.NotEqual(firstCodeValueDescResult, firstCodeValueAscResult); + + //Verify Column Sorting by Financial Code Description + financialCodes.OrderByFinancialCodeDescription(); + var firstFinCodeDescriptionDescResult = financialCodes.FirstFinancialCodeDescription(); + + financialCodes.OrderByFinancialCodeDescription(); + var firstFinCodeDescriptionAscResult = financialCodes.FirstFinancialCodeDescription(); + + Assert.NotEqual(firstFinCodeDescriptionDescResult, firstFinCodeDescriptionAscResult); + + //Verify Column Sorting by Financial Code Type Date + financialCodes.OrderByFinancialCodeType(); + var firstFinCodeTypeDescResult = financialCodes.FirstFinancialCodeType(); + + financialCodes.OrderByFinancialCodeType(); + var firstFinCodeTypeAscResult = financialCodes.FirstFinancialCodeType(); + + Assert.NotEqual(firstFinCodeTypeDescResult, firstFinCodeTypeAscResult); + + //Verify Column Sorting by Financial Code Effective Date + financialCodes.OrderByFinancialCodeEffectiveDate(); + var firstFinCodeEffectiveDateDescResult = financialCodes.FirstFinancialCodeEffectiveDate(); + + financialCodes.OrderByFinancialCodeEffectiveDate(); + var firstFinCodeEffectiveAscResult = financialCodes.FirstFinancialCodeEffectiveDate(); + + Assert.NotEqual(firstFinCodeEffectiveDateDescResult, firstFinCodeEffectiveAscResult); + + //Verify Column Sorting by Financial Code Expiry Date + financialCodes.OrderByFinancialCodeExpiryDate(); + var firstFinCodeExpiryDateDescResult = financialCodes.FirstFinancialCodeExpiryDate(); + + financialCodes.OrderByFinancialCodeExpiryDate(); + var firstFinCodeExpiryDateAscResult = financialCodes.FirstFinancialCodeExpiryDate(); + + Assert.NotEqual(firstFinCodeExpiryDateDescResult, firstFinCodeExpiryDateAscResult); + + + //Filter Financial Codes by Cost Types + financialCodes.FilterFinancialCodeByType("Business function"); + Assert.Equal(financialCodes.FirstFinancialCodeType(), "Business function"); + + financialCodes.FilterFinancialCodeByType("Cost types"); + Assert.Equal(financialCodes.FirstFinancialCodeType(), "Cost types"); + + financialCodes.FilterFinancialCodeByType("Work activity"); + Assert.Equal(financialCodes.FirstFinancialCodeType(), "Work activity"); + + financialCodes.FilterFinancialCodeByType("Chart of accounts"); + Assert.Equal(financialCodes.FirstFinancialCodeType(), "Chart of accounts"); + + financialCodes.FilterFinancialCodeByType("Financial activity"); + Assert.Equal(financialCodes.FirstFinancialCodeType(), "Financial activity"); + + financialCodes.FilterFinancialCodeByType("Responsibility"); + Assert.Equal(financialCodes.FirstFinancialCodeType(), "Responsibility"); + + financialCodes.FilterFinancialCodeByType("Yearly financial"); + Assert.Equal(financialCodes.FirstFinancialCodeType(), "Yearly financial"); + + //Filter by Code Value + financialCodes.FilterFinancialCode(financialCode.CodeValue); + } + [StepDefinition(@"Help Desk rendered successfully")] public void HelpDeskRenderSuccessfully() { diff --git a/testing/PIMS.Tests.Automation/StepDefinitions/DigitalDocumentSteps.cs b/testing/PIMS.Tests.Automation/StepDefinitions/DigitalDocumentSteps.cs index 83c45cf51f..19a54447b0 100644 --- a/testing/PIMS.Tests.Automation/StepDefinitions/DigitalDocumentSteps.cs +++ b/testing/PIMS.Tests.Automation/StepDefinitions/DigitalDocumentSteps.cs @@ -8,6 +8,7 @@ namespace PIMS.Tests.Automation.StepDefinitions public class DigitalDocumentSteps { private readonly DigitalDocuments digitalDocumentsTab; + private readonly SharedPagination sharedPagination; private readonly IEnumerable documentFiles; private int documentsRowStart; private int documentsRowsQuantity; @@ -17,8 +18,8 @@ public class DigitalDocumentSteps public DigitalDocumentSteps(BrowserDriver driver) { digitalDocumentsTab = new DigitalDocuments(driver.Current); + sharedPagination = new SharedPagination(driver.Current); documentFiles = UploadFileDocuments(); - digitalDocumentList = new List(); documentsRowStart = 0; documentsRowsQuantity = 0; } @@ -67,7 +68,8 @@ public void DocumentTabCreate(string fileType, int rowNumber) [StepDefinition(@"I edit a Digital Document for a ""(.*)"" from row number (.*)")] public void UpdateDigitalDocuments(string fileType, int rowNumber) { - /* TEST COVERAGE: PSP-4030, PSP-4168, PSP-4335, PSP-4336, PSP-4338, PSP-5417, PSP-5418, PSP-5420, PSP-5436, PSP-5437, PSP-5439, PSP-5762, PSP-5765, PSP-5930 */ + /* TEST COVERAGE: PSP-4026, PSP-4027, PSP-4030, PSP-4168, PSP-4335, PSP-4336, PSP-4338, PSP-5417, PSP-5418, PSP-5420, PSP-5436, PSP-5437, PSP-5439, PSP-5459, + * PSP-5762, PSP-5765, PSP-5930 */ //Access the documents tab digitalDocumentsTab.NavigateDocumentsTab(); @@ -77,17 +79,19 @@ public void UpdateDigitalDocuments(string fileType, int rowNumber) //Add new digital document digitalDocumentsTab.AddNewDocument(fileType); + digitalDocumentsTab.CreateNewDocumentType(digitalDocumentList[0]); + Random random = new Random(); var index2 = random.Next(0, documentFiles.Count()); var document2 = documentFiles.ElementAt(index2); digitalDocumentsTab.UploadDocument(document2.Url); - digitalDocumentsTab.UpdateNewDocumentType(digitalDocumentList[0]); - + //Cancel uploading a new document digitalDocumentsTab.CancelDigitalDocument(); //Edit digital document's details + digitalDocumentsTab.NavigateToFirstPageDocumentsTable(); digitalDocumentsTab.View1stDocument(); digitalDocumentsTab.EditDocument(); digitalDocumentsTab.UpdateNewDocumentType(digitalDocumentList[0]); @@ -111,6 +115,47 @@ public void UpdateDigitalDocuments(string fileType, int rowNumber) //Close Digital Documents Details View digitalDocumentsTab.CloseDigitalDocumentViewDetails(); + //Verify Pagination Elements + digitalDocumentsTab.VerifyPaginationElements(); + + //Verify Pagination Functionality + sharedPagination.ChoosePaginationOption(5); + Assert.Equal(5, digitalDocumentsTab.DigitalDocumentsTableResultNumber()); + + sharedPagination.ChoosePaginationOption(10); + Assert.Equal(10, digitalDocumentsTab.DigitalDocumentsTableResultNumber()); + + sharedPagination.ChoosePaginationOption(20); + Assert.True(digitalDocumentsTab.DigitalDocumentsTableResultNumber() <= 20); + + //Verify Column Sorting by Document Type + digitalDocumentsTab.OrderByDocumentFileType(); + var firstFileTypeDescResult = digitalDocumentsTab.FirstDocumentFileType(); + + digitalDocumentsTab.OrderByDocumentFileType(); + var firstFileTypeAscResult = digitalDocumentsTab.FirstDocumentFileType(); + + Assert.NotEqual(firstFileTypeDescResult, firstFileTypeAscResult); + + //Verify Column Sorting by Document Type + digitalDocumentsTab.OrderByDocumentFileName(); + var firstFileNameDescResult = digitalDocumentsTab.FirstDocumentFileName(); + + digitalDocumentsTab.OrderByDocumentFileName(); + var firstFileNameAscResult = digitalDocumentsTab.FirstDocumentFileName(); + + Assert.NotEqual(firstFileNameDescResult, firstFileNameAscResult); + + //Verify Column Sorting by File Name + digitalDocumentsTab.OrderByDocumentFileStatus(); + var firstFileStatusDescResult = digitalDocumentsTab.FirstDocumentFileStatus(); + + digitalDocumentsTab.OrderByDocumentFileStatus(); + var firstFileStatusAscResult = digitalDocumentsTab.FirstDocumentFileStatus(); + + Assert.NotEqual(firstFileStatusDescResult, firstFileStatusAscResult); + digitalDocumentsTab.OrderByDocumentFileStatus(); + //Filter Documents by Type digitalDocumentsTab.FilterByType(digitalDocumentList[0].DocumentType); Assert.True(digitalDocumentsTab.TotalSearchDocuments() > 0); @@ -155,6 +200,8 @@ private void PopulateDigitalDocumentIndex(int rowNumber) DataTable documentsIndexSheet = ExcelDataContext.GetInstance().Sheets["DocumentsIndex"]; ExcelDataContext.PopulateInCollection(documentsIndexSheet); + digitalDocumentList = new List(); + documentsRowStart = int.Parse(ExcelDataContext.ReadData(rowNumber, "DigitalDocumentDetailsRowStart")); documentsRowsQuantity = int.Parse(ExcelDataContext.ReadData(rowNumber, "DigitalDocumentsRowEnd")); diff --git a/testing/PIMS.Tests.Automation/StepDefinitions/NotesSteps.cs b/testing/PIMS.Tests.Automation/StepDefinitions/NotesSteps.cs index 2684581cfe..20d9e46429 100644 --- a/testing/PIMS.Tests.Automation/StepDefinitions/NotesSteps.cs +++ b/testing/PIMS.Tests.Automation/StepDefinitions/NotesSteps.cs @@ -1,6 +1,7 @@  using PIMS.Tests.Automation.Classes; using PIMS.Tests.Automation.Data; +using PIMS.Tests.Automation.PageObjects; using System.Data; namespace PIMS.Tests.Automation.StepDefinitions @@ -9,6 +10,7 @@ namespace PIMS.Tests.Automation.StepDefinitions public class NotesSteps { private readonly Notes notes; + private readonly SharedPagination sharedPagination; private readonly GenericSteps genericSteps; private List notesData; @@ -17,6 +19,7 @@ public class NotesSteps public NotesSteps(BrowserDriver driver) { notes = new Notes(driver.Current); + sharedPagination = new SharedPagination(driver.Current); genericSteps = new GenericSteps(driver); notesData = new List(); notesCount = 0; @@ -52,7 +55,7 @@ public void CreateNotesTab(int rowNumber) [StepDefinition(@"I edit a Note on the Notes Tab from row number (.*)")] public void EditNotesTab(int rowNumber) { - /* TEST COVERAGE: PSP-5506, PSP-5507 */ + /* TEST COVERAGE: PSP-4020, PSP-5506, PSP-5507 */ //Navigate to the Notes Tab notes.NavigateNotesTab(); @@ -73,6 +76,13 @@ public void EditNotesTab(int rowNumber) //Save changes notes.SaveNote(); + //Verify Pagination on the list view + sharedPagination.ChoosePaginationOption(5); + Assert.Equal(5, notes.NotesTabCount()); + + sharedPagination.ChoosePaginationOption(10); + Assert.Equal(10, notes.NotesTabCount()); + //Delete Note notesCount = notes.NotesTabCount(); notes.DeleteLastSecondNote(); diff --git a/testing/PIMS.Tests.Automation/StepDefinitions/ProjectSteps.cs b/testing/PIMS.Tests.Automation/StepDefinitions/ProjectSteps.cs index cc492c3ddf..53fbf1257e 100644 --- a/testing/PIMS.Tests.Automation/StepDefinitions/ProjectSteps.cs +++ b/testing/PIMS.Tests.Automation/StepDefinitions/ProjectSteps.cs @@ -1,6 +1,7 @@ using System.Data; using PIMS.Tests.Automation.Data; using PIMS.Tests.Automation.Classes; +using PIMS.Tests.Automation.PageObjects; namespace PIMS.Tests.Automation.StepDefinitions { @@ -10,18 +11,19 @@ public class ProjectSteps private readonly LoginSteps loginSteps; private readonly Projects projects; private readonly SearchProjects searchProjects; + private readonly SharedPagination sharedPagination; private readonly string userName = "TRANPSP1"; private Project project; + protected string projectName = ""; public ProjectSteps(BrowserDriver driver) { loginSteps = new LoginSteps(driver); projects = new Projects(driver.Current); searchProjects = new SearchProjects(driver.Current); - - project = new Project(); + sharedPagination = new SharedPagination(driver.Current); } [StepDefinition(@"I create a new Project from row number (.*)")] @@ -46,66 +48,44 @@ public void CreateProject(int rowNumber) projects.VerifyCreateProductForm(); //Add Products - for (int i = 0; i < project.ProductsCount; i++) + if (project.Products.Count > 0) { - projects.CreateProduct(project.Products[i], i); + for (int i = 0; i < project.ProductsCount; i++) + { + projects.CreateProduct(project.Products[i], i); + } } //Save Project projects.SaveProject(); - } - [StepDefinition(@"I verify The Project View Form")] - public void VerifyCreatedProject() - { + //Get the project's name + projectName = projects.GetProjectName(); + //Verify Project View projects.VerifyProjectViewForm(project); //Verify Products within a Project - for (int i = 0; i < project.ProductsCount; i++) + if (project.Products.Count > 0) { - projects.VerifyProductViewForm(project.Products[i], i, "Create"); + for (int i = 0; i < project.ProductsCount; i++) + { + projects.VerifyProductViewForm(project.Products[i], i, "Create"); + } } } - [StepDefinition(@"I search for an existing project")] - public void SearchExistingProject() - { - /* TEST COVERAGE: */ - - //Navigate to Search a Contact - searchProjects.NavigateToSearchProject(); - - //Look for existing Project by name - searchProjects.SearchProjectByName(project.Name); - } - [StepDefinition(@"I update an existing project from row number (.*)")] public void UpdateProject(int rowNumber) { /* TEST COVERAGE: PSP-5321, PSP-5536, PSP-5537 */ - //Login to PIMS - loginSteps.Idir(userName); - //Navigate to Manage Projects searchProjects.NavigateToSearchProject(); - //Look for Projects by number - searchProjects.SearchProjectByNumber("AU-0003"); - Assert.True(searchProjects.TotalSearchedProjects().Equals(1)); - - //Look for Projects by Region - searchProjects.SearchProjectByRegion("Northern Region"); - Assert.True(searchProjects.TotalSearchedProjects().Equals(10)); - - //Look for Projects by Status - searchProjects.SearchProjectByStatus("Planning (PL)"); - Assert.True(searchProjects.TotalSearchedProjects().Equals(6)); - //Look for existing Project by name PopulateProjectData(rowNumber); - searchProjects.SearchProjectByName(project.Name); + searchProjects.SearchProjectByName(projectName); //Select the 1st found Project searchProjects.SelectFirstResult(); @@ -114,48 +94,134 @@ public void UpdateProject(int rowNumber) projects.UpdateProject(project); //Edit Products - for (int i = 0; i < project.ProductsCount; i++) + if (project.Products.Count > 0) { - projects.UpdateProduct(project.Products[i], i); + for (int i = 0; i < project.ProductsCount; i++) + { + projects.UpdateProduct(project.Products[i], i); + } } //Save Project projects.SaveProject(); + + //Verify Project View + projects.VerifyProjectViewForm(project); + + //Verify Products within a Project + if (project.Products.Count > 0) + { + for (int i = 0; i < project.ProductsCount; i++) + { + projects.VerifyProductViewForm(project.Products[i], i, "Update"); + } + } + } + + [StepDefinition(@"I search for existing Projects from row number (.*)")] + public void SearchExistingProjects(int rowNumber) + { + /* TEST COVERAGE: PSP-5320, PSP-5321, PSP-5322, PSP-5536, PSP-5537 */ + + //Login to PIMS + loginSteps.Idir(userName); + + //Navigate to Manage Projects + PopulateProjectData(rowNumber); + searchProjects.NavigateToSearchProject(); + + //Verify Pagination + sharedPagination.ChoosePaginationOption(5); + Assert.True(searchProjects.ProjectsTableResultNumber().Equals(5)); + + sharedPagination.ChoosePaginationOption(10); + Assert.True(searchProjects.ProjectsTableResultNumber().Equals(10)); + + sharedPagination.ChoosePaginationOption(20); + Assert.True(searchProjects.ProjectsTableResultNumber().Equals(20)); + + sharedPagination.ChoosePaginationOption(50); + Assert.True(searchProjects.ProjectsTableResultNumber().Equals(50)); + + sharedPagination.ChoosePaginationOption(100); + Assert.True(searchProjects.ProjectsTableResultNumber().Equals(100)); + + //Verify Column Sorting by Project Number + searchProjects.OrderByProjectNumber(); + var firstProjectNbrDescResult = searchProjects.FirstProjectCode(); + + searchProjects.OrderByProjectNumber(); + var firstProjectNbrAscResult = searchProjects.FirstProjectCode(); + + Assert.True(firstProjectNbrDescResult != firstProjectNbrAscResult); + + //Verify Column Sorting by Project Name + searchProjects.OrderByProjectName(); + var firstProjectNameResult = searchProjects.FirstProjectName(); + + searchProjects.OrderByProjectName(); + var firstProjectNameAscResult = searchProjects.FirstProjectName(); + + Assert.True(firstProjectNameResult != firstProjectNameAscResult); + + //Verify Column Sorting Last Updated By + searchProjects.OrderByProjectLastUpdatedBy(); + var firstProjectLastUpdatedByDescResult = searchProjects.FirstProjectLastUpdatedBy(); + + searchProjects.OrderByProjectLastUpdatedBy(); + var firstProjectLastUpdatedByAscResult = searchProjects.FirstProjectLastUpdatedBy(); + + Assert.True(firstProjectLastUpdatedByDescResult != firstProjectLastUpdatedByAscResult); + + //Verify Column Sorting Last Updated Date + searchProjects.OrderByProjectLastUpdatedDate(); + var firstProjectLastUpdatedDateDescResult = searchProjects.FirstProjectLastUpdatedDate(); + + searchProjects.OrderByProjectLastUpdatedDate(); + var firstProjectLastUpdatedDateAscResult = searchProjects.FirstProjectLastUpdatedDate(); + + Assert.True(firstProjectLastUpdatedDateDescResult != firstProjectLastUpdatedDateAscResult); + + //Filter Projects by Region + searchProjects.SearchProjectByRegion("Northern Region"); + Assert.True(searchProjects.ProjectsTableResultNumber().Equals(100)); + + //Filter Projects by Status + searchProjects.SearchProjectByStatus("Planning (PL)"); + Assert.True(searchProjects.ProjectsTableResultNumber().Equals(7)); + + //Filter Projects by number + searchProjects.SearchProjectByNumber(project.Number); + Assert.True(searchProjects.ProjectsTableResultNumber().Equals(1)); + } - [StepDefinition(@"I navigate back to Project Details")] - public void NavigateProjectDetails() + [StepDefinition(@"A new Project is created successfully")] + public void VerifyProjectsCreationSuccess() { - projects.NavigateProjectDetails(); + //Navigate to Manage Projects + searchProjects.NavigateToSearchProject(); + searchProjects.SearchProjectByName(projectName); + + Assert.True(searchProjects.SearchFoundResults()); } - [StepDefinition(@"Expected Content is displayed on Projects Table")] + [StepDefinition(@"Expected Project Content is displayed on Projects Table")] public void VerifyProjectsTableContent() { /* TEST COVERAGE: PSP-5319 */ + + //Verify List View searchProjects.VerifySearchView(); searchProjects.VerifyViewSearchResult(project); } - [StepDefinition(@"The Project is updated successfully")] - public void UpdateProjectSuccessfully() - { - //Verify Project View - projects.VerifyProjectViewForm(project); - - //Verify Products within a Project - for (int i = 0; i < project.ProductsCount; i++) - { - projects.VerifyProductViewForm(project.Products[i], i, "Update"); - } - } - [StepDefinition(@"Duplicate Project Alert is displayed")] public void DuplicateProject() { /* TEST COVERAGE: PSP-5670 */ - Assert.True(projects.duplicateProject()); + Assert.True(projects.DuplicateProject()); } private void PopulateProjectData(int rowNumber) @@ -163,6 +229,8 @@ private void PopulateProjectData(int rowNumber) DataTable projectsSheet = ExcelDataContext.GetInstance().Sheets["Projects"]; ExcelDataContext.PopulateInCollection(projectsSheet); + project = new Project(); + project.Number = ExcelDataContext.ReadData(rowNumber, "Number"); project.Name = ExcelDataContext.ReadData(rowNumber, "Name"); project.CodeName = ExcelDataContext.ReadData(rowNumber, "CodeName"); diff --git a/testing/PIMS.Tests.Automation/StepDefinitions/ResearchFileSteps.cs b/testing/PIMS.Tests.Automation/StepDefinitions/ResearchFileSteps.cs index 55f7489a46..0f37e99832 100644 --- a/testing/PIMS.Tests.Automation/StepDefinitions/ResearchFileSteps.cs +++ b/testing/PIMS.Tests.Automation/StepDefinitions/ResearchFileSteps.cs @@ -93,8 +93,8 @@ public void UpdateResearchFileDetails(int rowNumber) researchFiles.NavigateToFileDetailsTab(); //Cancel Changes - researchFiles.EditResearchFileForm(researchFile); - researchFiles.CancelResearchFile(); + //researchFiles.EditResearchFileForm(researchFile); + //researchFiles.CancelResearchFile(); //Save Changes researchFiles.EditResearchFileForm(researchFile);