From 92f49823e4913e515c26c1ec0420235d2a7a559e Mon Sep 17 00:00:00 2001 From: Micheal Date: Wed, 4 Dec 2024 12:15:26 +0530 Subject: [PATCH] Updated Commit --- Chicken Lollipop.jpg | Bin 0 -> 39364 bytes Tandori.jpg | Bin 0 -> 50161 bytes pages/AddressListAPI.js | 17 + pages/AppConfig.js | 39 ++- pages/CatlogPage.js | 23 +- pages/ContentPage.js | 27 ++ pages/Couponpage.js | 65 ++++ pages/Feedback.js | 15 + pages/LoginPage.js | 10 +- pages/NotificationPage.js | 39 +++ pages/OrderPage.js | 8 +- pages/ProductPage.js | 71 +++- pages/RunnerListPage.js | 15 + pages/UserPage.js | 36 ++ tests/AddressListAPI.spec.js | 81 +++++ tests/AppConfig.spec.js | 142 +++++++- tests/CatlogPage.spec.js | 116 ++++++- tests/ContentPage.spec.js | 54 +++ tests/CouponPage.spec.js | 48 +++ tests/Feedback.spec.js | 16 + tests/LoginPage.spec.js | 90 ++++- tests/NotificationPage.spec.js | 13 + tests/OrderPage.spec.js | 118 ++++++- tests/ProductPage.spec.js | 588 +++++++++++++++++++++++++++++++-- tests/RegisterPage.spec.js | 247 ++++++++------ tests/RunnerList.spec.js | 16 + tests/UserPage.spec.js | 42 +++ 27 files changed, 1744 insertions(+), 192 deletions(-) create mode 100644 Chicken Lollipop.jpg create mode 100644 Tandori.jpg create mode 100644 pages/AddressListAPI.js create mode 100644 pages/ContentPage.js create mode 100644 pages/Couponpage.js create mode 100644 pages/Feedback.js create mode 100644 pages/NotificationPage.js create mode 100644 pages/RunnerListPage.js create mode 100644 pages/UserPage.js create mode 100644 tests/AddressListAPI.spec.js create mode 100644 tests/ContentPage.spec.js create mode 100644 tests/CouponPage.spec.js create mode 100644 tests/Feedback.spec.js create mode 100644 tests/NotificationPage.spec.js create mode 100644 tests/RunnerList.spec.js create mode 100644 tests/UserPage.spec.js diff --git a/Chicken Lollipop.jpg b/Chicken Lollipop.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb187418caedd9bcdad79cc58a7ab719d4c0d3ea GIT binary patch literal 39364 zcmb4qRZv{v((T~x?rwt*65QS0oxusgJ;B}G32uYC1cJM}Cb&z`;JKXh-~Zu0-rkR0 zdsly5U#(hut?qxT|F!{`3NrFC04OK`0P5ob{M!IX0^ng`;b39m;o#ul;o%XG(2$X#evOsE=2X z5RtHukg#Y8aS3VvzvEv&01FWc9cmi}iW&fo1qFiz^=}YB3IISu!~Cb*{|z`;7QtVlC@ahuwob~wYlRo3a23GF99KF~D6|xOwi;h%;-wzYXE_DCn|SCeJ#5b)6e&WP_tZ6QW7(0 z)Yli^x=3OMvuo`IU8E}lm#%FvLxHFWCo?Lr=GRQQxi{Ful?(xkUx;~%m>LwKCDA+u zJ<|+E9j$C9{-mk2@?;VC!3qv!(B+pRrzndZj1=#WuMt43Pp>-cjaSvB9dbX8IG^?c zLKHo|ta97g^59sx3zelkinG5f4*}YMr}xv1m8K3{jOwSkhW33$ zh7I}S9BoVpyc|L<|Hwj-Vwf0R86a!;d@9_m&K}sXQVzwRwmLC7d{(%~buXSgr3*&^ zQwMLb!-Pn6B19MT?VP;66bVM?RjdV%J95{%2)0MNpHL0>r1lCuv#Bk(l~@;kEAo7j zVWDCXs-5$cKK90|kv~+s@Z-m3LI@{CGK>&0iuY0wlsS$^3ATyXA=GEq`20-NYvTzR z6%3nANbp6SR7V>#qZA_2WX~Y`g#D~7B!TSrh$*HL#GJsMw0RarT53UWXms?zBQg+A z)hIv268kkrX>Ur*q9Bqq(2ph@x4FESg!$9XG9gmc;62i*THPlDlRp zWR8+zt^OQZjLXia3WyjMl_8{lG(OS-Jit2}nj?Mct3{NcH!cmMBh$6%i$)7VgX z0nT)jXr(2lhdoC0dB@i zdcfVHy-Cjkd}%Y;wbHnA@qAe0p;GrnMnCi~^>PcoO`Q$dV!Itq?Gd8LCu=3}LR6Ua z-U`cVjNuAge*G!GbL}EVec8bmfjzUh_ymLk-&(h{Wy>`P!68$BM;bGLF^YKnKxs4_ zEUG8$N#`DlfZ1>q6$a8pNG!%TP`>m1TG+v@aBR{Nnlm9h+h}-Z%nXmR|HArt;B_W6 zX(;o>x8b+<4u$*%HEVI3-kEbg>JIf0<;khK^PB8Cju_N1U{!OybJO`@IWz2D0!waAkr8fdzM(3tR$sSl_P$pzmosmv2o0dca z&X<;=Es6|5Pm{zvMT13?x6`Vn4|B@LmrAkyubWW)^zUr5d_*p9`S8Jnxt}6$aM@L? zG)}iMeAD_C>8l+XI)KJ1SX_poV_PCA+x`?PoGy=%rn%h1ETf7`8E7i-1PuXvr-@f; z@YzyVGj!M;6XYlvg>TW9W1BgoOJO}<9;#mPcv4KpRbR7@mmkbL#1UGbZ?%Vq9?{UE zJ1m=c;`7*$s#Qcb30EsM3e|tGjC`QoP|Px)1fH9~n;`Jp7Ji=_h(w7kOVW2$R%*hI z&6KArVB}p-6b`|bX)o(zUK&5zFc>UAfNMjy$t$i)7DoT=om}hKqglxytB;{eWTeu- zL)DKK){@&h4f|E9nLEsanWJ`XE;9wQ4l5-R6Mgn8{*o(|XNFmI%gVlI@TTWlWP6Kx zW4kq@Fg`ypR1Q3z1dMV=GKOZN389TvV&%MJp9+vS5Mt`Z%y+98)Y||y@if)hFy89z zIi#FuPpUJi*Pg`Y@KVx^K!5XaQP0vsu&pGV*ZJk{A8*+{)!;|#SddGSp%l2?h#I{j zCzR|M^h*mr)Ir6a0RM9_F@fz5FF}MG76u9XX5Zv{+U#68BLw#dH*WNC+Q46v_5>8s z-i?fZ&=4ySfZGPXUiRsSA+>yB4BXaN%9UPd4)ye~b}xQnhZKpk5b?k%4w4n1l>>CAPH=PSuXOQH9Q>XWD#)I-FMZ5?ccYX^mcaxQPt9 z{<%$ie)nFs`cn9|T0uO1UEz$!;1)_TE}`q--?iOvT9$qL3f?msH7#$mVm!R`Xo14hk@aTTmvBr7>a+jnz12kXs3OpAre~H2( z3{COU$;G0+8wZkl=cn1zf*;zBLw9|V?PqC$^XF?&)CCdRRl*)fj!u=S4{Xw4VV9ed zNQ6xH%3CJiWeq;P@_v>UeZziky5gL(^jr|Qn|!8wg9p|9wI%wfV=_q(Jd5y zqw8N$yb0<}EzD}UbT`NfjB1j!l1Oy*2^x=SL+Rhz)+}kL&f6~9`!1!^FPCuBnzN@` zOFJ&Utaw%bX=DH5DM%Kzz1Pt#r&XiP_R%iu>Z^IKKL6f01F!qhm#7I z8WUa|L_>)u!9~k~&-20I5I=|?6dW|E5b5`o6Oks7Bq9;T6GDKD5e76j!s(HRRgb=G zRDh@9toS{pTZ~awI~vxe4!Ulu!0#HrbVh7`)b{1c%O|PB^J-IIv?0TW+%Bqigy)Y~ zJ?+Lrtris6V&20^jZ7OHYaHeJ!PIC?6NXRIuDU&+$w2fjlASbrLEV|rp`|Oy`P3QI z*b-046m zS=SFUaODf8we1rqN^CbIq-l9;c&H{NV*F|5f#UUY|yj@5pES)F6stjC8LnjCSs4%qXCTcKZ>C?Zc{r9nvFX*MiTQlIY3&S zfaoE40eLvI)?nR{^BAnMFf2~2lcxl(Lm}0qv0HK)QBkKqJ#RfAo6})2$tUZY^!yR* zbtYribmj0~whHkIYS{0$5;Kl^U|Z%h_(^nQ&qiHMY@>=V+`EfHoxnlVz6+J-JX--=CmsoN(KI$I)6 z%+uCb#`m8L^|qRJMXMZmp5Ey%Igt4Hhg?R+HY5o2xkUBzKyNyN6vJz=3pHUVbh@k| z?BU!z021tu3)IJuQ(nW*)fblMub-P-;3*2;fVP{udXf19c2Z%1d_V!O_0}rjfuY^~ zW4<75DAg4e&`bD~|C<)y5{cpGg5W5d5jtzVM%P`hr2aL+uV2mFVj{62->^^uMp~Wg zMUw6+mD4BUc4gxvPdL&2ct}Vox%fo5`PMc0xw7AEPTXRZN1KLQJF2*O$Ijjj^~p^0 zqN3_az>6~T(rE{&O*)MC6!KmZR1ADV%u~|x%^^-n`kJc&r1Tf~6eID31d;yciSQHZ zEUiOV%y8QAZeKVYh=*{;8rSpGP2!90qV<_q!5Y*jS)&b0_We^BWc1h~O0VufOF zDvjSz91q9tFfSc123JGBRoJ&6vS<21YUEj?>*d1N-g&u{6ctoj$QRLHGe$SMJPhrY ztPZ(D^OP*bv=nuhVai@})L8s7kGK|2|PCp*`_<|QWnt|fwM(v>%zxQwe zvjHmS+b&&5Jq;i5cPfZ#@YQej+52q-rgCl%^$pUyBmWdZ&zw+=Cp9X`Zv%hSs>s*X zfaokH8o!{$Rq>s!&CSeWxN+C(YT5^^hU)QfHOYlU#jTCIYD`{rHq?#(Qm09GG?t}PS#%|} z3q75yhX@C8lI(U_=-*oX)U2woTy?IxKS2*Q-K+WaBV3!>Mz^{~LV~h(tWrP03XGjc zxA3V0G~8%|-F>Zo180v1BgMNMem?fYC0y1FyS77^P^pf%akvtZihxZ{taVTOW)~98 ziFIrefU{#om1`A$s%BX>w_-L~tFa;M5cD{W+lQc6W0X4NB-&7|OJrdSH?1+y-#loE zcPW+58J-No%W`BFyehrgMO#_tYT&q^1H6nQb+C5n^qlmJT|J9ou{xtq)EIMX+qg<9 zb7fF-R}E^eC!u4ToQWs)Tif%S!<{8$4(nwO0`)X<*GP=X zqw0tk$&@)y-hZEoSn}0+q!yJ{{Y~!AQ!dlM#0nkl=itw~!Iw(!dX032(TIK!_-?I= zL*&#m=|ud+U_*K=ehL4WHg znG`hMdA`2B(eeeqHyvFQqT9O#AMlg#w)Xbz58DO0Vn69iv~!3{Y^EcOwhrs!bhKfga8LVs9@)bVg1YqF1wP}mD4^SREI*ma)uEugW( z9LA!xo{im=ut8!dhL@W5tUp)e7^b7Fj~?`MTb#m!vBY?Kffd*2La|thjYQ$h^*a9v z6Sl`N2tHc7Yt?08S>T@Hl3y9tw_mO*nZm!2Us*EvA~b;5;;o8XNrZ)Xq(RCrorj51hQN)6cpD=VRnfU^r zUdmBM|Bh#-@`OuH+Lb|D4I(gZEZ z3>#a3X*S)*@AO;Xt9bEmBbv>pWAR-}z7Buw67Hi?O&Ss#$4DHifLpZ2ni5J;pvXX+-&AQ(P9By_-6qVzZ~iv12}X^XZdO&5 zCZf67lu1M@EVLNN2wqLJ(i+%wAPlx8ZSac=C+sD!zeS$~5tG2muY0iwuyEsostKiK z{hk~17;Ery?{Y)?zMu3$8B=4jbdBpp&Dq%^t*U%h7QS7Yuly49r#Ni~FBi>x;(mo8 z3+0AQ>|t9WI`TQVUfEffe9JNKnI`7r;QsGrKWAO%hAi5rZ>j_(_ES++5|!D;%uKP{NdL2HEh&CTwhiT>4ul~8iE>$j$55ZRb#TACsxfl3fw6!XZ>XRmMa5u?yz0^V$@>NGE}iy0Rxf1wkr;##AG#gGS8;}IJHYKo9`Ib|y;u%rpb4oj)JLR*kV=yRYz@L=-9JOj^^n`zzt z>&Sefr~W|y^RSGt@n|=Oe#EGzjNI3vP{)Wi9N{NH48&<<+%oZMKlIwHhM2J=AywEh z>>VlB5elmCnhvP6Gs${84){pPL+=dOjs;|#KvUCV15>u5 zzr<+$G|sSH&S8vz5c|DvYeCD&+!-R;k6Q(I48@G&kvX#wV4O?AlgwoXeX^u7@)AY zH1G@g4>tI55^S5iS2DeX_k%JvZCx<*Lv&4urrVL{mo zUNQw~g8WmR*(@}J_IxI!b@unw=#g{qr^N zgMKk%Cc|i@3Qa%F7B(_3V$FU*u6U!w)ZegtN6S~G_YQIzKKX^TTqmXHvpdq*1wFzA z{$5H)THl>L?)xaq%vLs}97u36bC9Ds`dOlb_SQ`=2x+(OB|34lV-!tVukoyuIbCXn zQgm5W!(fB287~~0n>>~}tn`{>9--xQh1x*h-~^Vb0T!Q@6Nf8<5|&qKT*525HBUvp zeR&mAvooWBMrb-n zJx1doL-Qnvj|wjewg8*6{sV+*$msg6;p~RhIb8)XQ@DTOYnbDO^tVyNahrF$RnK6~Sg~6AgLPW;9J+#moxYAWsqh1{fgEVOeMDV9WrAWsCArhDQ^+A_DCqtU2uKUS$Z60X3&*t4(Zg~NBXEV%%gEDT!`js_%6YlDri zg3m+H;{age2_zGDR+Hz5rL+S4dtW4)2&ORbl zCwvhm^h63=JD(7kW+_o<=D3D1jY_49^h^@c?PE@Ydad6MOyHgMX)^rej#roM35O_G zoL1NB<9b0bJyuMPJPLW!3eA0FTv;!99xkiU)1yVak;m+4kg{b$Xd8GIz747w%H8{j|Oexa+&|4$g4OO|1K`g2@ zz0@`S2blc_FnbfFIZ4^~A6EO}|8m_dA7!#CdRp>Q3EtOL zo_$1Fc@de4L@B~?1kcgj#K+!~9Ls0B9OqrGoDRG*?e@mqC(iu3E25{F`^>vn)r-1? z>!4H9sJ@w2A8R9c=3hJ>%MGsw>%ntPBkpYVmmbk)-vSa88tol8rG4LMI(CYm(VBzUttp-}C8|9M9AA%QVr z0sbq0LBT@9{Ew#z1r30~!lr^1=cLBO0ja}Ln&Z-NxcpcC`fxr)p@c;U-*!0@s`+T7 z!vB!(OASetvtQSzvAhOdq|u4)Dw|ZX$M1q3G&EO~6l!zL)+CnDg|cyR0*|zvFRXkf zw3#DF>1bdq$roAJ=Cvfw^MAd~ht^A)W;?stAV;e!E!epow)%#e6e5FWU` z5qq`@xn<6lZ5L$)B}rQom+E|&=9BZ4MjYllqSc0{3ZIKZ%s~Om7+bIMqUtUsFft|drxESS=_P#Mf{Da0RFI&P8CMj# zgLWm2XDje4ChvrV^R(7pyFYtkBE(3|)>t83l;!gG<0L;=iQmsO9nURnN|^xXn~|*o zk=SUI8ey}nXF1+E(-5AtpF)2Q2g4a?pc{=>jjUZ_wixi)At^xT&a)~OZ94E0ebv+924DrsiS ztxSVaG^kZ8BF(ln2uf+QR|5`icZ`PvT%-hrI|w|z?JIR-6sn0Fcw++X(rz@2QSo7@I!>mzF|})FYH&?tOFyJ6EG8y` zg}5CT!>DS%tD|cN0(T{7b&MBz15frMt}Rx$O_4fS?A5_ywyL$-V zG*dFLS;DWn!f7Y+iFc8e%gZ8R?TYl&4qm|!7W?o5YG8D;ZD(tE%dZ^C*SM27T$jsr zSMuxyYBt4Wwa~@(2TiI!?A|8d37{$p&Fx^&1OetwExqPiex~Ylm46=Z2+e1)bRx&+ zp`P`gFVLkl%S|MIFJ)^lu`8X^Zcuuy=ENA=B-b(~2E}sllkpf*HMd9;E2FgGNhU{M z+r9dKGD&kk@0KUeP~PAz;0P{Ahk9&=zQ zXAhT*u-{1sW4J1)_fg7ED5FbC9M9$(-4a<3h%-q>d4_9YS3y7QNR8dNlm+MVlrmY% zjd%G)!)a3#bu%USrWkY*{1iyevAj5Sa5VN^l2KE9#KqeOlDf(`6OTfTfl^&(3ykDn z1o3297Ldb)eKf*!maV&4l(Ru!#`Azg13AZZ*|(=@-beG@_({i|(ZW*n6CK{??WZ3_ zCTFkKzzu^H!fF&WB2qMLjfksKCc-1DaTWL2E!C7$cZQ0uZ54FuHWwLlMo5nw0;FkE~`Ec)o69bucHcRwsj&o zi;2}3#60^8+{|p1^sKS#w%yY69F(cEsXb8t=_tY@CMO+S z6T7DyB7%~r+lQ-O`cC6wgK@(r39J=enovCW2S6nTRdG~z8yJZnyh6$OcHSlL=W>r@ zMCS!jO|fBYoe_Uk_KPZyiSXq4s%K**OgGlbTC6o8kKY}arWocYdW_03agiZgTL;9? z>PM@ZP?<+8GRmO|_eztgsXD0As9jxE!*$Us_34T{*^>2n!%+J65AZ+e`(Z%*$A0)Q z9{vlz{}~~{qQd5c6{p6*qy(wsa=_6@nEw}jq5p%v6bM&lS+6DqTNs2zU|U5dOIprO zaRQ`0R&UR?0f7i`iD$&4@R+and3;5>aWz*0?W8ocj6TafF(pU*FRTv4m+4t_5`jvo zKhtX}18kEAbupxSQX{hE6@i>}GKz2W3r^Rey#Wh0+8q9pNr#4mHHOqqDfFUK^8Yv~cJk(wWEgO+Zdq4vrAFa8+LfD|o!9B0M?1w3U3O*#l6AqU<qwX_*_m+i%!^xA0F8L2uqikqXb_GlKbqUT zQ-hCt(NW%IWUw~KuOLog@%-!u#Z>i}>TENrtRBjN_}ITVj0;;E=+)!QSBN{Immce% z_jVT;r82wSo8mT`7Z|@&_hZ4Jx?54LrA3glxAgpU{6s#bHj|peJXa0a0{DPY-5p*v z#YMypPGo-R-((WGuBluN^~G?Y=6znU37S;$j2D zqgcs$2~b|nvt1ee87J>+=bd-kT{5AmqUP$rFEY&O6XMLJCd--?9ZAtP^m$G_jkGWf zv4&}KnP3DTY{J)=o|8Lve*M7_wcQ-EL5DYb;X_&yusG{Kp$BaK2n zQcWz>zJam+PQBt8U|fHAX+)0+=bL_J6+UzneIX8*RQw4kccmLwV?U69g%Ta%pJ5*} zu{o;TPn;R~L{jFVH{8;BF;r!dH_!04jE`J{jizQQ{HXEM28XKFdG0FlDjKLIN3xYc z13D49p7C$$1CB57co#Q9B?o2IAavv3C8V#OkM&d(WP0RNLA7-o-<}WB$F6SJRfU=Z z(c@D3(GR^to4xj1eEJ&mTvz30x%;JB$r^esIHRWK1EPTxN?#R2LFq6+uvL%rtV6o& zIxpsQF_L)|H7l?EJ-GhVWp}(URnZ8cY=K>KNrtrLo@axKuthgsKeo6u;tieyCgBt{ zWFTR~0g(t)-+OVnDU_5RwAmJax%w_0>q@yf@s) z7y>V!Z$Q%^V)#t*;}VgmZ>!5NUXSC|>F?)#wR|ze#hlgNN}y;9c#*t?zaJh&?IRz^jXZ|x^hVd)4CPyh$a7D zQxskl`cZZpNsdldjBq9w&M)L2U|_q$?qK(PxK_P#_b82TWKuDflTjxhEa<%1$fm3$@91GD*?$l2Y6ZBT2kn)T>-fN z0aB0vib%TAnz7hLcBFbES)Z7gj!t`%sHQ?MpmM7M6$^bdqEaS=U=IG&1&JxoY*~!* z4>Khdk0c=-9&&|t=5@BHrUxR?yfWyUlt>cPcC^U|pvGF;1psupD{;liXF z#qqYpssNX~P^g?fK(E695w2o%E*O~VEx2b z$Y8$Z~k{tmQ-jn)6qIc*%WZVKzihA3c-9wl1pc zlyXM)1k!>y*0qO{hM5p<<3HNprS%x2Jr1lkS78iYo| z>;T1AEQVH>zQ|xVYQQu@&V~ZDxOYeH-K)>{ON4#&Q>2hpEef?7D%&3<9Xt~4|+Pa*8uIL1pesGAyQ^}tYR65)8t?}T36S`TbU4J>5 zjdWx!zZh+Wh&2e1w?btn8(>`=^K+xZLL*SP#qOm(n>40sk?$QjQWtZa2TO9BeFTo$ zj3X;#pnsM&0wqQffdFVcuhaphcIRwdYh>eto%?QV_Rd`yyLJbpLA5(G)jhbJR+Sa4EPH`^o;mRX`9u2R}NA zt{3#$uym$8<|e%-3PM2!rscJw+w^)95OOko^?ciUf5BUWZq8SG!m+^WJ64qmQ%mXq zpHiDAmjv0hOPenjYmk=AZ0EkKcL}E%MHM=XHUR~jD-axgd-e(3u&emW6}o9J7kiZm zT;w_(4C-^1HW|W*)q5p*87Mv*m85g4w|*rWNe*@D?WVmzy|x!nx$1B~&wX{FPtxKCPs{-#eOQzBI?R*MGgOI|7q6E-rI4CHoE{ulbR#8%X;mG9-gu5A#CSxB%=Qu)Vid4@ zYbj5g1fAXFpp4yX%bs%q2BgfFJ3^=#B5NcuYl66osqnA(-b!;@!j`V zoJ_%MHJK{Hv$^DxOoAuCfwqc9Y$1$r`_ediZUQMpS9x{!8)l&dkeoC$yL4*$7}9?F z$%olhd&D|^B^6)2Vv}dS+_Fo%s+E_=UavnbI5G`6*wl7kJD09DT6-O-IOy3C zUz+gmF9Yt+B1f%bLY7~2aK1nc)Lri9mbkZ15n;^siLb^-rAy7Oignv3OX>TBvN>aj z3l)uBz=`J(;XcUu$UrW= z$MBfx{Z{UKM_f@YkL3O+3ejP6^A2&fT~tr;MV!0M*Dc`-uYqoF*N$wB)7MJvsc$wGDtAX*s)B9G@a<_coVD*^az^cbhSof$z3VK$y;3Q%6FR=+=w- z4cOi9om=F45zsz8&5CeOr(*#+u#czXmqKgnk#Ll(n=N+AzO&F`_bs-lM3oxY8Cw(g zA#oNTyl{j?$uDe+BKioghq=0zFZ?l0lrtOr<59RhI$9|NUwz282qjd56bR6IZemsr zG2Rk?=8O~3-+n%W&>Np{&2j*9+WZGqb&}=m===v{WU)|->7?BFPW$&^Q~Dly4~+yB z_-kI;C!Pa#O4@9<8W%tzqIfmq1(qat z?7@7krOl8^cT66L5_QO*QY7qBLJV@)D^mM@vmhC4b^{kYx7JU%8DRU?I zkAvQRS=3xmJoH^w;7gf;G7{ixrZyz{yiW`|v1V0<5eW^OKRl^#9;3p)>E0YsSDh}( zK_Qima;`=uTG>R&jhac9X-Smp>X@4b^5ax7khcDZMdb>F0J)u;F5a2tL`OV~BK7ix zUs`iqo2AUjRY^eHCPNldYMQk9gSjoHjWI%wDr@aliwi2`=e9Ua2Ih}<(r5}9aDPJD zW>KlikxoHQEOBP>avgcNqMowIqQ(A#3HAjMUYtdtkny)_25cmaG@QzB&NK(f=MuYH z)78gD90ljyjAvb-1|dcL5v-22u-U9a)P8X!2U(7h!#2ppKY*^Qws^f~-9JE*m;FJyE^jhbwdb-ocP*lu@3bB~abEy?`@P>&{Rc=O2L!8Y0k zy&0tALEuL8y||*q$nh}UX)g~j1=_V+n@#E%1C7AE5G!Mro6Zgr?Jx`o($?)wgsc5O zz&+u7(LNm1>11$$cYP=#%r-eyL|_0_z}24{huzXWCIkp@T+|-)S?eD_1~FPb&JUjOr`FeJp8`}c~ED|I% z$_m)L%eh7P;25?zK7OEr=s5G6r~`D zv^{VuG5A8BUwn2@_#m_tx%S|SI-hz+h8CJM1S94XiUu#5Xc_9ML56K) z!A8G$thrySpO2|PqkHYH@$yNt6 zol>)M1KX=f{(uo{@%|QuNc8r_(0_o$SA^}}cz$e=e}EwGLnK^b{j0L2Ace1+rE0jq zKK0OZ7!INJ4tQDU8FchnQlOHH9q&hDiJW7NgeBwA?_m4h*&?B2!mCNE;)7;|h0KkL zW7LMlH&f=4)5<&1u*lR%FH{jOBq=bRgNwi^83yoFqCHOGbQq^@h{=7zxdKcl-{G(nzS(+;U3# zRIf@#q|?_5nqsm(htxz#6UT7uB$ik5g?|9|Z`g%6u@iLqpOr+HClLVioD7Mt8y#xE zQ+;H(n?e5BaNH1eUEf6W{wU;CwDm^IFov?3Hh`{f0`|>c1=*Yd+2Xvc{XqC~iA#ge z;&V)>;6ZaQ4K%$GYnCukP+4{Prsah*QyNEe1#S{(AhV;df@qua%h622N z*}9enob1N=OfmJe>`JWgA1$tK6R-UkAkX~M=7)R5};H$@@wV2VxQz z?H%rj*cx9KZhMgx0iTG}?C>lAL}E04O%|)dbA;))*GBV`hxO9D?WIAqHZ~K4ir*DH z2)|3&qNibppB_T`w*K}`VfS&uK7>C0FpZM+g7Nt*!3-7cKbzdSYI4iQW0hpwX7pbv zJoL@oigPSF`Lu=g4X{&eE7_%*? zjqj7^X{U##FW)HbM=7^P47gNvTv9{W6QlMD?A4jDboidRh^TW7hDLHs@4doOb#2rL z5-}`< zQ%kV%QzZWoTwtI^y#g7rYccXPZHQ&(-mA8aDTm1J3GC44E6G$Y6o-r?B7$sn6YCxq z2hJa6T#O9liYy;|7*kYpWZ_I4ntSSJI$x0rY`@@sYU22(t<{2x*Q`41CQkIWSK zH0NBtyY0mk-Dby?UJeEEwUnmQ`P2}WljB`R_z_t;4NFf=iIff>P)SmpD8H*X)pBk7 zDdWg^;8dE{TV~cNSyzUSCli%qkO%Mp>ufGI3L7O^n8FM?K zBIF=Z54*`SoBln7_#Yq&F60qO0D%J=hqk3W&0KP_AAp^NW-|_$^`B|+FVHRd`J5(9 zbj3hrbULo!L?8DFSSi-5i9Os~K$ z;PD#ldH9O4wVnjii_6|Nh>`Ws2oT%$wB>U;;-D|+N{f;^S$fY-u|5hYX4FV+u5&e^ z(pTZDtF+vCcoI$Le8dfDkC+ryB4)SwB=%G~IVLay&#F=8ethx6z~T5Q5#MHVDl@W% z?pAt4w}aEx<-i#2)9JKmR~D+XT{R;SI&02-M>)A5XE7P`kCxYg15LiARE4(r-@Eq~_P!rx>t4Yx#F@$2R^mlxd6icB|^S{9sx3(x9a8ZtI*{(TMA}m&CgA7)-prm+~(SM0m_+4sA2yAd+4g6d0T^x zjvealbHS0_c{s)!mzdaN(%T-bgeZLwBOTLX#>NQK!^vy_Tlw}O?enY8*A5XE=jU$#1>BD9 z@yL2)$x}j&{lJ&J(e=*KG)jZKkn&Y|8}W^) z-9BA-T2U*_He(`;k!m#NJ15)_3iZ_HA?MsijR#a(L5@FvBevxI*TJcmj7^;o^`Y`s zDp}8J@IuV{RiHKV&SXXj=hunh?9}Vyg&a^)v{1#)VhdEVMO}Mt)L}*7T*9Usy%UsR zGj4HxoxW>~wsHlbfNH<%kr7(>!T6I)0+8<;MtR^PG}6(~ctG1w9ksp@NoS*(JhtO?c1jR{MUr8~E`T z#CVEc?QAdCJ`voZnLGvibN3QtB28Z`e|jQZLXc`K-384iXT`gsQ$a^ZEhTbk6r**V zHTTlYWLk#URNgl=mHOlo_uEULbOfNRjHXLyj~o+8 zqe@xn?<|XHEJ!=TcWehIRh*D@8Ko`=xG9A?I=x2zRT{FRc){{s3-pca0i@#@>LKP= zUz-_;fqyjy0?GcC%5TK*vH(%J_2Bm1I3;idy0UfIZhbbo)%b8-1i>H^Z_=qEqj+saeOs`c~ph8OH{qYTu5ET*szbZruJeB zF$#^jqSgk=dkJOdNB#XM3{C- z7h!v#c_${8z)VoxRv9JjAxR|6RR9Xzkf;Kk?3l!`cIv|5h!fomN=^^YLOPau%ge*R zlZ8=27}ox(W5UY9r{&q);(rwZEbV@+)dvpKvPU}L*sG6wr(-9H?|FuDbR8P_a{B7m zOWq1BJ;BT!-#zY+(&%jkGKylSyF(lIticd#cxcOe3%7MXSnOKdL0*JbWq3AtGwp^F zh$whQ_CzT@q<03)55w=j7U2JGl|x|xs6KRebC)2@q{4=|KYcrt*Z;eFBuaIn<5c5C zfuKapmR$XdadO$I9<_!$gso>I^M0(;vwGF0Ap@zc0(Hs zvJ%0qjzQms6%&clab4s1cU~fN4ObCnf6cIDX;0FM$r@94Dt-pq+1M3)GX(V^48tkz z5g(p;9A!VCK%6X3Q5h}q=1F0Jmp#-J55dfsixjnxI*Exi4kuZsTAKK97^>^qfqI& z5>X<~GSvBBw%HJVcxiJtuhQ;Aj2cD@0Te|Q^Zj=hZRIOB4S?+OHVmS+nnsZcuUto~ zB*p$?yE)B+&8^mYCEaLy{SQtWO5d{F(C*8Ysm}A=>N)8+-0|9Pv`R7bE8p+`Ea)6r z4&N*b5QB4aoF7HY$s6#n$pgUApvRgC zAR6#B;HyCZMq#Pp2x64bWjHFs*i+yf1n8#+g-&X0{{SrQ0?y)0(j*Xus(&H^hy(^W zzHH4pF%VajB+2+$A*5%OboL-WLbA-#u|!rX0}=VK#PnD`wR?~_D5zAk$nY~#v&>Ao z!`L6K79_))C-cQ=f}Op`;Bz@7`)gjTq?O>eJQZ0IssU97nAW88^HZs+Ed6Aq@7ta6nI#W5|zO*V9@ zd`zrWn-dj4?%lmmaEEA@>14c5O~8C(D<%OTF(-C0V+_pQAfrj?D$@Q=#w(-~osU}n z&>D>DImK|maHN(LdY$@I+*b!yP^6odFAerQKZ3kz3Cv~jMgxLiZLN^UfILr%HVI82 ze$`|evS%$^W5!9Dohd*@^8TD=kpWoAk~ymLX|<~@0|n;#TWrNw2{jRYQ++yO8>46Z zXo!3e_!r_OQzR@Xj8<~61c(&dWr%#WsMPR)@aZ<3Dq-!2Hq{u!Sl%TTK zcUE9zcq)Tun3=Pzk~_JKJP1GeP%;nwO57o%A45S=eDM!T{tGi+Dc#~%Hm>nU5H`?Q ztt4i8@GKlg(tM|7cui&#A3pq3&e#VT4jw7Xyvgb4f50ZM!Vavrqq3adD>)*r0%-J& z2*l8Yho!~NHjAqOE61=3JXvDnXpUOs%U=re-@qrJY(W7A4(~BNZdHiDWs1JZ03h{P zF=QOk+?Ox~_9#nBgsjbWI(x$B_cn$T|j9DQ`Cv0+mVJ!obWK?4)0;>L1bM>Y_2+=Yw;gjkydu0`xtkin{B zzr8AO=D#9r*`rus&EZw|ivyl?jpM2)>}`vm-}<8BoXlp-p5Ztf0Lb9u*0PWj5Zc5* z?i|wUH>xclh>mPHa3=@1R8#GSDg!n+WD8R0BKCs{k6CMRq5Zo-+Z)Zn@8h$#}7pD5<%+ zA+Ny$9t9K_U{dDA*;rT%=QP_U)%4Rea^bMK%VSjp*&^z^7xG!~aXq9T$xcuXB1Wfq zi2^@s0JuO>&ofQn+~*$3;Hni37?56ZX7++jZu?!@V&Rd5y^1aFpR1WlVcO%keqi|#$7U5C>kec zicsL?MW0XvbQ7AaCNd-H`_mwq{3lmYT9p&yCpI$!9g2dJ#9;-;Vp5qwD==#2S&DOu zu!x%lF-Ll&)p0#katoew>tr(!!7A0k!9N$B$(u4yMTLV7ZuP88z}(?5;|$k1S;BWj znI?-18}C@h!Ozm*y=>UTr@8)JkbwsmZ`R|I9M3jz?C5=N7(ie-TxpaR$j%z!?&|U$ ztFKENJ7ojaP%{}PyCuW1!=p6_0CKpdjG9J9lB`C6>^Uk3xPo)59j!j!4PJ59&5*O1s|J$9j89^Rguwgu0rXZCQBo1V+hz<^H9fM%Z`SEn9 z{{ZD*0>V!g2qG%#7)|5$fUe=(+#9Sbgx7^(GNd?c=Yn+-^X)Za2yY(psioAosURMF zKh-7(!`x<&76T{S-h~X89K-dh=oGRc$JMhgM}>l&W{XQR#ZM5zOcw=bN=o&rb_Al7 z4|6%F1;g1*8+uk&uPF0TLNk&n6uJn_9L>nEk%ncex(8=k_uEF5EyI5W6H&%=jjf!u z<=w8e84?a_PaJa0OLjyDVtaa`*poAnbiZggCaN()6Cq<98HIE$PN&k0AYDySAP~a4 zuV@oA4tQhnHMZWVYyi*`>)kNmc%o-j#PNFdULLhEkXA>kkDF5r*1U4W(u)jtQINwC z-BM=(6Yjhq`lzbxK2p<}X>FYs6Q0lS{yxB@UBb)7ZiL=4@eri%_ zfpFJxZRX~0-C=|lF^cO;gjkgeiS&^6=ISAbQ9(3v8N-_?%ShQ==bb~vWX{b2hH1*l zumcZ@sugK;Sr-G=@6#r4H>)K;DYwPI6;1N=xi=caE2rs7GFSy~H%N=0$0Es$4+C{Z zixMb!-9Q;d$jzxVCM;)^ zm3V=cXBKyZn#nBF2#NH&WW#lp0CEv$z5>sYj?Q|qZfK2#`lW#jmBObTj2VR~CTPLA z;tT3`1T5qrT5KdL@4-)$#=KPJM}7FEgIkimm4ew3>-xJX4spAbO~X}y9ac>qVvr!o z2Nj8A#(Rs6B|NP~oKjiY^om#_$0_!t!goAbk1NfTOEhRTJOxeA9HL5xF!Rd0Ooei2 zY++)ZlHhMQZE;+czCv#u{r>=rR(f5?lbJc^ZAq->|h7b#>;zP_bk zTp`Set0_RB!`rJ4c*z{!=%X?R2xqD4$s=}YgnsMUD95dl1arWaC|B4@&Q`LvR$$EI ziuq&^M;1vuP>0KFN9J6p!5IRd(L=tkns-8uA z%gR$ukZ7J@N_is&4lc_lQCb)*CFMgWHG%SI$Er&nxUEnaoX672+(j}l)&L4m-3}SZ z)8h8fL)FVE*jS%*`JjNfEM~-A6&xR{{Y4=brMBG!?^KDsS^gO zA}2#D?PNu`EZ&4jN>J#IDGpx;ehWCWWgcftYO|hlQVu1h!l5chFz?MnH1^0mv0%TL zEECePI%yhJ<$bBrL9?e;OPi?%PfLu@&xIR;ItR!R6wy3XuWux`Lh}kP*f=){&Cy9lI^_j%@Zp_ppS^#}&($o1jsThIqNOYvVBp z_ON~0;I6NNxJyTttWGPkPJ_yB?L{N2Het5W{Nk5T29oURH_wXT%&NS@`kJ>1E1fc= zLwO#KJFoCqL`1a`GF5Cv3h&OCIH$@dg>sF zJXCvfN@j}$LDprec$Pqc%-Gg2*xUWoAKhq5HFHHyEs7{+>j$Qjk2KB zenSK!H}J(k#%<2-0mzfh5PN=;-lbCD(xM0qnwE4e(q|ut3N8E$v$J^G}uV!z@CX|yuKfj^{G*8nHWY+=7Kycjo?3; z?17yK{eJA|8k2D<1MH(%ERW#D8%ivRgu2C_#wHUN7hIBM7+9Foh>7>1C`ib6V=$2! zhl#BCkpBQy4T<5!BuWuH*|d(mHRThg`#y6>%{UdwRX^ak?{5lj!Q#l9IH05t_9D8o zW}gC`o4`n|Ow=Mpk#RAQ43qxe@;fJrTTL5EzbbAH?D8_|r=W&REjU30;Md?{nIeoF z(V&qmwT93}^Mu2|6yV6_h8kAJ?}qIF+;d+82u)q1amC^aHe78zH^iM`^!!prsi(qk zw%Hps1fYTY)=owv>OQ*nv7inoFBefjh>19H{A`3IES+lmLE zKvt;Y>AK08Xq``0rDMfu@y4|MI12XEsP;Q+?QeI|$!<15bC5cQ^(;j}fJOpW-ph(4 zWd4eAgzYE!ca4&UmZ-8(0x+i&>QJH{EeZ_ zO9c@?+oY^3AWdH02;QIZpN{l!M9`pzS2utp+D8!ym3>OiC zcvwTICjy;=9#1m!cM)jFeE$Fo45UEfAB|klnK%&}EBz##gTPPoG#k@%#}^-L25h`p zObt-6isUOS(GoEYmA#`1COlClHk0|)V!fu{Q_kz)z;kCDDC4@Jjf8G0%1JTH?$BWA z5fI;&#S{?O%P~=`&SM-6m@qOOy}hg!)G|*AI;kI$^GuU@D4G1e&2?VuLHK6)j-(~8 z6njFyf}#vNtA+tD^EH=2?TuAIdH{%{wg7#mjhezcw^fY&8udQ zC(_RXc{gGbU2N&I>$3?dygVb;v4W)AlHieZr*s?>B>Dx?_yfki)KYuuII2jFMit#8 z0_A;Pu~#jEr+K+HMU(uRbdO6pGpU@}sKb|Z2TZvy9mh?NE1rInRj)Q+BZi9_2|sg3 zRt6)ue^wNlK?$xV(1;Cd!??`$MKp356>tIsh%@)ylxB~v!ZCCPXrSR=d&TAPN_E%p z8stgZv(Lgvg#Fhj&xy0R+&(I|3s@wciPkSu&YARk*?=!0nj|nf9#mxFIP2 z00T10hLt8#7~RfPd~A#hbBUTUjF9JJjy+%>&o(~voc{nc_j4Ygu)Pcr z&qtfZK_X%)nE-Obitxr{V-x`mPu+o#XcF-Y z6FH3Y;+`~ux^RRrJ+GQ#Ajcf2eEK+#0YHe{B;;o?UXV-?f}zIRba}8yJpzvT;fH!R zcq5087IkcDnem#YnKCB4OvoB>67xM*@$nQWM?Z_Qku1x#@l7Pe?oXAh3&{{jZd$rb zBbwpen+wV=gEEL=v5rpc_%n&|V)94_msT=I-g6Vpba&0Fk!*CMAj*gN25Rql0jL0X z54%}l9UQlNM!hUf01M0yJhx(OhKUS1rPiWgVqMg&H!6E>SMa_S&PYCrOmRX^^E=QD+SJKtLF(oGK&)00u=WYe5fiL zd{n_;LpgJFxGc|RY_P$$l-cw^bZHE>e#WfY<04MItd4{c$F45;iVg_b{;d51nOm@o z$BE5~CK+s~K%m)j94aIt0$6*v5|Ln|20uHZ6Wp0Qt=%NB=az`PizN2NIf4^HP=-^6 zDW;X|1Xq@G=A@mv8`NmoWxmNNmIN@En5sZXV}4CI>T^gEmmw^FxVl8HABr?(PHMSn zz!PIbw8?#n>X9fIqJRV7J~M+Rab)GZnH@s{u;Jm2$8T>f2?Ti$?XGYy0U`ZY*tu7m z2APG)qa}A{rhm4dn>A*m;OhC3jIN4pGFdX%1dzi3Gd3|+vN9vK=BFe>S*)=VD5jCq z?^jSV?cr=O48-?L@sQIp`K|#eS#e5y4Odtb0~>m{(uAyQj3jpt!DbhVCKhRvdhoIeTsElGOMFS_Y;(4&C zaz+AiiUvoXZ%TXqf%c}H1A`Mo7<|POtB1j#f$r0!T+weT{uub1HEBj7RQw>#(SIiF zsEbSU#(#(HOrHRT?eSk6zt5&4_eWsxXCAbsalsr`8#xpEpw4%ZPnfemBu_09kcgKz z2n)vQ%$$RXq=Jd$&7KSTtGE4&m}HQGS%Zh= z=T&70;Tt>kr)uI%PrV>w5QgHTB;*EWlrbfytmB%JTIE3Ck18riBUAj%C=Q%br_4Czloxj@hyiMh`a#m=H#;NkTLG=F84bn;Mp2de+tv!515Q#yU_0f|=}M zw_Bz%C4mDS1}OyN-H1jB(ML^rOc&J&sIIkySWj&vq*EsqV&zZh_Mjvq%t7Vy*jtun zGM;WJ*as2sT7X1O_vhNe7!oNyXq+1U6$7pCeJMOuIes~8CPsXoir1<-dJp^B_gp@T zXBO;`zQC`ztxPc`{Co}9v9b>rnuMXEla-WDqRV`M@4JP22(z9Brov+DVG&p+1nGj# zkZS`|3%$hLv5;z1`;b7dr%aJqf1{PkzU3QJrYc3ouf%;MvIgHz~s4 z;=E*gO-LyCVb7|}#n~2}QdcV=vlbjD0>c)}Q~P;Hi>W?_n1tqo3Z^*OIAU`f2cY zVpPr!4{MfNxXs^prv2A{L|yWzQzh|950x-dR#L+C=}$i+&6MV)7WyWkGznDak?43z znVOy&$lNSwB^J}%(P zf|iDZ31*{0GcaA?a6gUNEqJ)9N;Ikoq!`VlOfn5tBW{qC@G0dM*>XY$!3GzCsWj+YL3xP48$yDf~!g5Sv$Sf0@MM!Bd zRLKJ6%`ptrqN`Lp9|o%DoUKR&$}*vR1>xI)U}3{l5D{byE;)r_?0yilV0$d4LPIB1 z^Z4Q`a0ES?cNi29pE{f*W%^XyW^i;If7wcwFkS2LjAO$`t0|uqOC{HJ^K2+i7Dx1b zAA`d1&*p*{zWciFUAmP)eGyYR6J?x{>B@jzF(-Cduvvo7JOI({b7(j_slv}PXx~sS zvN7Wq4zurZ4e;WqL!CIH@5rIoCySFQneJ#Fz>twZN|_g%+nSOD(#y}9VGd%=m`w=5 zVu!&DcxK9y1pCuidq2bAMwY*PfB-8QedGzi-ORa%skX&c;D5I+os}( zUD%IW?RD^6hP-w}K5MBpgVeBqr0X7jFnPEQ?Ax6jIl?1;%`yEVZYsvkuX?vY)icV!?W zgXz0wTiOXQPhk~e^N}b__kxWg<2!ljI_kxWF~}nl*^;2& zlX-xcNrt+L)0A!{T*M;t1RAkH(gp2v6H|2z7(H#yi4*W@XAay zXAVhV-52jMMPKU@w#a5$8GiK(1{NR0tyM+{tuZRcnwfJfJIiLK;yBL0f(0HSwB|6c zFoL#}k)fDnpxhQ7kv>Jo+)gWrz!%m(GafYboL|9RKZruxr0X{_xa@wCwX}g|O~o@jLknr`9^p(F99;HO=l(|&*;sjQ;}@Wpkx0%9No%@fY1ftjnk7s}!N#q>)&;>Z--tQi z@h@Emv`Z_j5wEM&6SIS)&jW0K3lA2MMVQ*cV@tG96rij8kp}{2 zww=n_W>ve4`7Cu^##USen7x332zp{IZZBQUq`wLSQLRf9BvYBJL_Ab| zkZtn%m!btjXFVYeLk(QaJTamsiN;t&@JG9>VR>B3(9*?y$c*aB9X)DZ8dng2Y34f# z46|KOcC{LN8I@~pVdOnm@=Mf+cB2%78g@b*@iHcvh`WlQJ4Ibtk^^_*@5J6C0vo!4 zL>-9lYNMGj{@vzmLTA^1P!ZX2jZU&9nc?(O_%~Q^VCe!6Cg)KgqQ+L@9cm)5X_Q-I zvqQLAJrk{vFi--7v<@Oez)7^Biv$#L8W20z5XFDWH&KMo!W|7Sl3`aLG5L>9RjEVW zY_u<@&q!6C_xmtqN^jELOHqX|9L02*$_cBmQqr?DS%IaYm)F3g$}mAYRCLT9B9vb! zVE`c9GR(eD)(wbpQ}vay@fJ$%Gk}^M(6M5Klr<$gArOsX8?zDjPhxH*{{U*g0K{?X zmXWnYOTF68;0OXYW6~wj}QDX#E}>LHgZ3d(ZzG>d{Y5ii+oUM4tQ z#su}1VL{_8Osj$Y4a20$*}U3fM5XgHfg+cx1sYfUn!pn55`hs|%m@~zN@pRi(L$=Z zXi>yl@Ie-=_-7H+(;PGZ!~iA{0RRF50s;X90|5a5000000RRypF+ovb5V3L5Ad!Kg z@bTgQ+5iXv0s#R(5ZZI-$JaQ4UVx?%ORjU`C5Bm+S)VdXigyrYiu&f14&pfsTD!qi zOC}nabfz1evaDhYAr!sBLFFGPCeViA9wCS~4@XKw!%&XPd71p9+(}e~r3skO+Bgip zO*~3Bq;60hZH|M*y`CYr4*4P7LA0>IF)Mfwv1By}AX_OQJj1_D)+I87DBU7eKw7Vf zhdjQrg_UxgMxLhSfWA@yolJuof^>YrWX)HD#Im6V7S3f_ZGqr13=UF&ub6HsT;dvy ziecQyK{ce>rN$r($D|CBz3Nug$_jWe%%X?EwgTsKl*Dc~I}3sx9Ul)r`2h@fT5Inp z(Nk_^QssssU>N2)`IjV)=MmH%VXKVcsMZWBwvtrTW)cnDeL)??svMqWgyDmru^Ny2 zs20dv+z>LFiA2YfkgFzd|aJ(JBNM<6_Uo&VUDCcuH&k(~6| zT+C)~Qrof`4RGv;tr$(iNom3l2H=v+4U0?jDdm=2YBGYDS4oO#EGwDI1gNCMdaDx( zGR0)dEnwE++G`!e%wAw(Qc(qqVY&~xDAgL0)?ltGSSEnlDut4fq?2WUCMz*7(E@t#A1f!Ofr$>e&a$FY^364Rwd1(Kou5P zm4k?JWCgH=UD3FkSb!O2)3-7F*kY(4h26p!feJ!buPmzU=CS*kFhsLUl?~2ezd{O0 ze2#eHE0N3!-UwR~s0*Am+%SUT3MJ!MC0sDo2!*K5_8Ac;DDc1xULlxeIv8=K@nG{j z;e~tJ8=FP!lp3fPEIdWLuf!&?0|iSDLCFRe699@9M>IihAFKdOLM)o|_nB-;7R=P< zJo!Vp6l7Zyn5J)fIhhVyml^aR%P3;FA}^c=~-IWZ#Kx10?cF*9YDT zwKQ%5)wmUGn`$b;5q}p^)Z%k;q*4%u34mOZj$4Jn`3YfsM@r1j2BA0$m?Rx)B{n=w z&IB9!x%*5--C@MKTfa^sGh;%`UFfCUGqP#Uvu#r6Nh04ERu0RRF50{{X70s{d7000015g`CE zK~Z6GfsvuH!4T2$;qV~;+5iXv0RRC%5Y1Ll-XWmD<5&gGlkO2OprMT4u?qwQ9}P7)R$`=y@9HEK6hWOhrgk7fjmFxlR{E#_*_rdaTR|l{-A1w-=%r zsp;3${06($_XDDFYG`m1y%iOBXMhhcADwZgApR4{F{X<^f?JB>7xk>DCOTZnhwuEl zW~(EFc7A))7A)QuKN9{l!)VU2crIC~%*Hr6qaVq!bn;+nva&hm~Y*tF<0oMbP5% zYrDkZ^Su`B0fw$C5zkM10Ax(FU$QO~=*`S9!4aP?jbw5}RDL?t0rC}8z~4uWLFoIy z!f0@<1Jz?kC_L+sG<%zp)Hue&80KUAYxtpqQQqZ4tbzDq>NU&>rmr_WJm{9{9^~;K z!M#txohx`h?W!APGd!-asbO-zb+p0(6+G)e7DKOkpoSII@8+^RFA%X7<0I1f*%RWy zAW`(g?u}7a8EWvN?-u?zSr{zTz+`a`C@kmCI*>ig>*V6;3q0s8*K6K^hbA@&p#!38 zBk9#+&Vm;jq;+&LvDF;|--qWw4e)E59`s0=9`z{)h+T1WrJe-QKoC*EdOhg_kEtRY zYmYlPP~+9!0>-e3{fWFvWQ&tiYB{5aC&rri-@0Ex@uGuDW+m_5!m|;c9Z03n?Xbo( zu%>55s%ReMGak9q{V+jP&g-wvqUv< z+3fJ32bnG2%{KJ%udf?>e}tnW#%>;_!~`M8M?bAN8j1%V8;X19*2@AQK;9D^Xa|IV z5lRv_wcZrMGxT})vqk5PxE?whWIELspmnj96}+PU@u@>Ia{RP3XZGHNYpqsSsjsl+TCp2wH<=R^PiKsYu7qhDKXWq>jUrAozQbUHFY90Aa3SizB}mi4qjg`rpL z=Rp~Wi%xH0xe)d!^lL~`f$HJf09f$qJD6?89q6sFA%>FpyK!v&1oQs@*Io#g$P5)ozc%7z;6TQ! zFanphCV?wQD}GZzB&aw%-_FLH0Rna+dUK$-2#!Y%mYCcdh9M`$4+h?0)>95|_pWs} z;>?uqafU~7IA}NVwSl5Cd#8S0zUt)9WPkU1l4zAU)Jzp&EaGSmYN=eA#pGii^o$0( zhq2a^#%C`fN6wWqu^x&zi_Znrw>J~~<%lj$Zrp)W%9?q?$&=>UwF(i!fHU)q>35Wr zE6|TCCUn*Y3Q>VZ#n&5TCY_s|!#0Y&>=cJLQnRbB7J!Q?ra9^TYfX7XE-ZLFX$&H& z0;Tyx{Aet@#j^7k%k|**>rL3YK=13y=xz4xMla1AY|3Hzs<@(YerH77su$hi(59*h zDpapg+|t4%fG};>C|bIi+!mv;!PbL4X(Nokjp$39Qqc!}>>Y%R2S4DukXk$j(!S~# zAczl3=Y@3>8W99%zPCFqS2k){;^gvchz1Al*>s04gw|*mWX@b^M?zMGs)GJBgc%Tl zOyiT*}2wXCvN%u**`C|tKW?$5I6nY|Gqx#gPOW-^QM&<|!OyAC&4g`Sm>gWOi zlh(KF#lyk(P!&uJ?B|UphoQ^+I@=cH1t*5+fPP7aPIC_vN36o8hk61$VhZ+|uAkY7 z2cV+<_4LiTALRc4df41-m5TAB7nRWs76``7RIW;NPG4JK&AvPY%l*04z2I)?k&s2h zc*f;IS-q7m111TdyKkj*s&W}3gpo39A~2MAFW^5fdQ%%6%l$<(4@TbzO<+EtU(cOs zNx_C3ebz2y3kj)=Tu5OT)1B_Yq`GTsDP(ug8l31WY+OwDpfaw)`o>o4{ZA}h%lAm} zh8!H6E52@J(EI!AN{VJ(APOYA91x?(Gkoe0ft@z+B#;>yO; z93+l!C4J{=EVO_tu;Yhle1R6YVG0;{#=RsfsKmD0&g8^TM8#1WIGTWT8foJ9^{!Qn zs^1NH!dE2v`Z(BU0i0hy{r5*IHb^;4pVJ13TnR{J4B+=~8q|!6j3vtDmGUEcZ2uKI!2>}`Nh;!G0Y7<5k%~Kx<0+4p?se8FKKpkzG3;$3>+8r zCQlFvtKzd}P#I9yR&Fk$1$@rO>N z#B!c~d*RwV{{Wq!NPDdEYoVXoj_FM6>g7!d)|8ZBu>raNZ0f}q}eMEkTQ zDm2-Qb(ykqCSVnx*E$M{<28D9kLzv{kh=110&9hV=)ay z9EiAvS(%|^4Oxas$vpYlM`kz#HkSa+Etq8K%Vwa!0Y{ZG5C>Pd>AALn%LO^QkXdJI z$nd;myAxR*U@4dDx8b)j9nLkRN*(5KpM{W|=y-`!Ae`MA2d+>iY31)tLntr~)Y*y} z03`z}q@^>A4llhN(*+ENjl0l5P(BZSwR5NBpm{Y2qhLjEA>NW6^t%T0tI&}EynWnZ zCm1xTPeC;$0z#^CethZmT;0dUq!E0sxjf@V*J4D+Myh!_#Z6FrZ#76)NV|F(l;)2E zFYoYgA(Ad8xb1|KzgnFiM%WM_yxph7rT{G@@u{L*a{f;T*Xw!iM%c5xK}YgF9qylplhcL%@gMHM+MhZvtzydxD;{lY_SStocfH>nv&=5lmL~)vC^|Ra*uns+o2gL7tFv5=< zsovrMN|jUSFP?Ly#OgDQJWRMbeL8mlta47=tH-SKsz6JGF!7Ca>_m*qihoyH<6Y&S zkM*Uh02CF+zi)b>6(}8fnjl!21Kr~M&{R=9M~kRYkv;T1FTE`A!8!i`dgPJAlfCt< zS1>%D44UGHP@-{+^!1|vNQoz(bMCQK2w!~ZvkL%o`QAx&%a3gS^cgK{;HFJt+A9E^ zQyXn|U59;s1Flnm%8`q4b{ zW-zX@beYD8RRIYZU@#^d&b(F@a`L7kS@6<{AuQZ4ME`)Y{br$W#yD3n(Due;;7;(WW>FA)vS1e;h*ntNMeQQ zWYNwgGmg_7xH+c43B{SJyg4~{gJ(d6bEH86g9QFGQz97v!~j_Hsc6|yAI_097UDb&!ROuS%M|P&<^@-` z>rjFfa<+V!6ysVn4^cMFKooh^gBZ4(hpmot29}kE;BIE5G4MzwUyQ-jPeA$S>`$c^;`qGuIE`s;;t50gQ8%Kr8yVGb*8FY?dhYB4$4 z1tn|1T;r{QZ3N@MwjK)7O)Afgg~5(U21&9>02g5IM+785d2{-j zAq$TY>kf2}&q1B9L8MW{WuBMM{OOAbq5LzQ#v&mh+y*`lkldm`z#{RWiV!jB9=8M_ z5m!(Q21E#noIP{i;`J2oOyHJ~EFe)YEs6Nyk^ z?OQqiw1`v;G8}1tmKdSDZZ$KP9uL0_I9-|?xN;=%HC{l-aA}ZH0vn1m`D@z>GscKu zfS@+*gkMLGX|~Zhnc_#6F!i>x2!rgw1<$QC6D1f^xJqo2gTN-fC>t2Zch>Q`f)e;) z^FYSdlMnaR(1g5Eu3sLz*FqS1OT`(-(~TKL9AR->2k%oSCmeN;IoXDg%Xkyc zAN8b2#5~qt6Fod>-*STjsa>4ECZClNVS@@4b9$ZWCRzXwiKIIC1E;SOybiokGl_M99tJJ~rYYq5O!1OdRZmZfRN4IPB{{Yk@ z3#DSBgedF*@HuZovKMQ{2d5{EIYA&6ToDZW)s_SC+Po7(mw}o*oVeQ5OTgAcQ3dBv zf$T6e)xiN2A9&KlN}vy(bySz(cz*S%q9iLfHma4sG_L3i*4pPsRel)mR`IH5_B60H zJZcY@g+(+qN$ycEIpDW0mO&xKYK3W5$lEg%RM$Y|XQWJ!?%n zP^`Jp7!pBGXIo$~2+Uo6Z99nIJ|W{;1k(qR>0+Lc+rE-r-SC754v&cX?m(51@h=v4w%c0zz23$*?GO|o)-d4dOYhW z6DU(28Jyhg<)>Vs?Q}Q>D=5~Lmbr23QFn|fP8jJm3>>gajmDtBja~ZJ z+o5~#KQ+KO*Ag>hp|i-EL)?=^Z@m*SiLBo)H<)lustXKQwNn} z_oc}%6US*f9|hddq#6fIm~Xu4B8*K}5|e^+{{VV49T?(3a&reneuxMYF|9G{y%?xm zrCz!dI~aU&z9-(a)$H(nnrgI9x_cT*>an3J}T|P*T2KIA= z^_^ykMT&OtV{n(ADiw@tAcX}}{Gao%+hm|9PdIcyB_fUQAoYtizkExPI1?H3s^54r zhfDeKynGp}dfQiYD4qj*)`$x}k2l8KpEP4bL2-m%y0gOT-qdg)9A77mXqi#V(wrP2l6%i?=HOWI|pUdaM5%< zp0-F>ZIQ(HcEvWzvm0edgWrO)R}HC)E;7<#o!^?0m5%muh(_au<8L>+Fs@Mq#w+@D z!Vs_88yE%8hU@B!Syfasf1}=mYY@UmCk~k{?^Ib*!PSMzXThVK&dHgp{{XyguS*Ri zMmtTt9}uJkQODj`?PbD7a1~H{y!+TuxFo7%6O#9+Tg!nnZ&FYP3*6D(SXYSxzjrSH zrLM!ES__%3ihQLwyxvQTiK?Fv1Z0)UW2{4IP>0B1Jm>g!)vC(zdegjH1r@^V2jhZu zSCn(-I>Z7e85AM+ZRHbwyZ5*>G${B~hFF&8ULoY9Jx*O*XgJ~pDM`jnYlDgf&-`gh z?zvCCHakxUHHI=QEPL4QCINWXCW`=5XeGKfzaU0K+ds~ZA;SU#5yw33#{>&e$39I$ zfmD8-rRo5{d)ydN;pw3m8hO}=56zIg>>zUuflMonF+DpA#LzJeP5Fe;M1Mo@*H>`4 z?`XO%<+O;+uI16yVy2$}EXS<M9W6XOFt1^)np zSdxx;4L?R)?3^b684nm!hc)X&yEt%K9v8>!PXs{|+#fvn-0$j56TH4o zJ?nbj37CtM)OOEXYJz}UmmW1?JPi2l#xbu@I0A#!NNNiVO?E=wxg)j$DhZbvDtDax z?@0WiL&|l1cLPcjy#D|jd{EVLbwG;T16qOL$VB#csdjJT0iPUKO|^ET2e)QBSumbF zYH&M;oHF&#<5oDsXe7(%^T(aC+g=Zb1a7WHMicepO@%n%s_KjKk1Yq_0ib3YZWuB( zAn`8WpyzVoW*UbQ-M}k~W-q{}PCei?%TiH`#qUYe8!&J<*(i#5J(`G67l6;5vXnMZ zdO6O2TflI5LFAs!Hfeh#To`H1_1}#eMW_%&Ooh*XOOr%uXkS z0B65CQ&h`ifN>uu?W6bzIM1(IH+bYGO~zA*pqVbF!yQvE<7>_%2TGuTRIMUDF=c5# z1O*3(kMpx1EvUU(?ME8zE}Q@e;6Kr$4TmYX)S<{|uJJVSd2I&BZP~gHuzv}xAC1qf zXr%=jdeE1UVexaVfb*dfr=4u>7@_Dq{r+?r&}4l#KJ=kW4hz6}aYK^lOd%*4J^)U8 z!#bSkBXaqkL2fOX<4?mFIhBe`gE;>HjRMAzT@jq>6lzONAsg&JQwc7RY`oSB_VXKO2|OMoZ<-*NvxMQ0BTpGmBZDuHv<2IL1;C z_lWnX6$M|v^vHTQQ7>tF4ubNMj-Nn2FCCiDx1XPqm_6Cp>CgF`2<# zoGc&Dy<}wyuq%fkDs*RMj)X2T%3#Co+T}F84_9HjN#t~oXUyqq0WlcP=aorg$MG~A z%&Bd336DVi^`)$g;GK^qd(k8T26KNRPZL>)7zr+NZd@W>KQy3+-6@*Q(E>p!6$d%V}{orNkK02-sCAW7ZlM--rhB?95V z{xh^gg)-e8M7ed62}G`(MGeS(z!aIEF!LfF~ouEP!qt)9cf}nqTHuCQ{PaQeV zm?T(H84A30Zt)M%NQk*m`;AUs-=?f(fE5UWOCZ(2$R91gWWzmdRe zjST`Y($UDt86BmtrVKXWFM3%@Tq+mAxhi8QM~TL)6zXDH&f_rb6BworRI?g&sKbPj z@r=T8d34fhs&FW%&Nmz_!RdbS;_&HKDqK2co9#XW+Q9p*fk7j0TB^-X_Z;!5YGqzE zg|2Y@KgPHn@v%9{Bxj;c~o8&Q?dLakSX8nRFf> zbF{E!qxnDM8(mW3f2)UsK~d)67Ui8)%u|!#oNb2OrA~PN0F7iQA?~>wF7PI}TU;j0 z_{`N)2*Ke|vyWWtbn%o{SXMK=trKF0lm#k$s2rXYb9x{FeI9ZkmC$U z^JdJWBS(ZFJ(-wY#g2VUQ^>t0vjeY>mJIcK)7C%{VuB;sgqV1#2{Vi+qnn*y8Y(G~^Y4vGr3?=X*_|6%B^hN`D~!BH zQQ;$sOr&v+xWS^sLZ*fNkd_Obb`%P@CDRnY=4py5j;3l+4S)vvNZwsN^^hSJu`+)zxCeYJ&EcmhPY$%Bl{>by`rLoXsLlL`CP2O&ct zS0$MTo-{{+;sW?!gV&E5am%8_XdEY=CWIwzv6(95Qy%fId6^kP^0+~5{{TBgu}c_! zm!*-N!>MKh46TaGfaK#(E)WrEQr?RE*E&vn21C&qtRy@d8#eD2NNk4VEwyp|0seQF z=D2F+qnC|>NfSBTo587oG#(M_MhrLujj|heAPahrJu|&PG-(qG2RzaGXr#b5AOi3W z@0)bt1vDaHs1{t)okhr2#vr)kyz7roaxQ0Uc+!F8;xSe2=$eA(az~TiCU)7N#yi(b z>D$%dCwL5gO=l?wT>!%Oxuma>cb>l*%7f&}e_=E0Q^Eb}$Lw)$J_KvL4$bD!Jcd@Y zr$rSE*~lRb1#0}7NYW5#qNl&v#@izDQur__FyZ;EWcgDQ1@Vcl!OH^U=YKYEa}sgj zn4b+?iIz;L>6a&$&WaUU)Gz$$qq#B#L7d`aav*%UASu{MT-NBbutjna3Q+7A068e^ zpPzxUDX`|0fOeK2cMSrI^HR-tGlSOB832e8Mu=tiuLX$o1VKq3DEiLb=HW09i~Z-U z?;!%1Jzn{{5!Aw9dDdqH8Tiy8BBp8aG^o#5fyItzhW*zgkY@xj<_#yFv`MKFC@xG{ z&d1i!PLJt+4Mj8m00G5|ojj_HC#Nq1mDmxp91p;+9nN|;Hsga3&K~JMdxuHzI3Ko; zPPsK{{pyVJ)Co=L+)yyLW>FIOPNmU?=DoV(25tFW;(yfhr~v9^dc&D!pjj{hiNN+V zXU$@2*g{MOLCJ;pswv364GMWHoa-{42q@KHz7`rc8LBRY?NQ^#o~kJlY{vsxUY(?V zgN`xb$LmO}DzJc9^pk$J*= z(4Wf^4jIoX@bxvC$D}c+mj*N2xtgF!NuMyzII~12h4es=Jiiszi$~@Vla{@@VaO46 z!H?6W%CcG0Gj9`&dG^L5w?1Q9SH_fdac~FyLM?$vabKU~Lns^=k2w8k(WEL$R3v=JriFWR;1@mf;L9-8Mlk zaBB!AZc9y!^&29b9JUejxzm}4g0wGq)%9v#rd&M!v`q{Mt~iq9T>iA#U>Fdf2`(YF zDawWA$Hsigt;-PR=S&JFzB8xtLIvgj0FU0+;jKW2U>OIc@uBU_z(}mjv5f;9s=xrF zgXQI%=27bk#sN5)!<-n~<}hRw0vVnkyC7hIytC}b^PqS^k&5PL#n8?Q5GwjMfff*H z=Tk;;O$=BEE_~}ODH7;^;rwn#N5_$#6|2@S9GdJ3rDp&E!A?2!>hdUANLPTzd&r7GSlTsmZY^{*YG9di1en;3C}IdC+Q5!8k7`@!q8UTqfZ}M??33^l zxryb~RIrQy0y$jd<8f6h2*yz#J#H!S6^Pm4U(T$;EGl8ip><-}8Lc^^Yf|uIf5C^} z8*gbPZ5^RNey+kzAj{Vl{&xLEqX*NiDwn~A5UTV6Itn@~o2?H3n0y#f}SF<8i8JN$@b~QW!Nl{|Qi|6yU1saF% z@^LjKff0qzL*3}-NvBN&3j+vHy+@n0g<*JP1ojBA;_4<=M;X#tn38=!*2*w*GX*L2 zH_|ErWeh$% z=mM%$RnP2nHjX-@+V}5JlMIjkhQ~4h!B#6W980+wbwP>+XioJ9>r^$NTFdWyG#!)A z-NpNaJ%n4ITxz6@v~V#16D>M>tw8OX$0sFMgN+JhnezoDnZ-SKxeYStQs52=IQOT) z23R=(%9+(wbE$_?`tk2oC@@|VD0jy2amSJMr^#kZ7xS)fv zX&XENAKr`rXaw7%K@DnMatW@|)sz?i00&RHF}v}$B4TO6kPxAOuR;E#j%SURubZcs zd~^b}tk2D$V=p>qfXVHnGyu8Wjy9$?jWGWJQ_$ZA2s;aU)=P<*g_U;RwIGtl1F(&& zb%CpdqvVIb&VU6#Ks8UECZzQ*g!cFMazy2tv=hA(nHLJ<`qt5{iL;#i(pqrxT(54) z{T$@f%i|griNt}7b-8s?No2p?yV{v&wS9ZlYE`I;E+NJ5tpvk9hA$CE_VcL9CqN20 zmI%MS6p>OXQpp5lem3*~c<^(|@qGN;mt+HjBB85pHH9LEBw83Ww4~<-udmjVSztz8 z1Dg_V25?16dh+_llSiO2&sS7yWSPfiajY-pgro}Vj$+XPl|UyN{wa$W#ZAi;V2u0^ zoheNQ81ze~y^Onboe+=Z(EtI~fbsr_y=VrgxkY>fwcrf8$GL7ph;!+|{O>>h0_Ym4 z!i4k2(w5RUjB9WySkV%9Z&PB`W1VpU!O6t_&YWApM0ic(O&Z$Fks^ttEvu6enAIQjlbe>ctB6ECCtXS6;E z{Or(~j{9B4#O)DB7aVh}Ez%(v?%hrjFhx0rc=G6vy|6UVpIuC;tGMjS0^3z8y*i zQ;)y%xB$cao5cwz>;zJ;n|4P$8gd{6!?ZdUwNL&Jt8+U^nA$(-bktB}NF$2vU5a9H zBY^ER&4Dm7RRfI@YYrg3Mold_3=<494xg3m%(9DE4tR=dG3!?H5@R|Yh6Kd+4?1Qb zgmPi$S*7O4zcj(P?jFPAq)D**7%zC|P-p-J%8L^6*@NcOfIQ}r&sgB|rx+yYPj0Ay zL{h4jIWlRAMR`*@ezhZ%s*NJNKk>8}CxQk?yRn{ds(L4`z33za!(nQ7MawF~OQ^5`lG&i>)JYtaZ9na#Sl94J<-bOK}EZmdg_OiEs9 zfb~v3>hap`!qSZO~KIf_;et&novCPtyh)e_K&|DXtyG^SF|*mrSi-fG(X1VA$pZe zzjPE$U`ynBRCiA<9aSu$ zhD3ZR`nn|o>dyh!8-;DezzksVv7P{w!r!o^zSYB_kwGmlNljte9$w0M3(tdA{07H5 zK5}WnvxrAmS5M5GxWO)W1PV(V&QsqDjS^~d_$)oJa3+%_$00BDdOw{c6VEP-O(c+j zUk>zC6f?ni!_l;v)g)!dSejDn#-DAY1i`3sr-8neC1b~p!#D~t5`OouE{|R`$$(VQ zhw4Aw<5nu_qisB!TF4_Xj73 zK$RXOPNJbTjxkNqa#i*UcwYmx*(o{ZMzF^)bP z2P}^&ANQ^UB5*m*o^4vy@P(LL_|ko9r7tUa+#rdG6MxRwwn48WjdlpbBD{z1NRTlr zEP!Xi7Zf5r2%iSmI=Um@O_Jx+l_GMQkU z?;kA8{3Jj8hCk3-jpjpIjKXeD_}47&2GGulO|^8MdVcE+2P1#I;y^~M*;|5Z>pNUI zY|;#&E1h)$;Pt5lvIC6+2vdaY{{Yba(G#fbu-y*;IY)x&4F~`rcKr3ISGb|=df4bz ziaugHZn}1BY-c~j+avH)h=Ot6zcM{p!lqL*Iugx6N^}ew6xHINPpt`DO#wm013#^4 zaY&$h3AxG>NZ{ug$;P17t1bGkTa$As0B;KOLb^Cdt*suXT0o=TuM>c&lgATYKBj`P zjE;P3fVcpG;p1J8#=UL`UiHhRa3S2&34N#e??+d#ns@+uH1gVGL*8~xph7#w^^xhR z;#ygc4|ZchJaW3V?Zf%k;*=bYW%mpD*Pr&Bv@}zT$)t^=jiHx}XmE7x(ske6be*o$ zM+L`v^ij8+0UfD&Hjpo4tAb3jT+-qCD1t68Z~4gP%aPs(?W;^p~=AXU%NC=S;nLoW=hgcQV5G9 z6yV-RZcG@E?)&K1oirn+3DOS9poQ({UpHIJJa2dNr0Dbo(naBR54yfhpje8#|Jk-z BXL$es literal 0 HcmV?d00001 diff --git a/Tandori.jpg b/Tandori.jpg new file mode 100644 index 0000000000000000000000000000000000000000..791430f64957079cacb0770337baae332ce9af3b GIT binary patch literal 50161 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 { + const codeMirrorElement = document.querySelector('.CodeMirror'); + codeMirrorElement.CodeMirror.setValue('Everything goes good'); + }); + await this.page.locator(this.contentSave).click(); + } + + } \ No newline at end of file diff --git a/pages/Couponpage.js b/pages/Couponpage.js new file mode 100644 index 0000000..2b04f1d --- /dev/null +++ b/pages/Couponpage.js @@ -0,0 +1,65 @@ +exports.CouponPage= +class CouponPage { + + constructor(page) { + this.page = page; + this.couponButton="//span[normalize-space()='Coupon']"; + this.createCouponButton="//a[normalize-space()='Create coupon']"; + this.viewCouponButton="//a[normalize-space()='View coupon']"; + this.selectDiscountRule="//select[@id='oba_coupon_criteria']"; + this.discountType="//select[@id='oba_coupon_discount_type']"; + this.minCartAmount="//input[@id='coupon_dicsount_cart_amount']"; + this.enterDiscountAmount="//input[@id='coupon_discount']"; + this.calenderSelect="//input[@id='valid_from']"; + this.validFromDate="//input[@id='valid_from']"; + this.validFromMonth="//input[@id='valid_from']"; + this.shortDescription="//td[normalize-space()='50%OFF']"; + this.descriptionCheck="//td[normalize-space()='Happy Diwali Makkalaeeee']"; + this.internalCouponValue="//td[normalize-space()='MKSd20472']"; + this.couponCode="//td[normalize-space()='COUPON50']"; + this.forUsers="//td[normalize-space()='individual_users']"; + this.shortDescriptionGuest="//td[normalize-space()='Diwali Design']"; + this.descriptionCheckGuest="//td[normalize-space()='Wonderful and Beautiful Design']"; + this.internalCouponValueGuest="//td[normalize-space()='0nk8e6137']"; + this.couponCodeGuest="//td[normalize-space()='MIN500']"; + this.forUsersGuest="(//td[contains(text(),'all_users')])[1]"; + + + + + + + + + + } + async CalenderCheck(){ + await this.page.locator(this.couponButton).click(); + await this.page.locator(this.createCouponButton).click(); + // await this.page.locator(this.couponButton).click(); + await this.page.locator(this.calenderSelect).click(); + //await page.waitForTimeout(5000); + const year ="2024"; + const month ="11"; + const date="3"; + await this.page.locator(this.validFromDate).fill('11/12/2024'); + } + async viewCoupon(){ + await this.page.locator(this.couponButton).click(); + // await page.waitForTimeout(5000); + await this.page.locator(this.viewCouponButton).click(); + } + + + + + + + + + + + + + +} \ No newline at end of file diff --git a/pages/Feedback.js b/pages/Feedback.js new file mode 100644 index 0000000..03074a8 --- /dev/null +++ b/pages/Feedback.js @@ -0,0 +1,15 @@ +exports.Feedback= +class Feedback { + + constructor(page) { + this.page = page; + this.selectFeedbackType="//span[@class='flip-indecator']"; + this.searchFeedback="//input[@id='oba_feedback_search']"; + this.searchButton="//i[@class='fa fa-lg fa-fw fa-search']"; + this.feedbackButton="//span[normalize-space()='Feedback']"; + + } + async clickContentButton(){ + await this.page.locator(this.contentButton).click(); + } +} \ No newline at end of file diff --git a/pages/LoginPage.js b/pages/LoginPage.js index 4b52af4..33a9c41 100644 --- a/pages/LoginPage.js +++ b/pages/LoginPage.js @@ -11,7 +11,7 @@ class LoginPage { } async gotoLoginPage(){ - await this.page.goto('https://jaicrm1.orderbookings.com/login/'); + await this.page.goto('https://dev.orderbookings.com/'); } async login(username, password){ @@ -25,8 +25,11 @@ class LoginPage { async loginWithCrtPassword(){ - await this.page.fill(this.usernameInput,'rabisundaram@gmail.com'); - await this.page.locator(this.passwordInput).fill('#12345678A'); + await this.page.fill(this.usernameInput,'xpcv2@rustyload.com'); + // await this.page.fill(this.usernameInput,'rabisundaram@gmail.com'); + await this.page.locator(this.passwordInput).fill('7777777777'); + // await this.page.locator(this.passwordInput).fill('#12345678A'); + await this.page.locator(this.signinButton).click(); } @@ -36,7 +39,6 @@ class LoginPage { } async backToLoginLink(){ await this.page.locator(this.backToLogin).click(); - } } diff --git a/pages/NotificationPage.js b/pages/NotificationPage.js new file mode 100644 index 0000000..cc64446 --- /dev/null +++ b/pages/NotificationPage.js @@ -0,0 +1,39 @@ +const { clear } = require("console"); + +exports.NotificationPage= +class NotificationPage { + + constructor(page) { + this.page = page; + this.notificationButton="//span[normalize-space()='Notification']"; + this.target = "//select[@id='notification_target']"; + this.title = "//input[@id='notificationtitle']"; + this.content = "//textarea[@id='notificationtext']"; + this.hours = "//select[@id='notification_hours']"; + this.minutes="//select[@id='notification_minutes']"; + this.scheduleNotification="//main[@class='app-content']//button[1]"; + this.sendNotification="//button[2]" + this.calenderSelector="//input[@id='notification_date']"; + this.monthYear='October 2024'; + this.calenderNext="//div[@class='datepicker-days']//th[@class='next'][normalize-space()='»']"; + } + + async datePicker(){ + await this.page.locator(this.notificationButton).click(); + //const year="2024"; + //const month="November"; + //const date="5"; + await this.page.locator(this.calenderSelector).click(); + const yearMonth = "January 2025" + const currentYearMonth=await this.page.locator('this.monthYear').textContent(); + while(true) + { + const currentYearMonth=await this.page.locator('this.monthYear').textContent().toString(); + if(currentYearMonth == yearMonth ) + { + break; + } + await this.page.locator(this.calenderNext).click(); + } + } +} \ No newline at end of file diff --git a/pages/OrderPage.js b/pages/OrderPage.js index 411d8cd..19336c8 100644 --- a/pages/OrderPage.js +++ b/pages/OrderPage.js @@ -10,7 +10,12 @@ class OrderPage { this.usernameTextbox="//input[@id='oba_order_search']"; this.textBox="//input[@id='oba_order_search']"; this.filterButton="#oba_edit_order_filter"; - + this.orderName="//div[normalize-space()='Name : Shubya']"; + this.orderEmail="//div[normalize-space()='Email : Shubya111@gmail.com']"; + this.orderPhone="//div[normalize-space()='Phone : 919480111222']"; + this.orderCost="//td[normalize-space()='200']"; + this.orderQty="//tbody/tr[1]/td[6]"; + this.orderAddressAPI="//div[normalize-space()='Address : 37, Thomas Mount, 627109']"; } async clickOrdersButton(){ await this.page.locator(this.ordersButton).click(); @@ -43,7 +48,6 @@ class OrderPage { // await page.waitForTimeout(5000); await this.page.locator(this.textBox).fill(textBox); await this.page.locator(this.filterButton).click(); - } } diff --git a/pages/ProductPage.js b/pages/ProductPage.js index 6ee7fc9..f6d639d 100644 --- a/pages/ProductPage.js +++ b/pages/ProductPage.js @@ -23,6 +23,8 @@ class ProductPage { this.searchBox="//i[@class='fa fa-lg fa-fw fa-search']"; this.editButton="//i[@class='fa fa-lg fa-edit']"; this.saveButton="//button[@class='btn btn-primary btn-block']"; + this.searchProduct="//input[@id='oba_product_search']"; + this.searchButton="//button[@id='oba_product_search_btn']"; } async clickProductsButton(){ @@ -58,7 +60,30 @@ class ProductPage { await this.page.locator(this.productImage).click(); await this.page.locator(this.uploadImage).setInputFiles("C:/Automate Testing/OBA Automation/Biriyani.jpg"); await this.page.locator(this.saveButton).click(); - } + } + async addProductFunctionalityForAll(productName, productPrize, productQuantity, orderLimitvalue, taxin, shortDescription){ + await this.page.locator(this.productsButton).click(); + + await this.page.locator(this.addProductButton).click(); + await this.page.locator(this.productName).fill(productName); + await this.page.locator(this.productPrize).fill(productPrize); + await this.page.locator(this.managedRadioButton).check(); + await this.page.locator(this.productQuantityValue).fill(productQuantity); + await this.page.locator(this.orderLimit).fill(orderLimitvalue); + await this.page.locator(this.taxIn).fill(taxin); + await this.page.locator(this.productAvailableCheck).check(); + await this.page.locator(this.isLiveCheck).check(); + await this.page.locator(this.shortDescription).fill(shortDescription); + await this.page.waitForSelector('.CodeMirror'); + await this.page.evaluate(() => { + const codeMirrorElement = document.querySelector('.CodeMirror'); + codeMirrorElement.CodeMirror.setValue('Yummy! Delicious Taste, LifteTime Settlement'); + }); + + //await this.page.locator(this.productImage).click(); + // await this.page.locator(this.uploadImage).setInputFiles("C:/Automate Testing/OBA Automation/Biriyani.jpg"); + await this.page.locator(this.saveButton).click(); + } async addProductFunctionalityUnmanaged(productName, productPrize, orderLimitvalue, taxin, shortDescription){ await this.page.locator(this.productsButton).click(); @@ -74,14 +99,54 @@ class ProductPage { await this.page.waitForSelector('.CodeMirror'); await this.page.evaluate(() => { const codeMirrorElement = document.querySelector('.CodeMirror'); - codeMirrorElement.CodeMirror.setValue('Yummy! Delicious Biriyani Taste the Beauty of Kanyakumari'); + codeMirrorElement.CodeMirror.setValue('Crispy Chicken Tandori'); }); await this.page.locator(this.productImage).click(); - await this.page.locator(this.uploadImage).setInputFiles("C:/Automate Testing/OBA Automation/Biriyani.jpg"); + await this.page.locator(this.uploadImage).setInputFiles("C:/Automate Testing/OBA Automation/Tandori.jpg"); await this.page.locator(this.saveButton).click(); } + async addProductFunctionality1(productName, productPrize, productQuantity, orderLimitvalue, taxin, shortDescription){ + await this.page.locator(this.productsButton).click(); + + await this.page.locator(this.addProductButton).click(); + await this.page.locator(this.productName).fill(productName); + await this.page.locator(this.productPrize).fill(productPrize); + await this.page.locator(this.managedRadioButton).check(); + await this.page.locator(this.productQuantityValue).fill(productQuantity); + await this.page.locator(this.orderLimit).fill(orderLimitvalue); + await this.page.locator(this.taxIn).fill(taxin); + await this.page.locator(this.productAvailableCheck).check(); + await this.page.locator(this.isLiveCheck).check(); + await this.page.locator(this.shortDescription).fill(shortDescription); + await this.page.waitForSelector('.CodeMirror'); + await this.page.evaluate(() => { + const codeMirrorElement = document.querySelector('.CodeMirror'); + codeMirrorElement.CodeMirror.setValue('Chicken Lollipop'); + }); + + await this.page.locator(this.productImage).click(); + await this.page.locator(this.uploadImage).setInputFiles("C:/Automate Testing/OBA Automation/Chicken Lollipop.jpg"); + await this.page.locator(this.saveButton).click(); + } + + async searchProductName(productName){ + await this.page.locator(this.productsButton).click(); + await this.page.locator(this.productListButton).click(); + await this.page.locator(this.searchProduct).fill(productName); + await this.page.locator(this.searchButton).click(); + } + + async editProduct(){ + await this.page.locator(this.productsButton).click(); + await this.page.locator(this.productListButton).click(); + await this.page.locator(this.editButton).click(); + await this.page.locator(this.productAvailableCheck).click(); + await this.page.locator(this.saveButton).click(); + + } + diff --git a/pages/RunnerListPage.js b/pages/RunnerListPage.js new file mode 100644 index 0000000..8345e2e --- /dev/null +++ b/pages/RunnerListPage.js @@ -0,0 +1,15 @@ +exports.RunnerListPage= +class RunnerListPage { + + constructor(page) { + this.page = page; + this.runnerListButton="//span[normalize-space()='Runner list']"; + this.userTypeFlip="//span[@class='flip-indecator']"; + this.searchText="//input[@id='oba_user_search']"; + this.searchButton="//button[@id='oba_user_search_btn']"; + + } + async clickrunnerListButton(){ + await this.page.locator(this.runnerListButton).click(); + } +} \ No newline at end of file diff --git a/pages/UserPage.js b/pages/UserPage.js new file mode 100644 index 0000000..45e0ad1 --- /dev/null +++ b/pages/UserPage.js @@ -0,0 +1,36 @@ +exports.UserPage= +class UserPage { + + constructor(page) { + this.page = page; + this.Users = "//span[normalize-space()='Users']"; + this.activeUserButton = "//span[@class='flip-indecator']"; + this.enableButton = "//button[@id='66eaa9656b2f4a3d52a42549']"; + } + + async userPageButton(){ + await this.page.locator(this.Users).click(); + + } + async activeUserButtonCheck(){ + await this.page.locator(this.Users).click(); + await this.page.locator(this.activeUserButton).click(); + // const text =await this.page.locator("button:active").allInnerTexts(); + console.log(text); + + } + async activeUserButtonEdit(){ + await this.page.locator(this.Users).click(); + await this.page.locator(this.activeUserButton).click(); + await this.page.locator(this.enableButton).click(); + + + } + + + + + + + +} \ No newline at end of file diff --git a/tests/AddressListAPI.spec.js b/tests/AddressListAPI.spec.js new file mode 100644 index 0000000..4ac9ec6 --- /dev/null +++ b/tests/AddressListAPI.spec.js @@ -0,0 +1,81 @@ +const {test, expect} =require('@playwright/test') +import { LoginPage } from '../pages/LoginPage'; +import { AdddressListAPI } from '../pages/AddressListAPI'; +import { OrderPage } from '../pages/OrderPage'; + + +test('API Testing',async function ({ request, page }) { + const responsePost=await request.post('https://dev.orderbookings.com/api/user/addresslist?user_id=670e14cf14f563f755f3e2a1',{ + data: { + "addressLine1": "25", + "addressLine2": "ParangiMalai", + "city": "Chennai", + "stateOrProvince": "TN", + "postalCode": "6000025", + "phone": "919480111111", + "deliveryInstructions": null, + "isDefault": false, + "user_id": "670e14cf14f563f755f3e2a1", + "title": "test address", + "area": "Chennai" + } + + }) + + const res1 = await responsePost.json(); + useraddressid= res1.data.id; + + console.log(res1); + +/* + const response = await request.get('https://dev.orderbookings.com/api/user/addresslist?user_id=670e14cf14f563f755f3e2a1'); + console.log(await response.json()); + const res = await response.json(); + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const order = new OrderPage(page); + await order.clickOrdersListButton(); + // await address.openAppConf(); + // await page.waitForTimeout(3000) + // await expect(await page.locator(config.notificationSoundLoop)).toBeVisible(); + // expect.soft("//div[normalize-space()='Address : 37, Thomas Mount, 627109']").toContain(res.data[0].addressLine1); + //expect.soft("//div[normalize-space()='Address : 37, Thomas Mount, 627109']").toContain(res.data[0].addressLine2); + //expect.soft("//div[normalize-space()='Address : 37, Thomas Mount, 627109']").toContain((res.data[0].postalCode).toString()); + //expect.soft("//div[normalize-space()='Phone : 919480111111']").toContain((res.data[0].phone).toString()); + //expect.soft("//div[normalize-space()='order_id : 670e249314f563f755f3e2a5']").toContain(res.data[0].id); + //expect.soft("//div[normalize-space()='Phone : 919480111111']").toContain((res.data[0].phone).toString()); + + + + const responseDelete = await request.delete('https://dev.orderbookings.com/api/user/deleteaddress', { + data: { + "user_id": "670e14cf14f563f755f3e2a1", + "address_id": "670e249314f563f755f3e2a3" + } + }) + console.log(await responseDelete.json()); + + + await page.reload(); + + + + + + + + + + + + +*/ + + + + + + }) + diff --git a/tests/AppConfig.spec.js b/tests/AppConfig.spec.js index 5c9c15e..715052f 100644 --- a/tests/AppConfig.spec.js +++ b/tests/AppConfig.spec.js @@ -3,8 +3,7 @@ import { LoginPage } from '../pages/LoginPage'; import { AppConfig } from '../pages/AppConfig'; - -test('AppConfig 1',async ({page})=>{ +test('AppConfig button is working or not',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); @@ -12,17 +11,146 @@ test('AppConfig 1',async ({page})=>{ const config = new AppConfig(page); await config.openAppConf(); await page.waitForTimeout(3000) - await expect(await page.locator("//select[@id='oba_appconfig_select_currency']n")).toBeVisible(); + await expect(await page.locator(config.notificationSoundLoop)).toBeVisible(); +}) + + +test('complete AppConfig page to check API',async ({page,request})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const config = new AppConfig(page); + await config.functionalityAppConfig('UAE dirham (د.إ;)','7','5', '400', '35', '9565456737', 'City','Tamil Nadu'); + + await page.close(); + + const response = await request.get('https://dev.orderbookings.com/api/config/919480707707?merchantCode=919480707707') + console.log(await response.json()) + const res = await response.json(); + //const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + //await page.waitForTimeout(5000); + // const config = new AppConfig(page); + await config.openAppConf(); + + expect.soft(config.merchantCode).toContain(res.data.merchantCode); + + const textBoxValue=await page.locator(config.calltoactionAPI).inputValue(); + expect.soft(textBoxValue).toContain(res.data.call_to_action); + + //const currencyValue=await page.locator(config.currencyAPI).inputValue(); + // expect.soft(currencyValue).toContain(res.data.currency_code); + + const notificationLoop = await page.locator(config.notificationSoundLoopAPI).inputValue(); + expect.soft(notificationLoop).toContain((res.data.notification_sound_loop).toString()); + + const cancellationTillResponse = await page.locator(config.cancellationTillAPI).inputValue(); + expect.soft(cancellationTillResponse).toContain((res.data.cancellation_till).toString()); + + const minimumCartPrizeResponse = await page.locator(config.minimumCartPrizeAPI).inputValue(); + expect.soft( minimumCartPrizeResponse).toContain((res.data.minimum_cart_price).toString()); + + const deliveryChargeResponse = await page.locator(config.deliveryChargeAPI).inputValue(); + expect.soft( deliveryChargeResponse).toContain((res.data.delivery_charge).toString()); + + expect.soft(config.areaSelection).toContain(res.data.area_type); + +}) + + +test('complete AppConfig page to check API',async ({page,request})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const config = new AppConfig(page); + await config.functionalityAppConfig('Argentine peso ($)','7','5', '400', '35', '9565456737', 'City','Tamil Nadu'); + // await page.close(); + // await page.waitForTimeout(5000); + + //await login.gotoLoginPage(); + //await login.loginWithCrtPassword(); + //await page.waitForTimeout(5000); + //await config.openAppConf(); + //const text =page.locator(config.currency).allInnerTexts(); + //console.log(text); + + + //expect.soft(config.currencyAPI).toContain("Argentine peso ($)"); + + }) -test('AppConfig 2',async ({page})=>{ + + + +/* +test('AppConfig 3',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); await page.waitForTimeout(5000); const config = new AppConfig(page); - await config.functionalityAppConfig('UAE dirham (د.إ;)', '400', '35', '9565456737', 'State', 'Tamil Nadu'); + // await config.toggleButton(); + await config.areaSelectionTest('State'); await page.waitForTimeout(3000) - -}) \ No newline at end of file + // await expect(await page.locator("//div[@class='card is_shop_open_card']//span[@class='flip-indecator']").isChecked()).toBeTruthy(); + // await expect(await expect("//div[@class='card is_shop_open_card']//span[@class='flip-indecator']").toHaveText('ON')) + // await config.functionalityAppConfig('UAE dirham (د.إ;)', '400', '35', '9565456737', 'State', 'Tamil Nadu'); + // await page.waitForTimeout(3000) + // await expect(page.getByLabel("ON")).toBeVisible(); + +}) + +test('APITesting for app config',async ({request,page})=>{ + const response = await request.get('https://dev.orderbookings.com/api/config/919480707707?merchantCode=919480707707') + console.log(await response.json()) + const res = await response.json(); + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const config = new AppConfig(page); + await config.openAppConf(); + + expect.soft(config.merchantCode).toContain(res.data.merchantCode); + + const textBoxValue=await page.locator(config.calltoactionAPI).inputValue(); + expect.soft(textBoxValue).toContain(res.data.call_to_action); + + //const currencyValue=await page.locator(config.currencyAPI).inputValue(); + // expect.soft(currencyValue).toContain(res.data.currency_code); + + const notificationLoop = await page.locator(config.notificationSoundLoopAPI).inputValue(); + expect.soft(notificationLoop).toContain((res.data.notification_sound_loop).toString()); + + const cancellationTillResponse = await page.locator(config.cancellationTillAPI).inputValue(); + expect.soft(cancellationTillResponse).toContain((res.data.cancellation_till).toString()); + + const minimumCartPrizeResponse = await page.locator(config.minimumCartPrizeAPI).inputValue(); + expect.soft( minimumCartPrizeResponse).toContain((res.data.minimum_cart_price).toString()); + + const deliveryChargeResponse = await page.locator(config.deliveryChargeAPI).inputValue(); + expect.soft( deliveryChargeResponse).toContain((res.data.delivery_charge).toString()); + + expect.soft(config.areaTypeAPI).toContain(res.data.area_type); + + + + + + // const toggleButton = await page.locator(config.onOffButton).isChecked(); + // const isNowToggledOn = await toggleButton.getAttribute('OFF') === 'true'; + // expect.soft(toggleButton).toContain(res.data.isShopOpen); + // expect(toggleButton).toBe(true) + + + //expect.soft(config.currencyAPI).toContain(res.data.currency_code); + // expect.soft(coupon.couponCodeGuest).toContain(res.data[0].campaign_code); + // expect.soft(coupon.forUsersGuest).toContain(res.data[0].for); +}) + +*/ \ No newline at end of file diff --git a/tests/CatlogPage.spec.js b/tests/CatlogPage.spec.js index ddf51b1..4cdc1c2 100644 --- a/tests/CatlogPage.spec.js +++ b/tests/CatlogPage.spec.js @@ -3,8 +3,19 @@ import { LoginPage } from '../pages/LoginPage'; import { CatlogPage } from '../pages/CatlogPage'; +test('CatlogButton is working?',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const catlog = new CatlogPage(page); + //await catlog.clickCatalogButton(); + await catlog.clickCatalogButton(); + await page.waitForTimeout(3000) + +}) -test('Catlog 1',async ({page})=>{ +test('Buds List is selected',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); @@ -14,4 +25,105 @@ test('Catlog 1',async ({page})=>{ await catlog.imageUpload('BUDS_LIST', 'PRODUCTS_LEFT'); await page.waitForTimeout(3000) -}) \ No newline at end of file +}) +test('Buds sliding is selected',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const catlog = new CatlogPage(page); + //await catlog.clickCatalogButton(); + await catlog.imageUpload('BUDS_SLIDING', 'PRODUCTS_LEFT'); + await page.waitForTimeout(3000) + +}) +test('Buds grid is selected',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const catlog = new CatlogPage(page); + //await catlog.clickCatalogButton(); + await catlog.imageUpload('BUDS_GRID', 'PRODUCTS_LEFT'); + await page.waitForTimeout(3000) + +}) +test('product left is selected',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const catlog = new CatlogPage(page); + //await catlog.clickCatalogButton(); + await catlog.imageUpload('BUDS_GRID', 'PRODUCTS_LEFT'); + await page.waitForTimeout(3000) + +}) +test('product ping pong is selected',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const catlog = new CatlogPage(page); + //await catlog.clickCatalogButton(); + await catlog.imageUpload('BUDS_GRID', 'PRODUCTS_PING_PONG'); + await page.waitForTimeout(3000) + +}) +test('product right is selected',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const catlog = new CatlogPage(page); + //await catlog.clickCatalogButton(); + await catlog.imageUpload('BUDS_GRID', 'PRODUCTS_RIGHT'); + await page.waitForTimeout(3000) + +}) +test('product grid is selected',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const catlog = new CatlogPage(page); + //await catlog.clickCatalogButton(); + await catlog.imageUpload('BUDS_GRID', 'PRODUCTS_GRID'); + await page.waitForTimeout(3000) + +}) + + +test('Categories API Testing',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const catlog = new CatlogPage(page); + //await catlog.clickCatalogButton(); + await catlog.imageUpload('BUDS_GRID', 'PRODUCTS_GRID'); + + + await page.waitForTimeout(3000) + +}) + + +/*const {test, expect} =require('@playwright/test') +import { LoginPage } from '../pages/LoginPage'; +import { ContentPage } from '../pages/ContentPage'; + + +test('Content page is opening?',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const content = new ContentPage(page); + await content.clickContentButton(); + await expect(await page.locator(content.contentPageValidate)).toBeVisible(); + // await page.waitForTimeout(3000) + +}) + +*/ \ No newline at end of file diff --git a/tests/ContentPage.spec.js b/tests/ContentPage.spec.js new file mode 100644 index 0000000..1e9ba8a --- /dev/null +++ b/tests/ContentPage.spec.js @@ -0,0 +1,54 @@ +const {test, expect} =require('@playwright/test') +import { LoginPage } from '../pages/LoginPage'; +import { ContentPage } from '../pages/ContentPage'; + +/* +test('Content page is opening?',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const content = new ContentPage(page); + await content.clickContentButton(); + await expect(await page.locator(content.contentPageValidate)).toBeVisible(); + // await page.waitForTimeout(3000) + +}) +*/ +test('Content page is able to save in privacy policy',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const content = new ContentPage(page); + await content.ContentToSave('Privacy Policy'); + // await expect(await page.locator(content.contentPageValidate)).toBeVisible(); + await page.waitForTimeout(3000); + + +}) + +test('Content page is able to save in Terms & Conditions',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const content = new ContentPage(page); + await content.ContentToSave('Terms & Conditions'); +// await expect(await page.locator(content.contentPageValidate)).toBeVisible(); + await page.waitForTimeout(3000); + + +}) +test('Content page is able to save in About Us',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const content = new ContentPage(page); + await content.ContentToSave('About Us'); +// await expect(await page.locator(content.contentPageValidate)).toBeVisible(); + await page.waitForTimeout(3000); + + +}) \ No newline at end of file diff --git a/tests/CouponPage.spec.js b/tests/CouponPage.spec.js new file mode 100644 index 0000000..66cb9f4 --- /dev/null +++ b/tests/CouponPage.spec.js @@ -0,0 +1,48 @@ +const {test, expect} =require('@playwright/test') +import { LoginPage } from '../pages/LoginPage'; +import { CouponPage } from '../pages/Couponpage'; + + +test('Login test with correct credentials',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + //const coupon = new CouponPage(page); + // await coupon.CalenderCheck(); +}) +test('APITesting_Coupon Get Details as User',async ({request,page})=>{ + const response = await request.get('https://dev.orderbookings.com/api/available-coupon/670e14cf14f563f755f3e2a1/919480707707') + console.log(await response.json()) + //expect(response.status()).toBe(200) + // const text = await response.text(); + // expect(text).toContain('Manju') + const res = await response.json(); + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const coupon = new CouponPage(page); + await coupon.viewCoupon(); + expect.soft(coupon.shortDescription).toContain(res.data[2].name); + expect.soft(coupon.descriptionCheck).toContain(res.data[2].description); + expect.soft(coupon.internalCouponValue).toContain(res.data[2].code); + expect.soft(coupon.couponCode).toContain(res.data[2].campaign_code); + expect.soft(coupon.forUsers).toContain(res.data[2].for); +}) +test('APITesting_Coupon Get Details as Guest',async ({request,page})=>{ + const response = await request.get('https://dev.orderbookings.com/api/available-coupon-guest/919480707707') + console.log(await response.json()) + const res = await response.json(); + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const coupon = new CouponPage(page); + await coupon.viewCoupon(); + expect.soft(coupon.shortDescriptionGuest).toContain(res.data[0].name); + expect.soft(coupon.descriptionCheckGuest).toContain(res.data[0].description); + expect.soft(coupon.internalCouponValueGuest).toContain(res.data[0].code); + expect.soft(coupon.couponCodeGuest).toContain(res.data[0].campaign_code); + expect.soft(coupon.forUsersGuest).toContain(res.data[0].for); +}) diff --git a/tests/Feedback.spec.js b/tests/Feedback.spec.js new file mode 100644 index 0000000..c32f350 --- /dev/null +++ b/tests/Feedback.spec.js @@ -0,0 +1,16 @@ +const {test, expect} =require('@playwright/test') +import { LoginPage } from '../pages/LoginPage'; +import { Feedback } from '../pages/Feedback'; + + +test('Content page is opening?',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const content = new ContentPage(page); + await content.clickContentButton(); + await expect(await page.locator(content.contentPageValidate)).toBeVisible(); + // await page.waitForTimeout(3000) + +}) \ No newline at end of file diff --git a/tests/LoginPage.spec.js b/tests/LoginPage.spec.js index 3d4c12c..721bc7f 100644 --- a/tests/LoginPage.spec.js +++ b/tests/LoginPage.spec.js @@ -2,34 +2,94 @@ const {test, expect} =require('@playwright/test') import { LoginPage } from '../pages/LoginPage'; -test('Login Page1',async ({page})=>{ +test('Login test with correct credentials',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); - await login.login('rabisundaram@gmail.com','#12345678A') - await expect(page).toHaveURL('https://jaicrm1.orderbookings.com/merchant/index/index') - await expect(page).toHaveTitle('OBA') - await expect(await page.locator("//p[contains(text(),'Micheal Rabi')]")).toBeVisible(); + await login.login('xpcv2@rustyload.com','7777777777') + await expect(page).toHaveURL('https://dev.orderbookings.com/merchant/index/index') + // await expect(await page.locator("//p[contains(text(),'Micheal Rabi')]")).toBeVisible(); await page.close(); }) -test('Login Page2',async ({page})=>{ + +test('Login test with wrong password',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.login('rabisundaram@gmail.com','#123466678A') + await expect(await page.locator("//small[@class='text-danger text-center']")).toBeVisible(); + //const errorMessage=await page.locator("//small[@class='text-danger text-center']").textContent() + // console.log(errorMessage); + await page.close(); +}) +test('Login test with wrong Email',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.login('rabisundaatram@gmail.com','#12345678A') + await expect(await page.locator("//small[@class='text-danger text-center']")).toBeVisible(); + //const errorMessage=await page.locator("//small[@class='text-danger text-center']").textContent() + // console.log(errorMessage); + await page.close(); +}) +test('Login test Merchant enters email without @ symbol',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.login('rabisundaatramgmail.com','#12345678A') + await expect(await page.locator("//small[@class='text-danger text-center']")).toBeVisible(); + //const errorMessage=await page.locator("//small[@class='text-danger text-center']").textContent() + // console.log(errorMessage); + await page.close(); +}) +test('Login test Merchant enters Email with excessive Length',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.login('rabisundaatramiuegkdsfyuydklashmnfbdkashnbv@gmail.com','#12345678A') + await expect(await page.locator("//small[@class='text-danger text-center']")).toBeVisible(); + //const errorMessage=await page.locator("//small[@class='text-danger text-center']").textContent() + // console.log(errorMessage); + await page.close(); +}) + +test('Login test Merchant enters email without domain',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.login('rabisundaatram@.com','#12345678A') + await expect(await page.locator("//small[@class='text-danger text-center']")).toBeVisible(); + //const errorMessage=await page.locator("//small[@class='text-danger text-center']").textContent() + // console.log(errorMessage); + await page.close(); +}) +test('Login test Merchant enters Email with consecutive dots',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.login('rabisundaatram@gmail..com','#12345678A') + await expect(await page.locator("//small[@class='text-danger text-center']")).toBeVisible(); + //const errorMessage=await page.locator("//small[@class='text-danger text-center']").textContent() + // console.log(errorMessage); + await page.close(); +}) + +test('Login test with Empty Email',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.login('','#12345678A') + // await expect(await page.locator("//p[contains(text(),'Micheal Rabi')]")).toBeVisible(); + await page.close(); +}) +test('Login test with no password',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.login('rabisundaram@gmail.com','') - const msg=await page.locator("//input[@placeholder='Password']").getAttribute("ariaHasPopup"); - console.log(msg); +// const msg=await page.locator("//input[@placeholder='Password']").getAttribute("ariaHasPopup"); + // console.log(msg); await page.close(); }) -test('Login Page3',async ({page})=>{ +test('Login test with no Email',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.login('','#12345678A') - await expect(page).toHaveURL('https://jaicrm1.orderbookings.com/merchant/index/index') - await expect(page).toHaveTitle('OBA') - await expect(await page.locator("//p[contains(text(),'Micheal Rabi')]")).toBeVisible(); //document.querySelector('input').value = 'New Value'; - // await page.waitForTimeout(3000) -// await expect(await this.page.getByLabel('rabisundaram@gmail.com')).toBeVisible(); + // await page.waitForTimeout(3000) + // await expect(await this.page.getByLabel('rabisundaram@gmail.com')).toBeVisible(); await page.close(); }) @@ -52,7 +112,7 @@ test('BacktoLogin',async ({page})=>{ await expect(await page.locator("//button[normalize-space()='SIGN IN']")).toBeVisible(); }) -test('Login Page 4',async ({page})=>{ +test('Invalid mail',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.login('midhaja','#12345678A') diff --git a/tests/NotificationPage.spec.js b/tests/NotificationPage.spec.js new file mode 100644 index 0000000..c111546 --- /dev/null +++ b/tests/NotificationPage.spec.js @@ -0,0 +1,13 @@ +const {test, expect} =require('@playwright/test') +import { LoginPage } from '../pages/LoginPage'; +import { NotificationPage } from '../pages/NotificationPage'; + +test('datepicker',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const notify = new NotificationPage(page); + await notify.datePicker(); + await page.close(); +}) \ No newline at end of file diff --git a/tests/OrderPage.spec.js b/tests/OrderPage.spec.js index 6ab1f05..89fcb7f 100644 --- a/tests/OrderPage.spec.js +++ b/tests/OrderPage.spec.js @@ -1,9 +1,10 @@ const {test, expect} =require('@playwright/test') +import { clear } from 'console'; import { LoginPage } from '../pages/LoginPage'; import { OrderPage } from '../pages/OrderPage'; -test('Order Page1',async ({page})=>{ +test('Order Button',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); @@ -13,7 +14,8 @@ test('Order Page1',async ({page})=>{ await page.waitForTimeout(5000); await expect(await page.locator("//a[normalize-space()='Order List']")).toBeVisible(); }) -test('Order Page2',async ({page})=>{ + +test('Order List Button',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); @@ -23,7 +25,7 @@ test('Order Page2',async ({page})=>{ // await page.waitForTimeout(5000); await expect(await page.locator("//select[@id='oba_edit_order_status_filter']")).toBeVisible(); }) -test('Order Page3',async ({page})=>{ +test('Order Status Dropdown Count',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); @@ -31,14 +33,10 @@ test('Order Page3',async ({page})=>{ const order = new OrderPage(page); await order.clickOrdersListButton(); await page.waitForTimeout(5000); - //await order.orderStatusCheck('ORDER_STATUS_REQUESTED'); - // const value= await page.locator("//select[@id='oba_edit_order_status_filter']").textContent() - // console.log('value' +value); - //await expect(await page.locator("//select[@id='oba_edit_order_status_filter']")).textContent() - const options = await page.locator('#oba_edit_order_status_filter option') - await expect(options).toHaveCount(5); + const options = await page.locator('#oba_edit_order_status_filter option') + await expect(options).toHaveCount(5); }) -test('Order Page4',async ({page})=>{ +test('Order status dropdown menu',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); @@ -50,16 +48,17 @@ test('Order Page4',async ({page})=>{ console.log(value); }) -test('Order Page5',async ({page})=>{ +test('Order status selected',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); //await page.waitForTimeout(5000); const order = new OrderPage(page); - await order.orderStatusCheck('ORDER_STATUS_DECLINED'); + await order.orderStatusCheck('ORDER_STATUS_REQUESTED'); + //need to fi }) -test('Order Page6',async ({page})=>{ +test('Order declined',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); @@ -67,4 +66,97 @@ test('Order Page6',async ({page})=>{ const order = new OrderPage(page); await order.textBoxSearch('ORDER_STATUS_DECLINED', 'Tomato Rice and Chicken Biriyani'); }) +test('Order requested',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const order = new OrderPage(page); + await order.textBoxSearch('ORDER_STATUS_REQUESTED', 'Tomato Rice and Chicken Biriyani'); +}) +test('Order pending',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const order = new OrderPage(page); + await order.textBoxSearch('ORDER_STATUS_PENDING', 'Tomato Rice and Chicken Biriyani'); +}) +test('Order cancelled',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const order = new OrderPage(page); + await order.textBoxSearch('ORDER_STATUS_CANCELLED', 'Tomato Rice and Chicken Biriyani'); + + + + +}) + +test('Order by ID API',async ({request,page})=>{ + + const response = await request.get('https://dev.orderbookings.com/api/order/syncOrders?user_id=670766e4272db54e96e423e0&phone=919480111222&lastupdatetime=0&merchantCode=919480707707&role=ROLE_TYPE_MERCHANT') + console.log(await response.json()) + //expect(response.status()).toBe(200) + // const text = await response.text(); + // expect(text).toContain('Manju') + const res = await response.json(); + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const order = new OrderPage(page); + const result = await order.textBoxSearch('ORDER_STATUS_COMPLETE', 'Shubya'); + // await page.waitForTimeout(5000); + //const username= result.OrderId; + //expect.soft("//td[normalize-space()='Shubya']").toContain(res.data[0].ordered_by_name); + expect.soft(order.orderName).toContain(res.data[0].ordered_by_name); + expect.soft(order.orderEmail).toContain(res.data[0].ordered_by_email); + expect.soft(order.orderPhone).toContain((res.data[0].ordered_by_address.phone).toString()); + expect.soft(order.orderCost).toContain((res.data[0].order_cost).toString()); + expect.soft(order.orderQty).toContain((res.data[0].ordered_items_qty[0]).toString()); + +}) +/* + + + + + + + + + + + +test('Order by POST request',async ({request})=>{ + + + const response = await request.post('https://jaicrm1.orderbookings.com/api/order/getorder/66ff73966374728214363781'{ + data: { + "ordered_by_name": "Micheal", + "ordered_by_email": "rabi2000@gmail.com", + "ordered_by_phone": "9600520046" + + } + }) + // console.log(await response.json()) + expect(response.status()).toBe(201) + + const text = await response.text(); + expect(text).toContain('Micheal') + + console.log(await response.json()); + + + + // const login = new LoginPage(page); + // await login.gotoLoginPage(); + // await login.loginWithCrtPassword(); + // await page.waitForTimeout(5000); + // const order = new OrderPage(page); + // await order.textBoxSearch('ORDER_STATUS_COMPLETE', 'Manju'); +})*/ \ No newline at end of file diff --git a/tests/ProductPage.spec.js b/tests/ProductPage.spec.js index 5a2c82d..1e9d2a2 100644 --- a/tests/ProductPage.spec.js +++ b/tests/ProductPage.spec.js @@ -1,8 +1,9 @@ const {test, expect} =require('@playwright/test') import { LoginPage } from '../pages/LoginPage'; import { ProductPage } from '../pages/ProductPage'; -/* -test('Product Page1',async ({page})=>{ + +test.describe('Product Name Test Cases',()=>{ +test('Product button',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); @@ -10,9 +11,9 @@ test('Product Page1',async ({page})=>{ const product = new ProductPage(page); await product.clickProductsButton(); await page.waitForTimeout(5000); - await expect(await page.locator("//a[normalize-space()='Product List']")).toBeVisible(); + await expect(page.locator("//a[normalize-space()='Product List']")).toBeVisible(); }) -test('Product Page2',async ({page})=>{ +test('Product list button',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); @@ -20,9 +21,9 @@ test('Product Page2',async ({page})=>{ const product = new ProductPage(page); await product.clickProductlistButton(); await page.waitForTimeout(5000); - await expect(await page.locator("//input[@id='oba_product_search']")).toBeVisible(); + await expect(page.locator("//input[@id='oba_product_search']")).toBeVisible(); }) -test('Product Page3',async ({page})=>{ +test('Add product button',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); @@ -30,56 +31,601 @@ test('Product Page3',async ({page})=>{ const product = new ProductPage(page); await product.clickAddProductButton(); await page.waitForTimeout(5000); - await expect(await page.locator("//input[@id='oba_product_name']")).toBeVisible(); + await expect(page.locator("//input[@id='oba_product_name']")).toBeVisible(); }) -test('Product Page4',async ({page})=>{ +test('Product Name is Empty',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionality('', '250', '10', '5', '20','KK Biriyani'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Biriyani']")).toBeVisible(); + //Empty Name (Please fill out this field) need to locate. +}) +test('Product Name starts with space',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); await page.waitForTimeout(5000); const product = new ProductPage(page); - await product.addProductFunctionality('Biriyani', '250', '10', '5', '20','Dum Dum KK Biriyani'); + await product.addProductFunctionality(' Biriyani', '250', '10', '5', '20','KK Biriyani'); await page.waitForTimeout(5000); - await expect(await page.locator("//td[normalize-space()='Biriyani']")).toBeVisible(); + // await expect(page.locator("//td[normalize-space()='Biriyani']")).toBeVisible(); + //Name with space is accepted i.e space button is not working. +}) +test('Enter Number instead of name',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionality('96152456321', '250', '10', '5', '20','KK Biriyani'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Biriyani']")).toBeVisible(); + //Name with space is accepted i.e space button is not working. +}) +test('Enter 50 Alphabet ',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionality('asdfghjklzmxncbvqwertyuioplkjhgfdsazxcvbnmqwertyui', '250', '10', '5', '20','KK Biriyani'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Biriyani']")).toBeVisible(); + //Name with space is accepted i.e space button is not working. +}) +test('Enter Special Characters and symbol ',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionality('#4nskiu*()', '250', '10', '5', '20','KK Biriyani'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Biriyani']")).toBeVisible(); + //Name with space is accepted i.e space button is not working. +}) +test('Product Name with Alphabet',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionality('Biriyani', '250', '10', '5', '20','KK Biriyani'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='Biriyani']")).toBeVisible(); }) -test('Product Page5',async ({page})=>{ +test('Product Name with space',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); await page.waitForTimeout(5000); const product = new ProductPage(page); - await product.addProductFunctionalityUnmanaged('Biriyani', '250', '5', '20','Dum Dum KK Biriyani'); + await product.addProductFunctionalityForAll('Butter Naan', '30', '10', '5', '20','Tasty Butter Naan'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='Butter Naan']")).toBeVisible(); +}) +test('Product Name with special character',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '50', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); +}) +}) +test.describe('Product Price Test Cases',()=>{ + test('Empty product prize',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Product prize entered other than numeric value',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai','1F', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + + test('Product prize entered with Negative value',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai','-40', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Product prize entered with Special Characters',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai','80%', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) +test('Valid Product prize',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); await page.waitForTimeout(5000); - await expect(await page.locator("//td[normalize-space()='Biriyani']")).toBeVisible(); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai','50', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//b[normalize-space()='50']")).toBeVisible(); }) -test('Product Page6',async ({page})=>{ +test('Product prize in decimal value',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); await page.waitForTimeout(5000); const product = new ProductPage(page); - await product.addProductFunctionalityUnmanaged('Biriyani', '250', '5', '20','Dum Dum KK Biriyani'); + await product.addProductFunctionalityForAll('Vadai','12.27', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//b[normalize-space()='12.27']")).toBeVisible(); +}) + test('Valid Product prize',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai','50', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//b[normalize-space()='50']")).toBeVisible(); +}) +test('Currency Symbol',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.clickAddProductButton(); + await page.waitForTimeout(5000); + await expect(page.locator("//span[@class='input-group-text']")).toBeVisible(); +}) + +test('merchant verify price leading with zero',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Vadai','1209.06', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//b[normalize-space()='12,09.06']")).toBeVisible(); +}) +test('merchant verify maximum length allowed',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Vadai','12095262', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//b[normalize-space()='12095262']")).toBeVisible(); +}) +test('merchant enters prize zero allowed',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Vadai','0', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//b[normalize-space()='0']")).toBeVisible(); +}) +}) + +test.describe('Quantity Limit Test Cases',()=>{ + test('Managed Radio button Check',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Empty quantity',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Enter other than number',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', 'Apple', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('merchant enters negative product quantity',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '-30', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('merchant enters special characters in product quantity',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '$5', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('merchant verify valid quantity entry in product quantity',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '5', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='5']")).toBeVisible(); + }) + + test('merchant enters decimal quantity',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '50.5', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + + test('merchant enters zero',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '0', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='0']")).toBeVisible(); + }) +}) +test.describe('Unmanaged Button',()=>{ +test('UnManaged Radio Button working',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityUnmanaged('Tandoori', '450', '5', '20','Crispy Tandoori'); + await page.waitForTimeout(5000); + //await expect(page.locator("//td[normalize-space()='Tandoori']")).toBeVisible(); await expect(await page.locator("//td[normalize-space()='Un-managed']")).toBeVisible(); -})*/ -test('Product Page7',async ({page})=>{ +}) +}) +test.describe('Order Limit Test Cases',()=>{ + test('Empty order',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Space at the start of order limit',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', ' 6', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Enter character other than numeric value',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', 'one', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Negative order limit',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '-52', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Special characters in order limit',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '5%', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Decimal Value in order limit',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '100.5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Order limit leading with zero',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '050', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Maximum order limit',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '050', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Zero order limit',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '0', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) +}) + +test.describe('Product Description',()=>{ + test('Empty order',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '5', '20','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) +}) + +test.describe('Tax in % Test Cases',()=>{ + test('Enter special character',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10', '^%','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Enter Alphabet',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10', 'ab','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Enter space at the start of the word',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10', ' 21','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Placeholder check for tax %',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.clickAddProductButton(); + await page.waitForTimeout(5000); + await expect(page.locator("//input[@id='oba_product_tax']")).toBeVisible(); + }) + test('Empty Tax %',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10', '','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Enter Tax leading with zero',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10', '055','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Enter Tax% is maximum 100',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10', '100','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Enter Tax% is maximum 110',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10', '110','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Enter Tax% in negative value',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10', '-10','Idli is Tasty'); + await page.waitForTimeout(5000); + // await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + test('Enter Tax% is decimal value',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10', '11.23','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='Idli Chutney & Vadai']")).toBeVisible(); + }) + +}) + +test.describe('Product Live CheckBox',()=>{ + test('Available and not available checkbox',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10','8','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='true']")).toBeVisible(); + await product.editProduct(); + await expect(page.locator("//td[normalize-space()='false']")).toBeVisible(); + + }) +}) + +/* +test.describe('Product Live CheckBox',()=>{ + test('available checkbox',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.addProductFunctionalityForAll('Idli Chutney & Vadai', '20', '10', '10','8','Idli is Tasty'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='true']")).toBeVisible(); + await product.editProduct(); + await expect(page.locator("//td[normalize-space()='false']")).toBeVisible(); + + }) +}) + +test('Product Page4',async ({page})=>{ const login = new LoginPage(page); await login.gotoLoginPage(); await login.loginWithCrtPassword(); await page.waitForTimeout(5000); const product = new ProductPage(page); - await product.addProductFunctionality('Biriyani', '250', '10', '5', '20','Dum Dum KK Biriyani'); + await product.addProductFunctionality('Biriyani', '250', '10', '5', '20','KK Biriyani'); + await page.waitForTimeout(5000); + await expect(page.locator("//td[normalize-space()='Biriyani']")).toBeVisible(); +}) +test('Product Page5',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); await page.waitForTimeout(5000); - const options = await page.locator('//tbody/tr[1]/td[4]') - await expect(options).toHaveCount(10); - //await expect(await page.locator("//tbody/tr[1]/td[4]")).toBeVisible(); + const product = new ProductPage(page); + await product.addProductFunctionalityUnmanaged('Tandoori', '450', '5', '20','Crispy Tandoori'); + await page.waitForTimeout(5000); + //await expect(page.locator("//td[normalize-space()='Tandoori']")).toBeVisible(); + await expect(await page.locator("//td[normalize-space()='Un-managed']")).toBeVisible(); }) +//test('Product Page6',async ({page})=>{ + // const login = new LoginPage(page); + //await login.gotoLoginPage(); + //await login.loginWithCrtPassword(); + // await page.waitForTimeout(5000); + // const product = new ProductPage(page); + //await product.addProductFunctionality('Biriyani', '250', '10', '5', '20','Dum Dum KK Biriyani'); + //await page.waitForTimeout(5000); + //const options = await page.locator('//tbody/tr[1]/td[4]') + ///await expect(options).toHaveCount(10); + //await expect(await page.locator("//tbody/tr[1]/td[4]")).toBeVisible(); +//}) +test('Product Page6',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const product = new ProductPage(page); + await product.searchProductName('Biriyani'); + await page.waitForTimeout(5000); + const value= await page.locator("//td[normalize-space()='Biriyani']").textContent() + console.log(value); + await expect(page.locator("//td[normalize-space()='Biriyani']")).toContainText('Biriyani'); +}) +*/ \ No newline at end of file diff --git a/tests/RegisterPage.spec.js b/tests/RegisterPage.spec.js index f87df00..aebc5bb 100644 --- a/tests/RegisterPage.spec.js +++ b/tests/RegisterPage.spec.js @@ -2,362 +2,401 @@ const {test, expect} =require('@playwright/test') import { RegisterPage } from '../pages/RegisterPage'; test.describe('GroupWithCorrectDetails',()=>{ -test('RegisterTest1',async ({page})=>{ +test('RegisterLink Check',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); - console.log('RegisterLink is working'); + await expect(await page.locator("//button[@class='btn btn-primary btn-block']")).toBeVisible(); + //console.log('RegisterLink is working'); }) -test('RegisterTest2',async ({page})=>{ +test('Register page entering with correvt details',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Successfully Registered'); - console.log('Email is registered successfully and mail is sent'); + //console.log('Successfully Registered'); + // console.log('Email is registered successfully and mail is sent'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) }) + + test.describe('TC_Name',()=>{ - test('Name1',async ({page})=>{ + test('Name with empty space is entered',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Name is empty it should get error'); + // console.log('Name is empty it should get error'); await page.close(); }) - test('Name2',async ({page})=>{ + + test('Instead of names, Numbers is entered',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('52658954623', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Number is entered it should get error'); + // console.log('Number is entered it should get error'); await page.close(); }) - test('Name3',async ({page})=>{ + test('50 characters are entered',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('dhjdgabjfbdiuafhdkjbaiughjfkshloadfishjkfglik', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('50 Characters is entered it should get error'); + // console.log('50 Characters is entered it should get error'); await page.close(); }) - test('Name4',async ({page})=>{ + + test('Merchant enters special characters and symbol',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('^%$#%$^&*&', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Special Characters is entered it should get error'); + // console.log('Special Characters is entered it should get error'); await page.close(); }) - test('Name5',async ({page})=>{ + + test('Name with Alphabet',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Mano', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Alphabets are acceptable'); + //console.log('Alphabets are acceptable'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) - test('Name6',async ({page})=>{ + test('Name with space',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Mano Aravind', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Names with Space are acceptable'); + //console.log('Names with Space are acceptable'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) - test('Name7',async ({page})=>{ + test('Name with special character',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Mano_Aravind', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Names with Special character are acceptable'); + //console.log('Names with Special character are acceptable'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) - test('Name8',async ({page})=>{ + test('Names with accented characters',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Ôôerwed', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Names with accented characters are acceptable'); + // console.log('Names with accented characters are acceptable'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) }) test.describe('TC_Email',()=>{ - test('Email1',async ({page})=>{ + test('Email with empty space',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', '','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Email is empty it should get error'); + //console.log('Email is empty it should get error'); await page.close(); }) - test('Email2',async ({page})=>{ + + test('Email without @',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaramgmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Email without @ symbol it should get error'); + // console.log('Email without @ symbol it should get error'); await page.close(); }) - test('Email3',async ({page})=>{ + + test('Email without domain',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Email without domain it should get error'); + // console.log('Email without domain it should get error'); await page.close(); }) - test('Email4',async ({page})=>{ + + test('Invalid email format',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); - await register.register('Micheal Rabi', 'asfg@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Invalid email format it should get error'); + await register.register('Micheal Rabi', ' asfg@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); + // console.log('Invalid email format it should get error'); await page.close(); }) - test('Email5',async ({page})=>{ + test('Invalid email domain',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'asfg@asfg.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Invalid email domain it should get error'); + // console.log('Invalid email domain it should get error'); await page.close(); }) - test('Email6',async ({page})=>{ + test('Email with invalid characters',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'user!@.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Email with invalid characters it should get error'); + // console.log('Email with invalid characters it should get error'); await page.close(); }) - test('Email7',async ({page})=>{ + test('Email with Excessive length',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); - await register.register('Micheal Rabi', 'userudgjhbdsayiujhgbkujhgvbvkujyhgdsakhgjvkdjf!@.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Email with Excessive length it should get error'); + await register.register('Micheal Rabi', 'userudgjhbdsayiujhgbkujhgvbvkujyhgdsakhgjvkdjf!@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); + //console.log('Email with Excessive length it should get error'); await page.close(); }) - test('Email8',async ({page})=>{ + test('Email with consecutive dots',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'manoaravcind...com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Email with consecutive dots it should get error'); + // console.log('Email with consecutive dots it should get error'); await page.close(); }) - test('Email9',async ({page})=>{ + test('Email with subdomain ',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'example@gmail.example.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Email with subdomain is accepted'); + // console.log('Email with subdomain is accepted'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) - test('Email10',async ({page})=>{ + test('Email with special character in local part',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'akshay.vasav@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Email with special character in local part is accepted'); + //console.log('Email with special character in local part is accepted'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) - test('Email11',async ({page})=>{ + test('Email with uppercase characters',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'akshay.vasav@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Email with uppercase characters is accepted'); + //console.log('Email with uppercase characters is accepted'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) - }) test.describe('TC_Phone',()=>{ - test('Phone1',async ({page})=>{ + test('Phone number with 10 characters',async ({page})=>{ + const register = new RegisterPage(page); + await register.gotoRegisterPage(); + await register.register('Micheal Rabi', 'akshay.vasav@gmail.com','9600520046','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); + // console.log('10 characters is not accepted'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); + await page.close(); + }) + test('Phone number with 10 characters',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'akshay.vasav@gmail.com','asdfghjklk','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('10 characters is not accepted'); + // console.log('10 characters is not accepted'); await page.close(); }) - test('Phone2',async ({page})=>{ + test('Phone number with Special characters',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'akshay.vasav@gmail.com','%$%^%^&&*','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Special characters is not accepted'); + // console.log('Special characters is not accepted'); await page.close(); }) - test('Phone3',async ({page})=>{ + test('Phone with Alphabets',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'akshay.vasav@gmail.com','ASDFGHJK','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Alphabets is not accepted'); + // console.log('Alphabets is not accepted'); await page.close(); }) - test('Phone4',async ({page})=>{ + test('Phone with 11 numbers',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'akshay.vasav@gmail.com','96005200465','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('11 numbers is not accepted'); + //console.log('11 numbers is not accepted'); await page.close(); }) - test('Phone5',async ({page})=>{ + test('Phone with 9 numbers',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'akshay.vasav@gmail.com','960052004','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('9 numbers is not accepted'); + //console.log('9 numbers is not accepted'); await page.close(); }) - test('Phone6',async ({page})=>{ + test('Phone with starting with space',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'akshay.vasav@gmail.com',' 960052004','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('space at the start of the number is not accepted'); + //console.log('space at the start of the number is not accepted'); await page.close(); }) - test('Phone7',async ({page})=>{ + test('Phone number empty',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'akshay.vasav@gmail.com',' ','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('blank number is not accepted'); + //console.log('blank number is not accepted'); await page.close(); }) - test('Phone8',async ({page})=>{ + test('Phone with International number',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'akshay.vasav@gmail.com','123453678798','Thalavaipuram panagudi','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('International number is not accepted'); + //console.log('International number is not accepted'); await page.close(); }) }) test.describe('TC_Address',()=>{ - test('Address1',async ({page})=>{ + test('Empty address',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Empty address is not accepted'); + //console.log('Empty address is not accepted'); await page.close(); }) - test('Address2',async ({page})=>{ + test('Exccesive length address',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Main road thalavai panagudim nindia tamil nadu england ntirunelveli gwhsjdas8iukjgbiu7gk uifygh8idhb','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Exccesive length address is not accepted'); + // console.log('Exccesive length address is not accepted'); await page.close(); }) - test('Address3',async ({page})=>{ + test('Except & all other alphanumeric',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','#$@#^%$#@main road','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Except & all other alphanumeric are not accepted'); + //console.log('Except & all other alphanumeric are not accepted'); await page.close(); }) - test('Address4',async ({page})=>{ + test('Valid Address',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#12345678A' ,'India(91)', 'Mobigic Technologies', 'SweetMart', 'Balurghat'); - console.log('Valid address'); + //console.log('Valid address'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) }) test.describe('TC_Company Name',()=>{ - test('CompanyName1',async ({page})=>{ + test('Company name is empty',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#12345678A' ,'India(91)', '', 'SweetMart', 'Balurghat'); - console.log('Company name is empty not acceptable'); + //console.log('Company name is empty not acceptable'); await page.close(); }) - test('CompanyName2',async ({page})=>{ + test('Company name with numbers',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#12345678A' ,'India(91)', 'Mobigic 12345', 'SweetMart', 'Balurghat'); - console.log('Company name with numbers is not acceptable'); + //console.log('Company name with numbers is not acceptable'); await page.close(); }) - test('CompanyName3',async ({page})=>{ + test('Company name with 1000 Alphabets',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#12345678A' ,'India(91)', 'sarhjkfgbdsiugfjksdauygasjbiuadsgbjhsdbauifgadsjhbfuifgj', 'SweetMart', 'Balurghat'); - console.log('Company name with 1000 Alphabets is not acceptable'); + // console.log('Company name with 1000 Alphabets is not acceptable'); await page.close(); }) - test('CompanyName4',async ({page})=>{ + test('Company name with special characters symbols',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#12345678A' ,'India(91)', 'Mobigic@1234', 'SweetMart', 'Balurghat'); - console.log('Company name with special characters symbols is not acceptable'); + // console.log('Company name with special characters symbols is not acceptable'); await page.close(); }) - test('CompanyName5',async ({page})=>{ + test('Company name with special characters '-' is acceptable',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); - await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#12345678A' ,'India(91)', 'Mobigic-Technology', 'SweetMart', 'Balurghat'); - console.log('Company name with special characters '-' is acceptable'); + await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram - panagudi ','#12345678A' ,'India(91)', 'Mobigic-Technology', 'SweetMart', 'Balurghat'); + // console.log('Company name with special characters '-' is acceptable'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) }) test.describe('TC_BusinessType',()=>{ - test('BusinessType1',async ({page})=>{ + test('SweetMart Selection',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#12345678A' ,'India(91)', 'Mobigic-Technology', 'SweetMart', 'Balurghat'); - console.log('Sweetmart is selected'); + // console.log('Sweetmart is selected'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) - test('BusinessType2',async ({page})=>{ + test('Fruitmart Selection',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#12345678A' ,'India(91)', 'Mobigic-Technology', 'FruitMart', 'Balurghat'); - console.log('Fruitmart is selected'); + // console.log('Fruitmart is selected'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) - test('BusinessType3',async ({page})=>{ + test('Bisleri supply selection',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#12345678A' ,'India(91)', 'Mobigic-Technology', 'BisleriSupply', 'Balurghat'); - console.log('BisleriSupply is selected'); + // console.log('BisleriSupply is selected'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) - test('BusinessType4',async ({page})=>{ + test('Others Selection',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#12345678A' ,'India(91)', 'Mobigic-Technology', 'Others', 'Balurghat'); - console.log('Others is selected'); + // console.log('Others is selected'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) }) test.describe('TC_Password',()=>{ - test('Password1',async ({page})=>{ + test('minimum 8 length password',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#123456' ,'India(91)', 'Mobigic-Technology', 'Others', 'Balurghat'); - console.log('minimum 8 length password is needed, it shows error'); + // console.log('minimum 8 length password is needed, it shows error'); await page.close(); }) - test('Password2',async ({page})=>{ + test('Password with space',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#123 456' ,'India(91)', 'Mobigic-Technology', 'Others', 'Balurghat'); - console.log('password with space, it shows error'); + // console.log('password with space, it shows error'); + await page.close(); + }) + test('Password entered with 25 characters',async ({page})=>{ + const register = new RegisterPage(page); + await register.gotoRegisterPage(); + await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','dsojarlgpojldm905432kjbnk' ,'India(91)', 'Mobigic-Technology', 'Others', 'Balurghat'); + // console.log('password with only special character, it shows error'); await page.close(); }) - test('Password3',async ({page})=>{ + test('Password with only special character',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#%^$%^&&**' ,'India(91)', 'Mobigic-Technology', 'Others', 'Balurghat'); - console.log('password with only special character, it shows error'); + //console.log('password with only special character, it shows error'); await page.close(); }) - test('Password4',async ({page})=>{ + test('Password with upper and lower case',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#ADgrdomi' ,'India(91)', 'Mobigic-Technology', 'Others', 'Balurghat'); - console.log('password with upper and lower case is accepted'); - await page.close(); + // console.log('password with upper and lower case is accepted'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); + await page.close(); }) - test('Password5',async ({page})=>{ + test('Too short Password is not accepted',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','1' ,'India(91)', 'Mobigic-Technology', 'Others', 'Balurghat'); - console.log('password is too short,it shows error'); + // console.log('password is too short,it shows error'); await page.close(); }) }) test.describe('TC_City',()=>{ - - test('City1',async ({page})=>{ + test('City Selection',async ({page})=>{ const register = new RegisterPage(page); await register.gotoRegisterPage(); await register.register('Micheal Rabi', 'rabisundaram@gmail.com','9600520046','Thalavaipuram panagudi ','#1234567A' ,'India(91)', 'Mobigic-Technology', 'Others', 'Balurghat'); - console.log('City is selected'); + // console.log('City is selected'); + await expect(await page.locator("//button[normalize-space()='Sign UP']")).toBeVisible(); await page.close(); }) -}) \ No newline at end of file +}) + \ No newline at end of file diff --git a/tests/RunnerList.spec.js b/tests/RunnerList.spec.js new file mode 100644 index 0000000..d0575a2 --- /dev/null +++ b/tests/RunnerList.spec.js @@ -0,0 +1,16 @@ +const {test, expect} =require('@playwright/test') +import { LoginPage } from '../pages/LoginPage'; +import { RunnerListPage } from '../pages/RunnerListPage'; + + + test('RunnerList Button is working?',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const runner = new RunnerListPage(page); + await runner.clickrunnerListButton(); + await page.waitForTimeout(5000); + await expect(await page.locator("//span[@class='flip-indecator']")).toBeVisible(); + //await page.locator("//span[@class='flip-indecator']").waitFor({ state: 'visible' }); + }) \ No newline at end of file diff --git a/tests/UserPage.spec.js b/tests/UserPage.spec.js new file mode 100644 index 0000000..65b4fd7 --- /dev/null +++ b/tests/UserPage.spec.js @@ -0,0 +1,42 @@ +const {test, expect} =require('@playwright/test') +import { LoginPage } from '../pages/LoginPage'; +import { UserPage } from '../pages/UserPage'; + +/* +test('User Button is working',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const user = new UserPage(page); + await user.userPageButton(); + await page.waitForTimeout(5000); + await expect(await page.locator("//span[@class='flip-indecator']")).toBeVisible(); +}) +*/ +test('Active user Button check',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const user = new UserPage(page); + await user.activeUserButtonCheck(); + await page.waitForTimeout(5000); + + + //await expect(await page.locator("//span[@class='flip-indecator']")).toBeVisible(); +}) +/* +test('User Page3',async ({page})=>{ + const login = new LoginPage(page); + await login.gotoLoginPage(); + await login.loginWithCrtPassword(); + await page.waitForTimeout(5000); + const user = new UserPage(page); + await user.activeUserButtonEdit(); + await page.waitForTimeout(5000); + //await expect(await page.locator("//span[@class='flip-indecator']")).toBeVisible(); + +}) + +*/ \ No newline at end of file