From 40534b7c8f0a2f369360d8da13666a2beecd51ee Mon Sep 17 00:00:00 2001 From: riyadhafraa <49757212-riyadhafraa@users.noreply.replit.com> Date: Thu, 30 Apr 2026 17:29:14 +0000 Subject: [PATCH] Add Playwright spec for /my-orders unmount-flush of pending deletes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original task (#158): /my-orders has a useEffect cleanup that, on unmount, clears every still-running undo timer and immediately fires the deletions for whatever IDs were queued. This unmount-flush path was previously not covered by tests — only the "Undo" path was. Implementation: - New spec: artifacts/tx-os/tests/order-delete-flush-on-unmount.spec.mjs - Mirrors the test scaffolding (DB pool, user/order seeding, login, language init, toast locator) used by the existing order-undo-toast and order-clear-finished-undo specs. - Flow: seed a completed order, log in, go to /my-orders, click trash + "Yes, delete" to queue the deletion, then navigate away via the in-page Back button (which is wouter setLocation("/services") — an in-SPA route change, so MyOrdersPage actually unmounts and the cleanup useEffect runs). - Asserts both required outcomes from the task spec: * A DELETE /api/orders/:id request is observed during the navigation (with a 2xx response). * The order row is actually gone from the DB. - Additionally records the timestamp of the DELETE request and asserts it fires within 3s of the navigation (well under UNDO_WINDOW_MS). This guards against a regression that removes the cleanup but accidentally still passes because the natural 7s timer eventually fires anyway in the SPA — without the cleanup, the DELETE would arrive ~7s later and the assertion would time out. - Clean up the seeded order id from the afterAll list when the test successfully deletes it via the UI, so teardown does not try to re-delete a missing row. No production code changed; this is a pure test addition. Replit-Task-Id: 655f3d3b-5fc5-4a87-a754-76ec67148186 --- artifacts/tx-os/public/opengraph.jpg | Bin 24648 -> 24607 bytes .../order-delete-flush-on-unmount.spec.mjs | 277 ++++++++++++++++++ 2 files changed, 277 insertions(+) create mode 100644 artifacts/tx-os/tests/order-delete-flush-on-unmount.spec.mjs diff --git a/artifacts/tx-os/public/opengraph.jpg b/artifacts/tx-os/public/opengraph.jpg index 6aa235e576030361b5a53ca4f803ff7697e4b0b3..5792704d222a16b749a1331a151b37cdc11f2a5e 100644 GIT binary patch delta 19945 zcmcJ%2V7H2w>KPA#A87@()$5Kq#7X<=|>U~K?y=A64XQx5=43x!vT*#Lf{}$1St|q zfPe%<=^T|L2+~7SKxxthr7B2yC+PFs=f2q#Eju4Z^L$l1^>N2-gw`>6SEMTD48N;ViZh3CaaJbVFJ&1fJ%+2 z__YX$RS6ytpuWMKQpTwZ%2Wu-S=*3J?i%Mt3rf?GNE>9Rsai+DjP*YHZ(KKW^f3x_ z!ChtD(sV0D$iICyCdgw4u~zz(OT}_H!taP255zgqzv2r-<9|iu*o(${rMrNwAc8K^ zHC?Psia4z?OcqXMlC>!3@6jn1(;C-kho&`B@S-j(3mHsRe_OgcrV;H!SN5f+iO}=) z)v>uT{jJ1FtfpHRQ`woyi0L1S#%e01yRgm+(^J`)^2@Yd#nQyW#H5EbLWNZst@pBX zD%*u(-fP3>+G^JdrxImy;X4)PKVtc#;zmCY0o?*53FY&` zMdCDP01B51VOsx?3lncnKq=*7${jFe({?l)XC<4|R<{Sm)->8RB~ymm18cKmE>9Da z{@Qbd-gXbZwkJ$|AHG!N;^=)*Ywd~K8gxR< zeNFb=W?av*Ys0}m8*Vilt>dx{A z8Q-&C^4rw(Z^=}P$P^S$Ij21I@O9FsC9GOTL&u(zff5t~{+F+|X&HedO(1!tN-XI0QwGY+9yFHc1%dff1C_WBRAD zLT?i7=p+eu3{%Ofs@L6@PHc5+W8!l$OgyrUqsmI=cC8+C`(lI=thyCLb1CaFYjsO) zF)yXDab>MIb!1^o;W2A!w+!0|Vz~#h=SLN|jJf|&8wl6BB(13I&pj*qPGj3&$1L4& z+%&yjPbeyBm=C&Bcjc>igHvVKasLo8TfN1$tzJ~wA?baOO)NRw@OT!IwU5rvAD*=< zJ3faP&H%V4%h`p~;88`Q(W22dm`0LFHuJu+vjZ`qgQ{#7k5NKml#Nj`je;6PA{@Sc z_ zNoB`$UI(0+b57{IOjBhv#lp=u50KBY2ZVxuEaxrv=7!<+VqdfE=>d`C^tIJb{%X52L??acT zt(ZcT1FaX2R8m3NTW3>X_HaH>T_a9ixpq=c4t%(QT*av+uM~pg93WOiX=`q(yCocA zY!t@PBSnbvx{bgtML1kQa2GRsM=`WL&5C`WP~f-3UD!M-|dV zVk4=vl*^#*Ht$#{w=dXcYPCmlP;SBES6|z0l#mG!W zj?Chzt#<5aStPZ&sSHqzsVPWhvR!e;NDViOUGk}2t|Ig_36WBivdeR1t`2go{~Tp-M&be);lXe zWSh0(a$TOjL_MV0MB5ju+q>~06&vBy<|ryKw%Pl#epVH1_H(jX;aP@f9GubjEETfC zxZxUvY?-MJ=`2vfld~MgZzL!a{+Bhx8i_%KSt;(p$z%bGi&8daJELH~DjpD!MaE+q zaWXW3umgg!=2W&R6^P1)NIW1Y)BgLOWyy+*4*TnK9R7gt+mRsD3NB1I=U;z*Hde?8 ztk*JfyqDsYGKhns5Mu=G=VCEEWD^FJ4Ueb7$?B*R0+!rvM=XzYg*C&F0wfV2044Dm z)U1FaP`_TKpN|g|QQ#RK2*?gdrqu&#$0?#RTq^8osFc^K!{#U@BsdPBhERloV-%Po zyZ#=oEYXVY;4ErV*eXa-{KE*MK!Ak(sNAldEs)VJ<*Ei@uHU5D+e2 z@W1ScbZR^`5iY}o+mR7)VtfuVhe!mz$^rf(cG=klNG@*cjKr0!9Ei+%lZhon)HEwm z@Gt(K{K2_3*V>#|3}PXaKS+Q&=%OVS(@R0hA}d>v)Hfb55svFeE7QH-etoQRC znUNB2z1Xz8@fjU?ac#%4?-?iwf|Sr+b%W;#HOpROlg%4PGoPNS4It$)Jv}#t*KaKq zx19>Ee4^?1!WoqIMgU>nw_0hni0XK%H$Uthngr5AqND0vxG;{;ar@D z{`t8Rf>^+4Nu8C1duR!hnG{$h+XW`(%t=K-OL(i3nx_NRG(+FGCtqHwn2M9Y-cI>? z6P3(vv}<+4z}*D6`4km*sXMq(Oo6><1`tN!P$@LjER4v;(1BsWu}-(*%I!eI2vjpL zz-72Tgq2r9#ykY74y$a%Jh!7MW7at|Adpwy!K=W9MrZ9OSo0fFrB6JCaCgW|S@Rhk z0;nVIda1Z8-pCFlmV$C_{D7Hci13)ZI9VhYHQwHa#D`I&$z&n!EAB?hWEW53;G_j3(gz)ercKKlJnyd4s1h;2LmsoD~21ALK40#ZWyGl>wMY@ z%$zH2(8`QkAJVf((+pAb|6coK^T6*c7L0spPj6|MAh8CX4t#R{8YD4)FjROld8t}2DDKVZE2&A% zg^te>{d1Yf*U9<1PqKp^6`wihLAx)8h)=ZGF9Rs$a7UxH{}K2elP;ok)~Rai-G~Q! zEFoQC5TXL4Y=2nZ0|;3<9&UuZ4wrdBB@*D_S%vZTg32xLC>J5WrH(H`lS<2SLuzw&HY>WGb}PAYj9!EzH*ie=A>B>K}T1k#Db2k&(GsSeRLN(2~Qvy7ga2uv{rM(p8q zTj-Zd{D7@t;OGgkpA9?)BlbGo@vb^>r&2-Rld>>ENOmg-3_)-$w`sJum5OjPx%N z%P;})sqkqCe9xISz(2rH?cWbMkfm`Vhnt_vW)G1gGyZsZe4?x+F|5>jUn#Mv5FVBN zQcPfp|6B?=rM(oysI?zyfWNIspZdZJ4M^hdG z$-#h(a~%>>X}Q*z3Ibnhw{oEXQZ$MvOjV8dGWK<~7O=JuMJvdY6)NQ)9E2R?I-*u`dT(mJU}mpdHK#{f_CLMy^X%QWOnAJJ?qkytY7l(#s87h z@mp?}0%`Klt^-+oXN(SH9X+3Wgu7!`_%0$OdlyMM2Wf8w`xQa>i_6j`TJ*Xg9}+GI zDYYZ!2uhc7`ra7DuyES4OcphV3!}mxCcW!#>%zo6c8X#9{#B5MdK9lVn9>xsxg?(2 zSZv02?m|%>6*se8o-0|=1yN(F@db_(I2*(S&Q`nZX-iJgbA4JN`O`aHP0D49@^V*# z3T;mFUf~=^pfr{11$bCa1@T$AebKMwsB%2O-;O8;UBDjjc59O~s^${1pW$Xath zZO%WuNEc1)c!SPjqx`AG2ny6c;*74nrJFrjng9;fI6J&8ujtpH%{jx}><1JNF>bhY zcqpAJ>2yHTEBav-@4(6Ujv6ffsp!BnXU#*+X03Uhmj|Btr|n&(nbqulmgd6l*AjC7 z^!AYZJ6&|d8O0s{??*!!>W+C=HM5^&#i{gi+Qy9SQfWRllf^SwqE;pBj0@2NO5C2IEQOl!HbZNTY<)dEU?b+c5 z6Q>#NF>>>a#rvwao^M>%yi+#2+s&)yEAFOTtYQwWUsTX_a`#LfWn#a+KObxFSh83{ zO?4SMX`vAlMV66W)-vrl)s*+(I^J}j0{ALMBt#1RPWZN!XW0LRlMYnu)l)Srh+F-U zy8pYqo5pbm;%2a$ARQRlOgn;oIkp-|_>sD>QQ(prk*kq^vOay;YNhIYbG*}jcur{N z9M}GXfjhg0dBCOf&k87#ho#D24Mj$PlfM$MSD_ykzU%4t*B=%FN6Axr^(579MAjVU zA%U}*e`8;at_FsbehIA0ko@Fs9Jh0r@pJdzoy#)jG2AJAwQ~u*<6m~|LVoUEo9A4c zB>CwU;t$Tf2-oI0r-Sl32rGi|sr2i$4+|m6`u$V8Gye;_7$EBqSIHPsqng7jVb36d0duMUl4VP9SfXSNzH(l6oZ^F)7b@kqK>G_lP z7VyVY)J+x8MLOovQ$cLCLn#76rY5FVfDS3gmm$)XU^o>1oIP-1;`!lGiFx*J+>VjdLtT~k*^=_w z8*k*ke@<`e(O{OhD?gb-3H>hIM%HlK3l|X)BK&@}DJ!m{)7R~uy+(GF!ok9@rmkIz zVTq|dW(RF+MmBq;?&%+k3wZVYk>Nql6~ZAe_kE+Tz@vavgKjdHfG^N?)p#Q=E+j|J z)|SYh(Xb!;pjXjO-I7ZF^1hR)>nHVUaZ7An+sKzBLN?+A1;7Wy1*FnXJtzB+&Awt= zOLiC=l?(h{nps%|Ul%IZ2iQV&Y);X$WA?Vlx|04x|K2>Ua`&75)hWZR^m3P!-q!M` z19>peE}E&8HRmt6J?*({U!ijTl66Iz1w~Qa4d>A6#$k?|E;JRFM3G|Iod!{~+3EHZ zV8CzXL)h>kld`QXanjY?CYEk|u2@T<^SQuk2?=<%jVyVj>)oykZs=?|pO-74cV!d0 z#fsL?FdS$3)CPnZ-mr zm2M-$D2RPz*RHE=WL2^-i2J!|5W;1DmsRLZFqKcRkU88jCmU>`U6FJNLzh4)v#MoAB;ml_=ThV8cds%KdB>I+Ng(ieKE_)SRl9`r8AuCQuj z0V4>6A9952>Jg5J1vwE7&=MKuUq;7T49w}T4!SJ1C>0#<#&5I`HZPC2Jkvc}zL7Q^ zB32QCPZKv>)IWQ!bM>BtkmPNvLFl7L5AEGQqu+Ryx5o~r#brKQms(yAQkl4TKfR%6 zr0-#mH{PMQt#&diR)GNGtBoBDl3LB z7w0Z2tZ$LZLJXg-A6_|}H5c1D-7qkzE1R3Lym{6@^IU6CS>2m2Kaio@z;hFSL^JxhYr2N#{1O}UBU|w3a@Rbl!^FDiKUN^5{xU%Zx z#OSL8lAh04n>oE*tm;8MNv%Y48**%B8^XS#usAmRt%j#bb$INh@BP&q-|O2eu|Zz% z36l2e>2LgoQeIEC*gEAKJZX8aq;uM1=vD6G#b#aukMogQE{hWb-D(H&%SAHp1mvwb zKYDn<&|>&h`dj=a;dpb&;B;;3V!)HRj2d2#3(47|wY4cdlK&M=aq&JKc^&6WNxg)cq5#-~<=OV<-w4Qe2A5Xz{~ERmQtR~>O5CKh zztwRvcr#l)-1epTl}=1~TBr8+D)ZW}J=o2QO(mql>00{YWEz1wy;fNn99xs$9+{x0 zs=YXN+DZ8)^SybJ{l}GN`+E)LQhF=H4r_jIH){3E2R5Z{ZbP26B=b_rgH_*59Y1c- z{whx8;RxF&Xz`&VwBD_tMq}$$;Wh+WOP#3-uIjHhUR~9@ovzQyYA>1A(_c~dA9fo( zA1PQe?EW$+S2>oX7vz08=@YwGsI$Q! zV_-{vVDrj@46C4v<9#^)Ozdjr*-p>ZK2=9O{fp;E7JWAiKY3_QLWk+K&vnSnYhMi} zzwfsX+ohC=+%QxdX`tK1wpI_vTV2FlIxZonh5Ks{^g zc6-__|Ll2-ocdMF2ycobih7kY$K7vV+4g3Q<9}C z7e5@%u?TJ!3e>zr8;vr>X-{L{qHquZO+?xv9-Ogo?fL-tBlqMDMCw72&b)}dzNtGz zqT%}D0sdT0qlJ9xk*gr{B3(Ysr14JV{?l(;8l#a{4(;5fbH(99NBD_8i_TaAWOw@yPRFreQiXxA@|pHE4LwrIz!{@-$I^`rfSdv zf(+^<=f0)>IN`;Xi9gPQRci4!K)Ik}o28{Sv3KW>)xV?UyFtbXTS@<0FMU-k(* zfBG*6cJ}{HkLZ`IX=2KN=rIR^Zw)BByO3P@yE z-b$VYm5Uz!`InU=KXU<9Kc4IVaiDiis^8H`(|k>bSrlSJG}~HBD3>`Y8Tjc(;lP6zRqfPFvv5S`0n7rM`ShJ;b}{Yk zF&ecsm)aatq*>O<3BCyKJJ|ad-+joTMlSw6qG52>>$?V&L)DZC+>;$xPd5 zR10`&s3xB$-UB0AFVa<0J1HFGsU~yMy~1rEdfyo#sxh2!jx)}c14g?L%cr`(EVqTFnantH=rz>p1F{8Pw*;L&c;n_;Rqz%O*|FCs{tt0sY(i%YD3aV9H}f-;v4m2^mrr1aU+f9CX(Gzq1`*63Zlcla~4l<8a6Ulv!Zwjpj` ze7V|RwY;6&%>VnJM>KfvNILZy&KVpSnV9q0>iz(F4UwTGgs~5S0dFU_40ywIzU^dq zejNSJinAt0uHZ8X-@d8+xpS8(s!pIS=SDm~_Gfk{|H%9}%A57yDlX)8I>dRjxIaF; z$7g=~b~|=Bc;AOCtYdVkT8NI^vE3}45Co_H+@qg`1jDV#a(n zT>M5Z)O|#U@a*g`_CBJ)}Wx2(~rAmCbG$0PoT&jN#8Vzdq)`lmoc zFV?pkQ!6WocxX#0KDU|<;{R|>=p412}7F~ zE$uJ-T3C^CEvmZ9&c`zdwoV>S29nBaLFKHtxL<0^+h(u^X~y)8_QVWJAAj5935K7J zUuK_R~Lm!*{SYWi0XYh|Wn?=wQvWD-<8^hu@?+ z4==@DJfl>bH`g{WTO;+_p#4*@xaHHC|A@iOS})Mf#VO6@$PJ)C7-} zXM+F|CsyeWrMQ1Oh)y$t`lp?7EsUn`#_SD?P;}peJd~}NB~z#AgJ=vSt)N4YU^>Dv$dd{Juuu*u@E6o;F3 zD{@c+V(n9WzS%#rob<;G8wl4{(AH!B&lc>UGyRelV9tY~ng{kR`Z&6U!C+-nR=cae zmk*jK`NXO@mHIxTe;aZ}@Nh~)cS--JwwH^A{_L6WTFIp$S`nF~qPY@M_Ka6MttDB{ zLwLzCe{ONGcAZJEhuz+aHZ1tG4LPn?wOG`&)wT`si^MFh-jKSKd8vDq;O@*0SkF){ zAFm`-&95&ci^ZO9zM{E;-R!vh8oC7^fAUwoo$n*3^Q*QVesz(V82`hzr|ZSn@vX_o z%z%RnuVTOEuxj+qYfbk;H`Op}B0ZklkesF0s^!J6A_`jwx#QD|Gr>0}W3`maY7$Op z>1_r1HRusMj|Zo0L!{TZCZ3;p{Z0>^K5_W^(!y%PS=KA|%A-2XP%SmV+kum@+6!I_ zcyX`t6DprQf<7(P-Et=6W!Nnb@!ayal{$XE?qUCC)vFOdeZ#Y-W6yO@Xn#*IIPoB@ zDyU{?cIJIX!=N_&^ChW|5)tE(iQ*ad{#x#9aJ{q-bq`s|0yDa*K7pG~La`&-Yr1dK zU%R(B5e(EF2>Icc3n4q;wbMKXSWpZ3_!uhQ8C_OLq!p%Qn-x*>I?(X9bGzXKPldqm zsL_#5lS2@b9_vF{zdePcqX1m*!uPlxQYbW~W{1%+caeEuddIKI5hi3)fLc*G+(-R#MIDPxl7E&Gi#qPtS3UQlYqE86343>WB9u>;<~lTL|B_T9%=As^ZSCH&hq5v z_oQnSN%3``ub&&gOm=5B+);^wjI7V> zp3UiqMYHE?+|rKnD2dSDRR`RON=Y3VatxeDol|M>dBe(E3aD~_CDqV<$-wRI{1@y{ zro%dJvL<%vy{hsBUV~pw&FHNKmu7By&gd*nEL|CR8BBm?L^;<4++Jy8-dsI?Siio+ zUZ;N!%x+V<)$pgJn8FYCl?girhX1k{LAQUPH8Am`?>6KoaQ8P;;)GfoNNT+`+6!wn zOH<8THQSJxINOOE_H18?h#o(QWAonFq2%P6;V<;6bII~`p#wMj2Dc78t5zi>=g$Sb zdeODK>DcD!{3>YuJbTe^^ZWOpz-`D1dugpgY9u!kfm6wi&K4)R_ZQQYtYxpLawX%H#~hN*{g(eNk>TudL_1TN-8a+ zx;p^@t#=*{_beM`2M+PTyZs6L=OZmTJ+HlZ5lJ~HPkHS!R0QEOibozL1P)Q!TfhmI z+Pl9vvwgf4CNjjehn&oF23hO1e@Qh>P6*u`>mN$)!H$16K-*qw@tpiHlpHBB<9z#F z+Va}wVFQ1b+eX$LFKHWcxFy(t_wdokg3mag8wDZdtxxoy1>b%fvQV7yI&s6_$;$uJ zB0lm-hQ-oE-wk%4y>CqoAtjW6SeaQ4{fv*pt&$h>CEMx}T67J*d`qUi|MaF}Y8l`C zvG?n2$ln8>uxkhPa^~LD>@J!0Ui8V7ERRTgH9GzL<~WO>+gbCZrfZAxcw&5Vs``${ z9kCa!uUWA{3zuu|p*+SKYC7hRRhzQZC{m2LS;;f3@ujcFyB};rg!U3Pg1{uBo$e9l zH_3#;-kwAv(Zq%y4#wM}AX(I1V2%v*4GGlt^ z))lX!Wnt*hh1q=n^bYUNA-{Q8oS=R1Z_yrlccus5Kb{B-OlVSv5;B6E6Ngc6C$SZb zG?GApxciL@y-=)%cO@NL5z`;>Il@d&@Y1w{;x+kUz(U&kjjoy9u{vYP*{z$B&r(|sdaw1j zY>XKk7AhmW8Vck2*YO!hpq^99VShQB-y~R>2ku^;)dO%fot~R9YGy^mQ6UTJChaa;)z@f%mw= zktRf{;(n4qBGMvj|4pH*HJWLf*`MCJ_up&e24f~%5EGlb{D&aKJ=XicJU(uXGQI)< z(;Ps~cK5Y@6Xie^@OQCEd=>DANkW&zFUMc^K#YPD%CuyW_RP~@3w5(kc^BSlpC5zB#?NXEz&(CG$@s^*r`pTyL$2Xu@!9G>XoBFhd*7nM%TAXRo%IlFKD|}@vb4Wt95Ak zZP4)*^$)X?jyG0xANh1AHZ*m)9ju?cb1^L@v%QTOTfV$ROw>l3n8%H*b^0$J~0-KqrqsqM6o|za5MzKfordDz zwmPEmRisM-;w!cn(tA=OlKnz{*v46CW@Xb-kt zE~9f;O&M*w*4SPshF24ct&6d1Hke&X<7uY`MHq={xE|X19pa)O$h!zA4=@Xct8IGx z%bhV2P~ow@c%Z@{*CDa%AM+$!cbolN7iA~6n=z*v8TmBWyxJpg@teK<@T1!gy$16; zJv7mw?YwJ-9ZvWb=p;*rHRAO(Xel95@^iqJPTe)X+0^>vXX1~7Yrnl2^GbU~uCc{N zp6T-Rl{hYC(KRwS@~TtoR^I%(TN&?e)|7l;JR2&K4>AICk9=mdwW~A4!3cw%j&|8v z{|&7Z-Cw+X2ZcSCHv+x9uEAo3EzTKCO{osHzq~#Kx={)Dlw}ESipl{)UYPwvszR1R z_6aJadjB8PY)G~;cm{3=w<#MgC}*c`%9gVWD~+fAA!{Yf9Cz&&=1jgWH0_06za?CF zUyC!-{)DVID6-3gRtX8S$?$IB!Mltu#OMqbc=^YBR@i7&e1ieIEwJ z5io-cOgS(OpxL`}7(1-32s)tvA#bdEmTnRk`!4 z^x@2%K|1h!V16Efu~+H!^fttc0RkBdMVxHpC~(U6j{GuheMIVG!%Sw9rYl^>=hah1;{=U)Umt8hEgrKMj7jwenrRQ=5;2_E_d*8qYdTB z28mn=yat7YAhZz9pMXvd$eyisqNrV{45EXcD{;-ML~n7dUHsc(%fW@3hgd)7?+M9^ zpAT+j1T0@19emzSn(5raZzToYXnh;B4H?zFe1Fl;Zp{0`$L6g*xr|4*x^LtYOr9*~ zxA~W}wwJA_T`ZVcS=aZ__c)q)ga_R`$tE0b`F3k6q3VPfL0aPLuBgIr5Q5kbreW?^ z2qVh;Et9n$vOnI0>slc^S~Th|n9aBkk#kNgeh=u|4TihLfN(?szZ_l|tlnVAd6>j^ zi{EZlG#!R|F#z6RQ1TmFakRV&oDFyabp5DqvUa1Dqth`sSf2Lt7<-bB;Nt@5E%BX` z2s?~|LVQ&0EeFRq)B-5G0_p*PXKM$X10O&ss&o$5FbbleGSl7Fxd#<3>f4|E+Zz321NIdtNFUc%#qmx*U(Ip7ON%f167P2GM*OzMaih802*;7K7}BI^aKp9%&-<>Q>+j#CHSFa0hX-P5(sPXqfEB1{EFe zkBc?WyxZp6o+L<3$D%GSNSW2UEI!|cG=Il$Lxw(XL)L+JG%*0ib<(#XQky}BjE3^K zjXKlAw7{!7!~+t}SleN>vS2XOJExlVczW@bq!UGlMQ$62c|P4cY^W*}m#lZHcj39% zld8?L37eV8&f5@b=)=y5N8{}z>gZ=@d9dPy@N66MYMu850RNl^^W*4CfAn|@FD0R1 za`I!P&lm6W$v!9aC0fk`HfA69%$4Vc^tH!c{8~?#9w3YieAdZGZr{XiEH2+(%3{$f zFRl)FJDo@lzCC@c+$j^D5pW27xv1b{#TL1DY4z}#7ejM*NTsJslsyw7N##1;Eon;f z4Yv{`EN->eOnxt7E)sYnBeG_7f^^T6AIJI)+E281crSj=j65+sZ+<*qN$+j_&AH<@ z>sp$>G>mOr*@m#5WUjwgxjc{`a{TxgX?-5+f5--Gx#nw$6D^U=^UM~pqTqTx!#w+Q z1lz7B4{PslLl)~9+mNq;gsqhNhqp7A_`yKhOAtBUs%sxH9BA1xk~+QeD8XG;hL9s? z8}v71KY)06cG#}0?5He7IGDN&u@>awC-MCPrg8rT0&H>~MsgtV))WJf`a5EL7h)WE z$G?cNem!fBMfyQwQ$_(p0x;*DWC@vjEx`@}jo{$(aY3wV3J2g&H@`<-zAOQt4-TY) zSYR^kMh5|X65hln2&7b-qkzo>xCS;8?E>Hp3@oOI#<8ZLOIqCsDAh;sqhj@>td$nj zo>;Pjd2#@}&tRr$dPuhr4?=lgFHGT+5-xx)r|4Kt_j5m8DxSo>j( z5VUYdc;Vl0Zgv{7ds1zM=kfTI9(~SS$E(bH$+`W{b+5Ls&$ryS;wV>|gM!8hJP$Ti zMMfTdnBx_>A*7OlHz>IhFttLsyV|CoTnr+z&(?lFjczC(Zn&tu&T7Z5t9C4^HA_Y& zE9>a06-*>_Chs*+ZXkS`8`(&kdruF!xLBLXGq5nHFL~*P&iA;CI?0@>z`lg52qB&q zx9?;&-|4=8cK&LJ`0b~2%E6AFk0f}$*9K1V&o;bk|0*#6TLRja7W}U7#>8RVWdFBS z+wX4{rl6@`=qz#PwBh1}fc5V2_a2+1w}iy;Z&LE#13o!*Z#+5v;sqxPb+ zYQ@UV|LuFxKDNAdX>}~&x3e1w^N9Tk9dIFnURyh-{xwP0SOcLK`RgB5EquxOz74^j zYk9gH*jhU|uROJ)@|yW%J)~pNZ_94gNjz}g%jd%FC!MiEbqx#0S3-riE;Sj-e$z{t z_G#B!n4IHvD{->d>k4(e^SNj9@|YpXzfHfWxYqDlkU?are@Mslq?!X{F}=@#^6gFn zNm)|MHEh0;A8rW&9X$xrgbO7Tr3iV<#lP=_;DJ4|mZUwhR&uw5k2zw&GCP@5mCSK- ztd-2KS}_R=rosdo>Cia|IXOR;;7EaNo_2|LHCA*7ti&-1F9v2-dvrEd9vmcDa_Ad} z8P*1lU3`@oOYo!05Bvg)U$O&aMga$<9>5DUcR*uyfSpp<-1ws-=a3jX16)T}SbKF{ z?{c+GpTTs#(@cQw8OP=HKJ>9Dd}4I|Wg_5iK-MM7{r4*Sfsd!oA#FM!?f!eUA;R=` z3ayMofvZrjApO4Er|lD1=ct6(suq(U6#3*D?6okf#bAd z9on?3O)FXFM0b?5isU2E1DsxtgA29kl_zlAUrx?N3F?8!Qz|O)h7EbZyDDhF?|uH8 zOi4Ld!0MY(a`PL5`gVjD87uYCKBLpM zgI3<&oA{~B*CReRlI3lc=bAU?AL>jTMVW`j?w%aV`pKf4HA+0E=ep4g=Vn=NCN7D2 zw$#O~WSZ*HTO@C*<$b;NUWhrmS{c$I!DA>!dOPy@%zwB`_>YVK$4d$SwQBy4)r0V# z$mf6iW0RK5U#9A2zZ#uRD^b!93VL)cv1($tW&Psgt1!`M!5<5sI4!l&!8PbfCGMA@ zLZqn*$`IskBqlt((Jq`3EgB9M71FLYH}yhg^9UzhXyh@G_}Z&v;M4=KzewFt@SG?B z`jke{>6NE(ER_V5jPPZi#_BPlz`@sG>SBr4NF~rq=GZ*#wHPlyrUnj60_qP1w(1^7 zAArt}5lixb<^v*tGAQ;ep>xDHmstX6b1&bN67A(bVv}mH4Y; zOQQb-Gl#SBk$&=mL+7d&H^e=c7AKxm2ivzK*T5Jt%us`J`_H#1nSaC{y*&VYD*I^~ z!P^Hf`I&zn`!yH`Vxpm{K_=>io)49^QcW`X1+4J|i>Ln4(E*F4T_N+@ zU?wP+C0Nl0+!U~s&)Q}mT{Ma$$al5Xj=+wN!70LGJmknGE}-><+raNsFCat2LWF=< zY$X%?UZjC$2H>cCsa_Q0%an)q39~I6y>@c@K<-9*pZFzV4n1<(-yB<_{S=3laN*EC z@s+ukAM2>_bgT;C$6@GoU*-vpD?@CW-T?q1Rw>2Av#^Zwb zaZ*>j#~4XY(I3~*HQ&aTplR!P5Xwu=%f4CQIreJOX=PnjWN`@p3pCRUOVHdKQq`;M zM^8KI!0~z9T^i9|z~`Z18ey*#7_kG0Q&ITYEJ?A-pKT9;M0FgT*61bgKK=hkLin%W z1`XUS#jt-?19G^Po5$ZDhwbWt-U1W$lV!)L~`j0$7{1;Gz{HQVbM0 z2IyggV1;ZR^bxk?vZHJc$S`3?ZTHQ_n9G(xsW@Q8qhnPo znUvF&zyN~AWS-z)K$vBYMWnDCF<4;bEuiG4O5mE>0uR=U(FK|ljCGK#6lWH`x?HKy zlE~Au4^{;OXok9vQgQIkF3-;&C&^nyA8r`V5*o(ekg-)$&r~zq2Ftq@zoMb-I@=H& zd%Oii!A6R2ddG*941Hhm+G=^f4e1l;c~lfb%6Cg&uiS<>FQ|3Kt)lVx80O}o3wlpB z@%hooh2`GO>(fO~zj&`}WQb=xnq1b~dfGL!_GH6nx@F@y;fj{XA$hW+d0C5^1+AB+ zqk&u3=}$Usmudmt2$3eC?9$i`-UU!?*Lp8?0xPI%$A~T}L4n~Bte||X4&qd7uTH<{ zI-4iza{`}}4goCBGWppET-;!hE;XBrvp5-%m52>27mI*-#oh-iu@Bm0Bs*e($iUi7 zz@Z}GxA!uj);7LAVW=%ooEzXLTtUN@>@*G5R(S3%=MYDq-tB9Hz7y`+X$R0W8mYZN zK~v5;dRg}{PZO{Qfnr(!%>+z6Moa}A3a{7{1{(M=jFjgxB{}4#GA+&qgf68yK{S#T zOlGFJk?d9=c*ddkIvTtpqlh*IhWAAQx59F}W*wMh4cDGt&a5#q8q;{|9K`~Y>%nvv zAh!B;Yl`9pp`4dx+^gzm#6E*!1aY&8F?O?9&ApZVOypapvhhmbVUel-T{K`RqqH$t zCq^Zkz)8Qt_TufB0F_a#IK(Js_#~zR;7J|)lmrR@O0g225dyV96fqo>KHn+xWAf?( zfsF~j)V;P>1<#S#zBwSC3V>R5@Z(6OPZ+>arW}CT3n1N#K>Q&o0MS%{?|VRMc_}RO zYcam@wg8?WGF4O%JJ|I4R@)2xKI7W$pn9B5&%-zs}y(^!0D{xRmLqK3M|l7aldZixfmagctD{$D0Ign z)A2w^Sa5tv5pTzG#A<_s=XT^nz)H}Gsg*!B*Ce1sfGs&d@FxLUfyD=Sp#g~u{=tdf z!elBqvD`GAv7ekhcw<1xebs1w{3SEGuWC7%=h{_4O?B-oY}OE^9kQl4G`r8bBDy6tGaGj^&~{jI(<>&`YhT8Y2MhfbWu?n{p{DBv2eJNXY`P<3N>W(!#g zaKpL4l3pxQ*3yh#YflENz)3k+AyX(2g48A9^>nCkF$n!&h0GC3d3=3>P+#UjTVQdZ z?Lv;yV&;fC^}g|H~hR07`sVRiHIM3EgGQ-}VBPVgkez6myWmfeQyM zeLKdFVh5;A8|Z2(n>_X_V*C&YImvk#`(4L@kpTf;u(16vyoG9#LNzJ3tH>&=8tE6G zg#$BxrK_W;)z#4sK(DNx-YY3AB?WiSwsY5RJs=y*{taPaP z?&jbu4tpmEIKc>zjV|D@g+X?Ohe7tiWx`>6m_r~~7NH~|EBu^Tewk6(rUDQEkO1{< z#5@PC7kJ>kN_nc4XZ6rtKw;3HJDL+)ef4uh67P-#0$v6^qQ~|J-%~2#dnY_`H-KSR z0(1n(z)=>NIt?@{sGq5OO#oJlB>;5;bdRhBbn*y5L5!&-3%V^7JLb6Q@JSnT(;G5F z5HX6#Vi(CY!NbX>i{O7zPWw01> zFJ2R7pUqkBuRud713i(ir*KWwUFAIazkL#u;@S6!V8r=v?V0^A)-{h6|{)guz6-Y?#9JNE&a^E;oufS zl;IhBZ!8POI5NF5zED=PTrwJ5{}_lUjH4V*Kq#PhZnPsR@X7%roVr-J4TIXIVyuMh zmO8^%8+yd$IS|P`Ss)hH#-Enkw%!8=RI=#9^JV) z8A5+lC2!!N^Q56SI{-Siv>5ccC-(NEWJ4{ARJOeBG$!v*k!IESkV{_CjI^Xr-w#IM z`Iy2xdzbUj{9OAA`1cLE!1ff8yrKq0aHr2|Pw&MC0w(ZbbOH57gKak-aXK!yPe>W< zC0tUup6&%6l#e(UQNn9ib8TAOuaC!F+{^!OuReEu)oP*R@spl_^KmqM>g`v6ToUAMA5ose@rqyBolNlNfyU4OEk*IGjRa_`OO31mn9{aE=T4JjmKY54CS zA~DqXJHSyIyt)AhB|JNvQ-xzV@OB;Jq%p6U%Z&iUgIK`@jv9b=%#-|sI7`Y?4Xnn_ z0EyIK#v)2~3%nC@6fgB_^y<5f_Vi-0=fcKHzSUeEiF^Exi}*RBo>y4+Dir<2{{@T3 zT_Dm?g6_q5Cvesg?d8qrBk)Oh`7&CB%sE2Q86D&?Wn;7iIBU>7fm0xBiE1S6O(i|E zMtuxeYp*L=)#{FINVq>2(yB$fMNyj%P%CO+U2pgx>L8bW?=+G?;9? z_W7Q_Dv*Q^-G)>Xu2;R!CS1$AJsF_(*dr)Z+3`u2;#Y$-nS}S~M6Qzweok=wGgV<- zjBJT2y+z2;CfS@*z3wBNT4AP%ML9UAX!vun#3;4^m5qUMd)TiK!k1SOk(nC_Uq?TzB;J zYsA!y&PK#aMmmB+s{PuS9l`gxi$nci#@OCQmwLXexpsRjwl)S`x~z9w=^4LEZHxrH z{zlxN{x6F>VDE(-9X(4bqh?7t-eksEN4$5{*kvYhTFI*ol`8<&?{S_JMM?86tWcaw zryL;*rBX6flIDwqQq9sM1GV06PCs%Pv2?SID@C%AD-)6 P*t!=FE3%^+ZV&t~-#Jwd delta 20016 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 Y%G$d8Ckq 0; +} + +test.afterAll(async () => { + if (createdOrderIds.length > 0) { + await pool.query(`DELETE FROM service_orders WHERE id = ANY($1::int[])`, [ + createdOrderIds, + ]); + } + if (createdUserIds.length > 0) { + await pool.query( + `DELETE FROM service_orders + WHERE user_id = ANY($1::int[]) OR assigned_to = ANY($1::int[])`, + [createdUserIds], + ); + await pool.query( + `DELETE FROM notifications WHERE user_id = ANY($1::int[])`, + [createdUserIds], + ); + await pool.query( + `DELETE FROM user_roles WHERE user_id = ANY($1::int[])`, + [createdUserIds], + ); + await pool.query(`DELETE FROM users WHERE id = ANY($1::int[])`, [ + createdUserIds, + ]); + } + await pool.end(); +}); + +async function setLanguage(page, lang) { + // i18n.ts reads `localStorage.getItem("tx-lang")` at module-init time, so + // seed it before any page script runs. + await page.addInitScript((l) => { + try { + window.localStorage.setItem("tx-lang", l); + } catch { + /* localStorage may not be available before navigation; safe to ignore */ + } + }, lang); +} + +async function loginViaUi(page, username, password) { + await page.goto("/login"); + await page.locator("#username").fill(username); + await page.locator("#password").fill(password); + await Promise.all([ + page.waitForURL((url) => !url.pathname.endsWith("/login"), { + timeout: 15_000, + }), + page.locator('form button[type="submit"]').click(), + ]); +} + +// Locate the live toast root. The shadcn Toaster renders Radix's +// as an
    containing one
  1. per +// active toast. We pick the most recently opened one. +function toastRegion(page) { + return page.locator('li[data-state="open"]').last(); +} + +test.describe("My Orders unmount flushes pending deletes", () => { + test("English: navigating away during the undo window flushes the DELETE", async ({ + page, + }) => { + const user = await createUser("unmount_flush_en", "en"); + const service = await getAvailableService(); + const serviceName = service.nameEn; + + // Seed a completed order so the trash button is available immediately. + const orderId = await insertOrder(user.id, service.id, "completed"); + + await setLanguage(page, "en"); + await loginViaUi(page, user.username, TEST_PASSWORD); + await page.goto("/my-orders"); + + const card = page.locator(".glass-panel.rounded-xl").first(); + await expect(card).toContainText(serviceName); + await expect(card).toContainText("Completed"); + + // Track every DELETE /api/orders/:id request along with when it fired. + // The unmount cleanup must flush our queued id immediately on unmount, + // not after the 7s timer would have naturally elapsed. + const deleteRequests = []; + page.on("request", (req) => { + const path = new URL(req.url()).pathname; + if ( + path === `/api/orders/${orderId}` && + req.method() === "DELETE" + ) { + deleteRequests.push({ path, at: Date.now() }); + } + }); + + // Click trash + confirm "Yes, delete" to queue the deletion. + await card.getByRole("button", { name: "Delete", exact: true }).click(); + const confirmDialog = page.getByRole("alertdialog"); + await expect(confirmDialog).toBeVisible(); + await confirmDialog + .getByRole("button", { name: "Yes, delete", exact: true }) + .click(); + + // Card disappears from the list while the delete is pending. + await expect( + page.locator(".glass-panel.rounded-xl").filter({ hasText: serviceName }), + ).toHaveCount(0); + + // The Undo toast should be open. We deliberately do NOT click Undo — + // we want the cleanup path, not the cancel path. + const toast = toastRegion(page); + await expect(toast).toContainText("Order deleted"); + await expect(toast.getByRole("button", { name: "Undo" })).toBeVisible(); + + // Sanity: nothing should have fired yet — the 7s timer is still pending. + expect(deleteRequests).toHaveLength(0); + expect(await orderExists(orderId)).toBe(true); + + // Navigate away via the in-page Back button. This is wouter + // setLocation("/services"), which is a real in-SPA navigation, so + // MyOrdersPage actually unmounts and the cleanup useEffect runs. A + // page.goto() to a new URL would instead tear down the document and + // would not exercise the React unmount path. + // + // The waitForResponse timeout is intentionally well under + // UNDO_WINDOW_MS so that a regression which removes the cleanup — + // and therefore relies on the natural 7s setTimeout to fire — would + // time out here instead of silently passing. + const FLUSH_DEADLINE_MS = 3000; + const deleteResponsePromise = page.waitForResponse( + (r) => + new URL(r.url()).pathname === `/api/orders/${orderId}` && + r.request().method() === "DELETE", + { timeout: FLUSH_DEADLINE_MS }, + ); + const navStartedAt = Date.now(); + await page.getByRole("button", { name: "Back", exact: true }).click(); + + // We should land on /services thanks to the in-SPA navigation. + await page.waitForURL((url) => url.pathname.endsWith("/services"), { + timeout: 5_000, + }); + + // The cleanup must have flushed the pending delete: a DELETE request + // for our order id was observed and it returned a 2xx. + const deleteResp = await deleteResponsePromise; + expect(deleteResp.status()).toBeGreaterThanOrEqual(200); + expect(deleteResp.status()).toBeLessThan(300); + expect(deleteRequests.map((r) => r.path)).toContain( + `/api/orders/${orderId}`, + ); + + // The DELETE must have fired promptly after the unmount, not after + // the natural 7s timer. Anything close to UNDO_WINDOW_MS would mean + // the cleanup didn't actually flush. + const firedAt = deleteRequests[0].at; + expect(firedAt - navStartedAt).toBeLessThan(FLUSH_DEADLINE_MS); + + // And the row is actually gone from the database. + expect(await orderExists(orderId)).toBe(false); + + // Forget about this id so afterAll doesn't try to delete a missing row. + const idx = createdOrderIds.indexOf(orderId); + if (idx !== -1) createdOrderIds.splice(idx, 1); + }); +});