From c28bad267ad50ff4a5b751f5f06d413620d618af Mon Sep 17 00:00:00 2001 From: Jace Browning Date: Tue, 25 Mar 2025 13:24:41 -0400 Subject: [PATCH] Add utilities to check platform to determine if a test should run (#5983) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add tests for utility to bypass unreliable tests * Limit skip to just Windows * Ignore unit tests from Playwright * A snapshot a day keeps the bugs away! 📷🐛 * A snapshot a day keeps the bugs away! 📷🐛 * A snapshot a day keeps the bugs away! 📷🐛 * A snapshot a day keeps the bugs away! 📷🐛 --------- Co-authored-by: github-actions[bot] --- .github/workflows/static-analysis.yml | 4 +- e2e/playwright/file-tree.spec.ts | 5 +- ...ode-color-goober-1-Google-Chrome-linux.png | Bin 146266 -> 146280 bytes e2e/playwright/test-utils.test.ts | 96 ++++++++++++++++++ e2e/playwright/test-utils.ts | 12 +++ playwright.config.ts | 1 + vite.config.ts | 2 +- 7 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 e2e/playwright/test-utils.test.ts diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index c4c1ec7d0..894a9fff3 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -141,13 +141,13 @@ jobs: if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }} run: yarn playwright install chromium --with-deps - - name: run unit tests + - name: Run unit tests if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }} run: xvfb-run -a yarn test:unit env: VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} - - name: check for changes + - name: Check for changes if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }} id: git-check run: | diff --git a/e2e/playwright/file-tree.spec.ts b/e2e/playwright/file-tree.spec.ts index 3921a0b30..88ed2d403 100644 --- a/e2e/playwright/file-tree.spec.ts +++ b/e2e/playwright/file-tree.spec.ts @@ -6,6 +6,7 @@ import { executorInputPath, getUtils, orRunWhenFullSuiteEnabled, + runningOnWindows, } from './test-utils' import { join } from 'path' import { FILE_EXT } from 'lib/constants' @@ -15,7 +16,9 @@ test.describe('integrations tests', () => { 'Creating a new file or switching file while in sketchMode should exit sketchMode', { tag: '@electron' }, async ({ page, context, homePage, scene, editor, toolbar, cmdBar }) => { - test.fixme(orRunWhenFullSuiteEnabled()) + if (runningOnWindows()) { + test.fixme(orRunWhenFullSuiteEnabled()) + } await context.folderSetupFn(async (dir) => { const bracketDir = join(dir, 'test-sample') await fsp.mkdir(bracketDir, { recursive: true }) diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/code-color-goober-code-color-goober-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/code-color-goober-code-color-goober-1-Google-Chrome-linux.png index 9ee9c75741f9bfbe735d7396f4581a7460df94d8..ebf1b7d0731ce7b974211532b90c054ed0565b9c 100644 GIT binary patch delta 23557 zcmZs?by!s0_Xj$Fpn?d9w19$uf;2;?w3NiqjdV##b9f1*c@dEsLYkqaq=t|b7`jVI z=^h&H0p9!l-9PSm=JDYf&pCVVwLj~#K5MN#ljwVY(f9l-Fv4a5Z@9je+wZeVbUwnb zI+gXlyWV%!?yvTQ3EFbJywOx{_5*!S5wMa@PB1pxKx0LaOnK>4WsPQLj~1kjz;e;4V#+W#w}#qU!`!;{ql?7_ zYgkHoU$L^NNF_=Tuq}e86{tKSh0V1HKk|hnML&23f!v#@P&QW&lz6)s8XvpPMMpP^ zNJ^C0M`5cPzLADY4O>}k)jK^>#MT&5eApi%_XdveYK{;!gDYTD%evHk6kI7tI^b!9 zCkCOihw~O)Nm)0bx(G2Fikb^)1-Krw23soYt0!L*1ipI!zVwiPpWT5#o+Z0H{ua{X zS5Y4FR6b#qD=D6!Crw-XAT6={7q;@j+MUwY+xxhQ`c!hHBEA$odzB=Kmr?!Yc_gBo z4t2-Pzqy$?^^O3)rAVCd!*4EZGw2}!=<0HEGfR!w-MFBMv=q0D<`D}Ot{xQA3O24F2;}KIRE^@uTwz|<;>wR-BD|Cb)Uc5+E;br);&nQk zwou}geEDplC_xzhX|Q1YVB&Bh36W(aW$!yoK&jU2EmR%$;^d?m_nq@cO;=5ljNDbs zmH_dxcQeKVJAI1}$Sc_5;+Y;O{yqM}C(sv(Wp)4EJq(C=r`>7;+~at4Iz zdLbfgKXO+}k#`)=+2fH0E@~LxW=lPPLOGSrbVLi8K~4W#z`j`2YFS3#g~xOv3h&d{a@ zKZ#Cq4dW>-#cOcyDPe9X3Nj)h6^#^+`A}lF_K>77tc;c>P6p)^=%a&su$9(qb|ys9 zBclcfPVycE@;Wy87m&=&^DC!*jjNx%`r~^)%Qz9_-pDT>T$~4(R+P6J#YslO1UgP6 zBFRXN zLeH~1Zy#LSp|tdie9F@D9CH`3h2-<(mqa~yNw`crujnM`IFl84T-R$KiZkgb47LFGK;;jlljV_QGBfkWS}R7AKG^e^hp%m%iuY~; zLX=PF5vF!qJT2$NnU#5eO$MGaXrEKFMtG~7{Or>Hu1s~OH0#Fm@nYTv5jPv*X8g;ZR7AsL^L-?+xvYlC!bqi&vIhbuxs$!nmEM@Az3{wq zb;6a7qx?0ZEV`PgK3)^8l2 zX{tKtIgy7LF9NR7tj&Xv^D$R(qNq{7Yal`M{an1|J#5CSVl6ZZ@>O_?1OwvVe+TAC zM8$c+m#^e^XuM;yDp&M(_;qXwS00E}*sg|@2G7u+A%#Bj$BFsCod>7!lLu!E?pyT- zeVS4k^VkytmIYm;sQf)E4iN!Wx18K4T_Uwov}Sm`u}?sFLtir&TWJ z!&{#03`TW5Ai;oDgtgSzan(9#zJPMU;xtOob}&W3Wh^abD3?c@X>O zLRXuQ!8y=e^r)w=9gNVkTsJGSx5KQXGHf97Z~kHGQryCU-5uc|&S9u7Lg;g(4j zU@mQW^2&cyO8nZp%;4lqIZ|hDV~c3MJk{eB3Sia~NhlI{ke8%*U@1Ku#zdF21qE!R zTVq2)bSs%{c=9+7G+=Ni3?qXIZ$J4x`vod|%v%NUUasXsIIAAhyED7YdF9UzS8gUMF=3DaDN^OSN+k zZ1kyl`574=8lOsMW-}5m186e*WkMW^wuqO^j<`Wa5B&^#A5bzE&9%s(65;}b)8 z>lPopN;`kKppvTTl;2Gr|5T@UnX_;|D1>M!!8O z|3DxRlQ+G>1=i&hEo!Q!IjlX3hsLu)!6Sim8I&(4McW1VTo!@CLSrwkZ>nXc(ydv! z58pTx8FOTCSc)WjI~aZ}+e=Wf3=TQ@XRiLW1QF38_s{zn>Gy8dqL`}lVoqiaD)9c> z?lP4mrWL~t4Om5RJBX??{c_#wNiq=Ok5%gyVPQ~S(e2Q&RASW8YP_ppX`$Q$^x_T% zCMI=7c)SC=m>;Db#X%|_Y>|WD=73gwEd6}xzLokXodZb0^8S2bLm53;`BNPYY zi{uTB%e0Ymwo@!b2%1T;ysAnzsE^&q%dAc-QqUFpQCMC_$&+cC3e+R+cdhgopsFEyri{cQ}(x5<|k zSIuPp_yp7H<*iL@x(JdUMJIjrYWV$YUjL1o=0lF9LQcbcl0sb=z*(HZN(C)H4Z*2- zlSya#{DmvegjKJgrH1qf>ijisZB~vJ%hwyBB0weQTivChe8OA)*Z}sA_?~{LdK(kvP3(2M>(UkS~(>*8(r{u*gYf zgt!{8@=ALgIb9K;pZao!U$%QTi#_QNUX|*+(_0og87*DFy=4;AiLvO8QHEYSt%8$r6Y4_&Kq7X&zP<3^BiGYDeq^Xn6`5ut`Zv)8x7rDq(-cYyp6>VH$TWAc-K5rbmlRu@29m8yKY=G1rp#Tj+@@RIuQY%JZYB zO2nHuiAZ^}!#ECZg8tAja#oK5W39GgPTN^y4nK*+2oywl6FTlH#O^AjL>*Z}FDzkz-~ zIhm?uYi(&j{K@DGO`>ENc>)Fg_wd!^! z7B1K&BS7c>=KUPV+ClC7X1HGejP~nPpf7q{pWq9IBnf;E5J>KGWq{hW!iW_SIOahX z=x`WLHgXpRdq>n!0ZH=LlLhDYWOVYh>TjX)2Q1H*mF@ODJ^E$;q|Iz3uw5=QlJV&!n;xQg=xR{C*cJQ z5!+0$qH}u?ja$l){r8z2b#GTNj{54wm$@KY3~kJNpd4>{O?GOQ?U{srVc|wAoPAl5 z;?VQ~@=D?ckWY{*q_#4?$pN*4>i8H>$!-7>nqD%!v~<4A zm1`nhybtCNmojnj^Xg2xY-%j!gTjikjD4*tBglvTn&Q{-t>qiyn;0JDDbBAvb4QS9 zG(!AAiOU1;tvK!BQr2hg$>DOt#dZ-(Bq_6qdSZ;+6KI}DQDBMt(ps}x4ujuI$G)Zv z!2i96#j57{PZrht8wZ-N zpgr`*L>*K>)oOReIQc|zLq|Y}D7o`7AKSqkv;X^DK9Kf;e!>og-)*j-f<7qqEs)q> z>hSkxv`3!2#1Y2KdwjF;mzTj{|u{H=T$Df&6(t$`-jB2s?Ppy5DSjm7=Kp2><_`L=;?BMhVM8dQptGhS1A_ zvbXOEAP7}%?Qt=((U4L@k)*Wpn|`DpuqyJ#?x(zVDu|q0ehsclz9XH+ijAvTJqN8e z_J7lOR{BALM^qK|a;C3b@oD^7g4LG9+Mpx!ul4w}6^CzVfGR0c*YTxr7+yNXjeipU z2qq%bB(E|5r1piKj0c+-d%Z3Z5O4{^h(;Gdm}PE4Ytt!;KNDf2p>CRm0Sj{B7MPK+ z)zAIq!hF>qJYZZ~kUy|df0nfy>o@qB=FVGAho=~z`6X>pFP6(t46$9O#rKV^Z?^c^ zj&JgjNGmBXj=f+CaAMRfnZ>y60(Gg7d2?YcG*i)i>o)*ITpb(Zb9I)Gi6+^duYwAZ zn%W}wAp6qSQOXLD{+o3<10_H&V<0$e-D6-wU;MYFoRJohG;tUdoJ$@%7wx)rv8+ti z<4Rjem$8;l>C{G?5$uA!l7&EJOTC*6PfMkYDfTRZq?_MR>NBg!@%vhITet=@c=xb& zJ?a6XZcJ^&wF8UaGkp|3-k+*rBV{mG52_RvMYpQKERz-m#ZHeU7A#0~1Snt$e*`$K zDUJ3Rvd6tp7w0c=6GqNpBoJJ_1EE4FW&dh}^-HWCXP!+2amvhFjX?Jm+)>`I&LXPOhM> zZz7x6GJ*)f>HBq3_IJ^z53~Q*?REx@pS$ehWVr09`;F^CN;_}MBO#L^F$Z?1I+dQQ zY3p8nx_Lg++2C85uxMJlw|V!C@89By!&EZD;Fl$)3-+_omQa#z z1?lGu-+Do>BzK~^4?eEP9EapRYCQK>j%|(+HCpwN&>z#>2ya6k z>vJh))wWQG?vra9_1j6{KU@7S=!`nKr0cB1)V8|WkQ^?Ql#)j4t30Zq_FhLElm35m z&M_*t5zffnh5URAL!zd^QvXXrEQmj;ghS~U#926|xEpZusD*-#ZI)u9(S?Ami!9fd zT6!8OL~0&?7k=*>Cam6#G$`>pDVnqQVRdJ!>Dps*J)%VPyybjub^*;g#(&DY+%w0p z?5z`OL}0W6`f9ww_3z^FI~TS)#xHN=Oj1u)k_dBONJt(D5lP9{dqpjOh@MpM*ZdSaRx<}7vTlg%$Xq#bt+iQ5(bbfc|p$p4HFd7WR>)p2w;82O=6+N-mU~qTsc)8swMFrlq9C@8g zhy?xEr4ROY#tPI&`9b)7jI#zal?>OR*KIN!=Y!4a`f!Na5E7%S$q=na))rALWlBbNM8OAA;o@~^3OX1Yl=*LzlFi5z-Xs%#g{;u zaCXm@BaMUUIrmz?VT48agMG@r$M}Do4SDbp$~@Oevx4F;4f@f${kWt{_yQpHdT?@< zY_)fE05?;;she0a)5}ne_LUQ9!1Ob}`&5>irtr@_pXVY%8$w=bPG^8?v1&hV7T?;> zK3prz^vT3}%X(v~eAD~{O8eKT{Q^vC0}RX|I7N3nTTZ%*v?@O9O=$1^_H+^s#!JUJ zKLO#SWS)Y5%~IjzyDuRE zza{;fW(J}&yU0*tVOV3jChV>|q{;3UU()(L;|G7m+)SmiK0e|vpi?VmF7YSI&3PwG z`ffZ!q9$Dx|3iX^Hq0Ddsln~?*u`CK$7Ojk!(o)#liNEVNCdvT$*}QzxZ`thu02Iw zBLNw?A&j>y(4-5;STLq98$E9NEOD(4D*kjMmE>AH@gI$x9vmeF9mtd26qe)H*f1AeF!U9)TP7Xl1$ucvm6y)man&TY1%2 zR9+jqE0|Lq;79fy2;{ArLkkDHU3nD8gQg7G>!tGiLlP4bF4f9ie2j1H z*4BN#>>W3FROga&CBWIfXpZS(DyGhXQ~F-XtU|8FxL8g7ML_wR*|@$2*XH47@g19K z#kK{f(6|XqNY6jlKugApV+2B?~h zyMpV>ROS>f)pD&AYs>QlRbvK|nf;hVe+y@TV`(@kt~7P{+fF-eMSvFI=JYc8nFU|)cjoBjthL%>kC zbh+jQ_VL-B(jPmPpz(szzgbt;loYqoZo~J#?3HL#KZFE@+${Rh0$ma=WhCX$mtA5_ zX(?gOdBs|<_cVXB|MOrCc+ncHS5cC^vZU4#ze$8GCKO<>Od?tePto! z=CP*1_|*F*VJaRazH7$80u68Intm0q#EMGZ!x+9Tl*Ur3166Sr{EAiUilGfl!5>hy za{W%jJznle$$KMKIbNl5*b6<`Da0{B6bfF~RdM2*p{-$JKPlb}Y0MoZ1F8^(n^JlI z^Lz%fCUVQ~oLNJakkRf{?p!M0`w&2Z z=0;LHw;34?Yn+{QY&QZ1TTncW@|L*xW>dRw z6?3+W3JIZPnrE&z+J-0Fq$zsrzIlk_uXgJe@)I1~LCMS*zB3D`m3&k6<^=3&qy-5HvN(?Q_Bl!4245 zQC~VQ94YX_wn$%VJh(Bj_&)hMYpvcu4HZf%x~4=&6{@VE0oR~i%c#NMIiCxbr~S_!}vFKKnj;ufl= zn<&n7`4H|@B^POA@?M)+|G{M0B%H4(#07Km^>q#l@}=zQ6&py*8aY<2aRv8B zyqX!3^hxpr6@ui*3wtqDW3@3;h&90;|=>AFq3*~49n_y%Z* zSJg@=ph&j3_xbme$rU0R7NZ*%A6XV?2i+v%UFglJG>^TmQui_`IE@%<_s`io5TeMU zzuHIbR%7Dx)2XeiX_G*!K=KopDhe3VCWCR(*0ejLA^t9ZpwbL zkFRBH{^}6;=_(6U?*PWD_C{vNW|E%F(2AWTjIZL7{ZRq&2eIOZ&D6N841D`m%BQBx z@J}KoQV4^PC`QhG>{L&&(B1B8PAToudOx#S78o5kPhHn9(6DIkznCR0`Rc;0w!ql;A;cpnJF@z$Pr z6ez({1TQnec}@?90+pcysDF}K1QKq|-Sv|xgV(e*Vc8GsehxOmrVJxc$!zVoVLe2M zYfx0JWCYR^KISW*Wxur8FZQV+#+mUGlFAy`-mhg(+?Ttd+Xq-!SkFY~w0R!C;-Y)4 zln>XFCi&Ql%OBf?eGo#~ZzDKr$mh1lv=m))EVBP1F?FmtE?MwIyCcbVQ~#&#{c9;3 z%OCrFEk140(151bW;e#SJ^M;F+?U>&S-CAV3qEApaVNixa%qcon||e-`^x1mFvVt0 zCn!inUF7QsS?;bVfyNXsf~L`Do2*-H(Mt_;MP`J##I789mCeen)b4${X`?XK?6e%3 zIDQ+{Fkx`aCg5NQobn3(63p1%K~?t3UqITMkD+hdesW1IR<;8T2#|>B%&dm)d(+R5 z#fyEsHCHX3Q4AOF24E0^a1ziFVy~vP%2&tTb8C+~BZW18X27m#RukxJvRavNv8S); z2-l9;0jirmuT&l}$Q(g8of!vf=3$N7cFcoFub(KgS~efOEB34P;B61*33J-K#e>Da zNP+TjP{={jDRA!IRl+w>8wpc>*u!{0Y8S5zV=b@dwnXs&?n013#R?WE%p6%PvsT%r zsV{K;Q?JA5{MVkAuVU}CI>UK>EaN2XlKf_io|kwIjS$Cl^)#+cxVa#OnPxX4j8@l> z^UMJ0Ffmwej5DHhbTIjYv9L*;S>}pw!Wd7!yiIIH%{WOl`db28=5mEjyEyKgSP^As zgRYbV>CF{h#G9;uVwRr}=xHyk-@o5!-*m+HCJR^0Pj@ml{(Zb_rZo2uLPV@eT=bl= z5ZHbj|I2VJJ7=VISvd1^$Jouja|>S{FF5*aCg(JC;YOv2h>OtXVLA$Rk-X1l(sT>$av~@!c2+WbyERxm*Q!+J0v|QuOVg zBz#JtXLO8{_7|Z7QP%yHU?g;=7V&ajN88R`Y`OF8XW&&ym6EQH7EzPu9fULbpE~Eu zm)N_F*X4b&)>FDE5?aEa2yq=;T`sN6dY-W&Pm!nlf_2Ayq?H-wr#8zUW&pU3M9Skx zqCkP5#Hh>@Eky!lp0TiORuyO?pLI-yN-ijxZx0iwaP22K&6CW{D83W2 zf7H#c{ql{9>eDBei)B`QA4}a;^R4=DsKoxaU(sTh#~>4yG@vI-`5qy4)#7c(iW`0h z;H}kCL*m{5@G0U|8$vE~pk96YY z1r=d*Y;)T5<)=ojX$n8dFB!yZ`@{Tken|KLSNYw*g6Ggxs;lv`9pE2v+wZ$3>nbv} zqoA+XNZ0ad1A|J@U&JDA;NRzaG;=g*TQUnEeZ9x2tg9vi+wF`JNxI|5%w!=59_YE1 z)|H+{cO*t(eP)jjLGiyya#~lt>K(MH|8a$Ivi@CCcZ2SH&uL)>H~(B zYOIQit_6Z*E0qpdswdZ1{b8)o!LJ;27Y`!4on+KW zF!+tsbbX`IlKE4hn}6(s3|ri{Z!$`(Sa0uVI-KtW#+WD9@ol^%#`hND9u9XiIw-c< z&R+OL`zpa&_sQ*MB-X6a(K)ZAxT6X5cPdMKS?j4s(rgZm3Yeqi9BWr|$lMz=4uc`X z;giRIXB*w<8j@#eR}BdRU(n4^d9nMZxp389Z4Yan0*c77si~>okt73SV|>EGPtNNh zOzmEVHMpvfCU`*OrmwFrJ-rJLpJaIF+0~Y;tSkYo&^c<#L8sj0(D%w~`+F-ck*X>T zRz~MwVV910v#Xq%w11UTaEV)N``k3bvXvaB5r{dq(zoD~D(AQJa&M>ux39GiO^qjh6I)Q=iDi0$J$0HJt!1VSK=$ z?Curo(RoyPu@uBY+7(?R1HaGZA|vwhYl1@jK6IHPhb|xWEA^}3sON^3-@X z?3eyb2&{e}8|9`>X&DkL!9-_2m||JI_i6BIk3=fwVGD z&YEC+?c+{6&yla@d~REll?CW*0P+;<0)k1z^522XZQpHg*-6>ig969NlTf{nwMNQ~ z-*{tb6kXWj6WNw*R{e*8FlHhUD->3F_%SJb&f)_D%MVIR={OLZ?Vsk(lN zl|`$le&5XfV*?pP0sk81_a?yAY*x?t?F=_xEnJDLxmq4?71bUF_5ntnIRxEK{mc}ZKg zCQh)bC|L0ClkzD?C|F_#s$A^B*o}ZA{LskIqiHulFL(;#?`gu}OY|V;u0JJb0?h~o zHMQ@bV6yi1b_e8c(Nwi#M#{W^ol=` zO28!tLZ;#OD>FroR6q2;r^e|%yINdYoXxls)D}3SwpBwt8!-nH_^4CTFDDQ-a_Pno zy-7!a&zcBJm8%i3f5=|H^IFnx0it`85taHsz{j6)=@Y5GSSyl`)pi;BC3b>VGilL4sCqj)zoe#CML?uYvF8K zbz*T(1d5OewEIR$#EC6tD`>C9CTSHxL=?NqAL}a;yT_9F?A0+!U0Bj;#KH5hVD74I zO2}y7lBMyIr6&>6|MpIhG$A48b;_?=H!v`;4P2ceyn5G5YK~!K7cEmIK&m14;lXcW z^?_aGMxkRdZkCJ*NWXbtwZAGrRX{M-#7XIu}T=G6+dPR9f+cInL9yw@y*T6 zAnmZ{F;7?dPMytOB2$6X*_mijGK~p&2k{r47$&uv{dpFcuS@L2`H68!ae~@CCKdum z$}vpddTLixmAZpzGnw;F~5?1nKKFl)BS5pe^g2(YRLMGG15d%V6wlRlhDgF_F`(k*e zsi_Hkqv&2t^qn~qWg5{k+c94PV3SEwQqp(Gmu~QnJB};@!Nl3eO|%<mjanGBD)$;tFEnlRi(RM8Owi!yo*+auFA@BOWuQxWOY*p zl2{;j6r~wqZdZFNj*S-$dcaC0-Dl^mP^Q!$`zRsn7r3vm4dcg8*EBp50B{AWGWV@%&x_Hq z@R0W2@Idy9zXb$y?pMC?XSkTpfc5Q~T~vRSe z1F7MeBJmz&=9i0{$xqz#<&)v1mqEwGqiLmGPDJ1#0)s^HvTmt5x)idkM=P;r?2NKT zdrZ-Z0nNOTlH%HTK!P0(@F$EkgNKClo@{Y&aO}iH`@CC0r8J9u`uH)G;H(QT5EPFK zz;PLZ?dU8XfrrTgNI&;leJ9SWBTwKH#)=5cC`+3fXG66@TUcbl7%)Du)i0=d;+KE-T zVZl(GAa2jj8qAhT+cD(wSJvcN=NNrDy3cHY$rE(E5*7C&*W|xqUwz4eu@RM6C7ejC3t*(ozqx(qWX7fRlaJZvz*k_$cxn^AVIp4Yuo0OE4 z%p}v8+P~palc&Y2+J|_dWmvm^fVA;Nt3bAQrrlt*fogMtoYvFEYcZGEkHHe0)@G5T z@4A8eOq}mhaov{JPV?O~ueJP)4q`%52{0L{eEPKYHQ_<(1h@oLiclsmBORr%$KhwV zpdgo*$9aBk8jTRo$-brE?AM49hNt?T&EK^O_1p(W@xcsdy(U{-Dhn`>dOi?yZ@vj6 zvgT%ql|d!d`}h8l?hvroJ4~uVf=QWj>nB?IHWj`<8HQ(T=*lr~>h*ahS{1mb=182F zC}pJINw?8#gZGi8=spF}$s&_jjnhIqf!|IbSdaR<`+pW6;IEO;2*!Zzz%0Sh#|*tU z!6|5D_IH*obo4z;A&F^F*-(Y%Mx{K&Z2a@*PhRA^#)3Np@x`k~ ztaQF)h5F?ml(;Oa>%F?)z4Pg|t$JP$24*4_E>I&K{2c(-@syTaDtW?+uxZ}3D4ezN zyV<52DlI`6{Zqr|M;FzOAp2kaBbiXwc9l!uxf42g&%knWauRuv%`URrN-QEGqNVTD z1}Yn*+Q3r`6Q}=toJTp|ztpM_cF^|J<%Mar{Ty$9BeJpaY95b`h)5|kB#XB57jNME z#54nxVykQN^$EM4^P}IpfwIvwzVo{hM4om#PPHE~6+RAGjRiaIXUwSo6a$o_s2?~n z4Wudvj?Vo1CPL}SNmcD0l8Y z1@!qY_lh;<^*0OR?w|A8pS|B)&&}zJZ1geeNE%Cy!b9l&bFHQ!5GkqWgEMY_rkJ99 zgrL4vZ0k!)I4%a7(f)6x)P^h>KVIgqw^Yk#)rAdRmoLCs!DZ_Bra$vvd=YcXV#E6y zio+tD{`&H`J9J3Jy`)jvbymdm-aX*@)(Sye0}v4kZL;(9Dr2_20#oh7vkp8gqI+MI z;F}wb)<~x7h`djk&_wlvOeZd>;4-r@3 z-n5+pD?d(uF`TN9ENKF|Tx(NTQeE0*f~ai9ha&w*o9=qb9zx*uz1ExS4hh1izUwNZ zzDq-rDx^w}wx|l-9-63*ron~LfuP^R{BQ$TZ)VF@VjIX=29hmKQ6sQ}XBj10^Bu75 z*L0oxO@@y5i>mn0HGoBJTYOl{o5lDL<}7?I{lOl+d5UX^_rhY?Hs1kr?x$2?k%L79 za9JebGv03-+PN6|Nocge>7Z$jD&@?Wh62PQq(5U))4}P|!)8x=oGPCQj4ldo;Hq@G znn9lgFWng8A>{I8KC#$CZ~8+%xA{L+$j#z__tDqq7(u&cRKZG=lxP&%K2dp*ka2er z*jH(ld}q=Ompk9&lWMG(69)X$h~2iVl31W_Ey`&QdWVy(tGT~u<*z$d5bGh7C5Sjdm)2R^{PPUeaXI6D#kzb@=KF;O1x|#Q!Vt zs{YEO74_XA{D!a@WcyWIObZ7Lt@@axRYCC5~h@Tp1+%vgRs`S1BkDQ{lhXCg1?*tX(5ySmj z!53^!XfNNi$H3k)LzSI6G44I-=jbu-6r*?bLHqU_B}cp_SYUh||E^^I@afH9{cq}( zBa050qImwO4X|$>;ixRN1+i^;M?aKptZ2MXB^O0IIR0i=P=UJ1*bAH-gtgUn+hquB z6ZY2VA2_1J95+XiPhYtLnW5wHXg(&&$3#vq?XoH*WqT&_|S-=^~{ zw`IK$j(UmCs=;@4sanw!6{R}YCdLlv>zj>&NGWD@pAcuyM#^LkSn-_oz2iz$WVCI} zJL;jR$wHf3v_@ESb7T7tjWXKBm`W2lT?U1^#_4{#IV}qj$KxDeOMb#~s;Q?ph0=51 z7p>`wRpGsys+sWphF-5*Nz7jb*B8j|j?>sH_pRcz{)qYn0 z8C)WpIiTXRw~)+dlzL`L_=GJlfy1IF9*h;W&ZC`YPx)U_66*rOlgQd(8`m3z1O0F4 zQc&z_lE=j<+dbhpSVAABou}&DdCe_JP6(*jd%>@0k*-73$!sh>GmIU<;Q1i%A|zt3 zEwoZk)I#nd)N;WIcVis^1?}tY8Eb0AOlr3GK5VXiUPTfZ)vorTx4OJzZXc5yveFs= zgP0e`dbiPuY2+9+AUX%Fbl+g%yHbl>?}=B6x;ga>@ec{n29TD=e#|s!h~4i6wQ3?* zxu~mGstbbMre$i5C(=}rwevHwSpWH9$RX2p$=R1}`*3x2wW_KrBUkun+66deO3UA^ z1$@Ssq!;byt_&mB>)-FQSH^p69qbO#2eT&uR@JN`7J)fj*Q?UKeoa>0&Y}1A3{*tK z;J9`>_rvyOb&g#T-OX)R1GPS?%1l_bUAr+5+?^a{Ij-os1A=4kG zP}9PH4h{~sX0Axz&XU%&UCWjl9Mfcv=pxEW6GD z=bt&Dxs#|376Rd&B5V?ToPefnNh)EN$;JJ{HxF$bgRFQaCni=sQ&&8- zj4qPYifk#R=u>!sTc&|X!NsgI7*_U14E_&;JAGGY3$#<^mfK(|W*Np?YJG?JTlb6W z_lAVXG5h_pH5!83O5Z|m!iuBRbAKuAc(DU?0qzg!Yi@-~Z7N^A{&OW3d8Nt4yfIG+ zVm3DrUk4B|d4?8;HXZ)}BwojjGOI9r)Fw|rIkqg7{J4U~-^4b8V_eUWL* zhYpF=Yi+jM<@wg}{CdmenAfK@Kyv7y1q3Fib{@=v(S&H zrB@sXi{A}LTS-YtzeJy|o#lh@1kqLLzK#57C^$F(MsAoYsTu37 z{`dc^Hm5!1^Obzx>J)h>4~6^o>#cZf6wNYAt+p9=Cv*CQ_5K$!zo>?$9XoZ@@`dmq z%H;tb%FT_9`pp?3K1Za_{&KgY_Yta~#7~Kb(!PI5s?u!caFO5 zIsZ9pMLscsd$D(B=qPa6@|6`R`4x#%{$b^%v|Gq`E=AUQqE5#WnGS~k$uIxBv5f%G9Zf1R zd*T%v{mqjVBWLK6VP(DsbE4wbY{Qx3f+P?NrwmM++z0v=B6UVz{WQ~&ze@KUB!3^V>Q$DUTvo-jRLz`!rYi@?e-HcT} z=fB1Hfx`BYyzAd_K>SVB7R>H87Bh~zbd@B?S&r8c5pfO_r$$zXdoA2;H1y_?yR|(- zepWkyFE{6@X`I*?8{H-^f<5*Lg#%U*1J9%B1cv zMY$Gwt4|>ca+QVQPiE#8MWo^lMr+U?zlcHo{$dEZO()bsmv4#5Utm0c!HoS<(sja| zdVRJZd79K^CZ;$t+ME5_@N5!wN!4bXCcL}QdeY$b0QewJ)$+c|l8Mo} z)r-sFQZclt>4Cozyrlb-vFg=m-OE82`7AU0^PX~I@5Vf~fgcl_w{e<7Z0*s|&*)Z_ zhce!5QHKs2tH9LOc_=95TmSwuyy!&4H+Kk@m!!P;WW0H8vbY7%dk2Y@9UX>h@mAW; z6J%~}I`TGtNA~D6)4OO$P75e>HydkWPaNk;=C_PB^l3g;5+t2R zLpd>Q#G4~>@u7zv)a!H&@kw&gp@$(MN)b9h4?~A~7pD;CB1&a^F>jx#RoU{Z%^K=f zj-~r;R46FsKC*0?m6aw}B#5u2!Q_oEp~2(?=u8~1Q7it_4XkRqUtdR{SU5PSsH_Zb z$lPI|!;&un1iy4;J5q;Y{qOa{(9@?8YonrLT;#mc>%7i$Loq-mAiyUA%vzX+`G zI?hhd&TgGu9v>fr-3{>Hg9F#`GhCgysyZrsj0Sfb7z_PkMVx0WQ4Le;4Lv7!DShT(TMu2wd#a%d6q^Zk~w%d^PsS(nSMIU3JZBW41;8*}(G zbPBi+NRt(5m(2qMvb0LsY9@}B-?aUfWGBZA-52#r%Dc)+kJKz>{Z7a1y+0H+?rztO z+6x_wU#XiY%Bh2AM$}b{!Cm6uuWzvO3fdjdZdBvEg!DaYneD^`2EirR+ZI!Mo)VilX8n11-t8!@ zWz={&Z&bKwe1idFd2pzS?@JSwY53msc-=|sSLnrPF>*9p(qbn8U_UY1SomE2*1cc7 zOy+Z(t#+hU30q#9Lf2dyCi^tY>f7;ge(OKpyvU`-J__R7+*v`kzdseog+M4ZuYbW0 z_C3A5&q9fr-cavc7d+i(+{WS?&zJgqmbt5Ey=?P;&K?%Kvl=0VJx&j3FaOX|R?Rt! z9@X@Lb7RoQfHJC~T*=ci^+eL%k7_5R4_*Vhl8*)Sa$0qp3gp>{Ql zhEu_XlZ? zUaRX^Onx2(V`W~4qkW_G9n6X2d$Zk_eZN;ie-bDI)MtK?c$14KTgdYeK>{--aBuyy zGYblAeSGTw>e<`dgUz`!vc}^!SsG6%DH_kk7_f*0wsU3(!12Iq1vG*08QQ@2aD+hY zd}rP0>Xd{<^L!%hVxk&(ShVf4B1GqWaX7X;T~prBZ~V-b;&B72?m1fs{r`E&AiCvl-J zeSIed3Q@G8N7E}tyI&o#uk`)e9Nmmu3#|2^mwSAutxFZQIPHeRa>h|Ay$_x?r_;N% z^#u*vZUx1cnO565ttTS6X_r4&x$CqXFAA05(O?DAeq=GBZh>D$8nIOBdeH(qxl zS+=C5M17TJ30&rOg__X~g7S{FZvJN(NeNu|wEu+c^4G+1Q=_-G)HSAd8ZWm~F8FeD zl$Fyist<+y{0`D);ZMX~fy8)eGxm|X11RO5taEBB*xJx`mz}c5Nb3~4 zdfl4%}$^`{P5vfX7iqt42bUs0Uc55q4ewFCe~HC3x3!PcXN05JDlOEKQRN; z?f)Lb&e|Ej)Sn)6J%3F0dJ6JWz?dv z4>{yd>kGbT3(MvUJmq+QAa~`moNScCJ^pLY?$RMVXtO@oG0WG*W% zp4CbHTzM{o%`S@LjSjQkz?Vr%f7O|w zmkO2cNVCW;OC6=-qY9AQLr_ul;w7bz`$6=y=2xj6NE&c4gmzW*o@;Jzlydbc`0Y?s zrpbJ$6|=Uugp&C&V+z@8{h^6qZ0CVO@yo@lD%IudSTduJvF~&ANLq{t3w2BjH6`V9 zXJ-TpcmYa)p&+wC(ct4$gQBRgFbmWQLf(g$nQFpwCMqZ>2qF@_UpL&+S$@U2Fh4*4 zBsDWL6D>P;8i{p(rz6NLmD)LCpsU+&LDHw>y?j_O@rhMyi4f9{rQ|iSw3tUzK!>dF zNhp6zlNWk+k-uJ}o^Z6F+)0#QnSgBi%=m+bMU+JhDn_*os>6k8XWs-~c?Okw5~aIX zWxvDf;7N}mQln5TEoQJUYoP?5?j9VVF`|(9uxwMddes=y)O!AOcwpQm-9hWU(-bKr0Xv_HA*J1AVh-@+%c_vJY z(JIOLorEG<>!^P$o2KXeaYtHG^oqLx>z8?sd!<^r^FF0mi}pW-$hY`L3kmhSzVVC< z1uvJ*l$*fJ5vY=t1QyWADhHN7cVvMO88_syW_IV!nb5|wXU`@p`4Mx(pOhGs89Aay ze!1*p#p{=A*5>AR`|gP|sKmv^4cHU%?jcPetq{vM5fLMwe>~l2j^c=qi}My8L)?2m zKeHX|{BvzhSK&yi`)*qXjN$D%51#5FX9h8k@8vp;N?7N>@~6IKzsz;kAb%#IH;;Zm zDCtTQwA;W1?qB=SUTSO-!SsAlCdDb{>N*JqCfU-e*ZA?Q=!iJ?4Mk2w%!4$OHHK%8%8bhHIN%G6fnaPIN zF-nyqjv#k1EqmIuIg1s(dez0nrQ(SwuN9zNB3ML;AXlh-vH~<(RxU35N)vDeAlegz z%zZc1TwS*kg$<{tr-u)KzmSHS8jHmOlEw_|K)4IJwQZf9ovp3IP_0ju-qoYUB2=~W zyZ)%h9$3R8w36_0yHRZSEcRdjO=U7Q6WbLHeCM+BX-;R_ zjZrd>#0q(UIe4h;_q}@lAfrfqQ6&0M0M2~+K@}T!MS>$jhLh!4;!YomEWcKqN~?m6 zTk3oXZ;+Av(m6V)UQhhX*daco)G4`QV&jKq^>IR@vt_EYLh6*X-D^^UC@n_`Cb54s zQn&8V?iqmrmzm&FI>Y&(tgOu1+B%3nv~em;TES&~-xu!j4{Q?DZ_aCS!l1Sf2{jVo zR`&O`v-?mbufif`!p6mwo{m@4RJ8xykqporUv7=1hX|^LNt4q16C7Q|Y}v$gvI0`u z9qCH^n9{&Gf^J73YEit-!4cv9>r6g4?F*WM?DG_WGn#pQ!X+q^ubYX6W(<_4;svz* zfirXX_C?e)HxDPb*Ej6Jr%DzN^h-LWv*YaO1OA9`lNzod>jnbzhNqbk7vgYl0~#J4 zK04S%nb#jL4ig>n?XC4h6n9w&?J z74Af#o}Z74V}yHHonoLU5ah1|h#Lz&m$O;?Fu!s;rbOSCC=$-_hlhG45M_pfJ3D7c zSO$Ve0(X`J@v*$p&f@~_nsr4JCw2-X$W8<=*thtQ?83!G`}nqmw{Kr9 zz#mj^roW4RGMnaG+S5JicY#qwqjfKM!ieU4BJwlAm7m{`KmMFwOEonWmA#{*73%I} zf{qw+X+;bS+W7F=&inW8xw}6D6RPDcodf_?%gb6?TF{NuP9S=WDzY;q{l^$s_gE(M?=ZHh>Li$Z zECA5jphre)x7e!}9t}=u1ZePR^05qect@azT)o(fOjq$S?O_pZ@o?H^WAdl>e=HrT8`==Sal!R5$#U31F}s z=D#Bh`zH8KoJ=0MB1WbPZPeiZ5R|Z2u}yqc5)F~2&v(_GI72QuGHw!lcZ)VRHe%H; z^Tmd>%xvuYs)RK?EqhYJAKzvn(Q`wwhl=43cMO9a^U&qrRtYnGZX0+(nmkJ-i;|L( zp7Ioal{#1@>*4&;5(hoKg;XkN1aCi5k=n&Se3VWBbVqk4)_dS;<=w@A*yh)EJ)Kls zw4qx3)U>qzH>i{}FVY7E2cJH5>UrhQogKuRY@+Y!zcCH72#Ra7vb411?1D)_3{=73 zSK83V=Qnm9v!%A51QHAusmd6BSwX?~mfhQ?sTX=z6ZNjHV18K~fEy)F+P`WS>7k&| z&|TY~wlRWlsHmx#sDeu)c>kpO;ICy$Th3fz)bKrNH4&D#XhWG;SbkTZFaATO!Cvtq zGcs0dy1Kh}?ajH#!9-nVBQBeUbKRX6Wf`YA0>X+{Pof2;H+1Xi8AFx#uam9}t zXI*4DyMDFB?=FwbG^7;VPkk2`SME9oJ&-#04v9pWVm=oZ7Ut&uIBKWkl(|JYg0}4j zKt;==l!ip&2n&6A_wev(o!FPL-G`1LE|HIZi(d(Pu=Sj~Nh;Z}X0r z6%rEC(9jUj&gkgsvRUI)_E!)Puw5Pd3fw%48y4Q&F#?I2KJsb*K@(&_*_kRWe)Hx@ zNvn7;=YXo^r>BhOlK<>Yu&*`aVPte6ZZClCJ5ADPF5v$6{nJK9nf4T(hSgjo$B0@sp(b2RtG##CtqT=E_s=L6}s&8tF2Wk>0 zN3I>QHTKe@4|*RUy$oe&yfcP}i3#nDuhv%D4~hz0?p(s5>On2V1M>cr(JFi~1O@=i z2CDv;*qd{A1#v)s<(5ElrsG0&6DKVJuZ&{hmK*%pqe;0zM=(?iRYo2!Z(-+Vos{1@ zth)Q#DDMM)YiAxn?OHwQIEq8Mdc4MGcQxoN6BHO2__3(S$M>EH%cZ}8=h@H{!FpX% z^6==$*w`4%TI7Z6h~?p_7cwB}sPZN(c64Y3tHh?JVjM@xzkmOpo12@IlvG?SlJzht zJ>AsAtKKBwOSz!)aeh{1!k?LC39i@1AjuXW4aE+OR=;JXGU_ z#yd~cL(t2Y*LW}Aya}E!VOI0o8L?f34)u!+%KF*UJqGM6Rry9hkb&vhS;eeXPpJC) zAFqpOMn*=M?7_vk4(>I)=Agrj!;76Ai=At{tF0WDlW-G0gy*Yep;cGM>{^>HY}=ss zzXwy}oxv#_CKVGAX16k&AoL&T(@U~PfsGXe4~TOnfd@B|wSck%Of^mp4%gXe?&Rp? z^v)B!!&Ox%g~Y_fgoMgQ9MjX&_4W0EV~37=TaG%`G6|%23@RT#ek3C&r@+-xvx?>B zK=9e!NZH?-ivf{W zUf$PfP)$Wgr>(C3#cd(Zpom~m8ALxj+ygx(Y!;-t%AZTGbD8+%)t{NNqZcMOZ2x&k ze*npnXe#eoyNMVCPZ&Bq{<@}ZUST(S20!%b-ODb(MK(uXFf28(0}Mh54HCOjSrXtu zcjDxM!Ol#MeRZW~5fKy=RKI^;(Pu}*r{BJ^oE3pdSLA)AcyDsh&|JT0(4a{FgI`p*yhu0Mp z6oiEx0GO~xh0wc@j*kFwgtwJwB}3zaak0nupEJ_~>j9aFGcc z6o*Acfu0Ty4wmAOeE$XYeGQGakNQR58ylIJm;k*rnf)scT#W!B4t&;XZL3D5oqpa> zz|XjRWr@gJ;tH`eQ4KprKPfRqM>RbisdjhJ)nz&m$n5sWf2wWS@19vuMyE2qLmos= zvZ&94i;kdW4JS4m;}m|Xo6Gwg5l8yI-pe?^MF}IE_A2VK$J1{NYlFUR{qDqo00*?H z3F*ZoJBYoL@&DFSZX^N-SF>^}4QuPXr4Nx*!PCH;hrlRGO1dl$m(`}L&fVVM-v`mD znOB}Y-C_*~KeMtLj;3x#-Pr=kusq4_&g~(vp3`RXUJsST%gV}Lx9MobVv9;j+|j?e zd%3n7NOC{&Z+pEu#F3IUDBIeI!#y@KUeJ2x&D|T0eD3js_U>hoZ)ab~Q1SvmTheB) z7;&ssRQa<}!q{8@4KP}6O)Y=DKNvuU^n~wqUf!wWqXW<_kdS{YE>2VQK|FoRhr|*# zHY}@_e8HI*g<7`jXbKNcU1Mz@;$Gh)3(-o?-yjG9ee`L?Fp5^t>T=mX9&${3F0gXl%7k4z>kvuAX z3lNliIfLRyb8|UKfRmO&O{a0<9~`J6t1u@UoU4CTOLKE|eWncT+rz@%0nc3SO3js6 z@0#a;q>tynPenxq{j9Llee#4I)7imuydF9R*0VMThO%=B4%S)NXqY_@*nSh%QZXG0!xhA&}imh+1U^G{0NVP}a4 z2WxmtRc`L(ix=PLH=F;zR1TO`{`)CbRioJU_9w>1ipH{PI$)lFkrRQbt*fgmE{-%Mn|lm)ApmR& z-rMu*k@U2BB=W4rsj$dM=7=V-_T{m!*X86==*yq?@&UNa&TX@DxyBgr=l&3&-c&qU z0bL0xbO~+Ld2-U^R0$9|WF?50bw@|f)fN3@WpOTKad8o(_tn*M=#k}WDck|u|MMY{ zGp_^k?O0z2@%ZmeW&ImURA}n8lKjf8%=v3SF+-AUE&^oPsq1)f!`>wSo9xA$@MgNYGv4Kb)c;kquuBQO&x?zTt=RHOCGKncRWH8RqnQV(xn@>!^SwXcK&}L;1hvOF9Kyf(gcaq5))-e5-lYd+KgcU?y i6er_2N%aL-NYro7`k@1@!?wUXMy{E?UH-@I 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 diff --git a/e2e/playwright/test-utils.test.ts b/e2e/playwright/test-utils.test.ts new file mode 100644 index 000000000..0d0521084 --- /dev/null +++ b/e2e/playwright/test-utils.test.ts @@ -0,0 +1,96 @@ +import { + runningOnLinux, + runningOnMac, + runningOnWindows, + orRunWhenFullSuiteEnabled, +} from './test-utils' + +describe('platform detection utilities', () => { + const originalPlatform = process.platform + + afterAll(() => { + Object.defineProperty(process, 'platform', { + value: originalPlatform, + }) + }) + + describe('runningOnLinux', () => { + it('returns true on Linux', () => { + Object.defineProperty(process, 'platform', { + value: 'linux', + }) + expect(runningOnLinux()).toBe(true) + }) + + it('returns false on other platforms', () => { + Object.defineProperty(process, 'platform', { + value: 'darwin', + }) + expect(runningOnLinux()).toBe(false) + }) + }) + + describe('runningOnMac', () => { + it('returns true on Mac', () => { + Object.defineProperty(process, 'platform', { + value: 'darwin', + }) + expect(runningOnMac()).toBe(true) + }) + + it('returns false on other platforms', () => { + Object.defineProperty(process, 'platform', { + value: 'linux', + }) + expect(runningOnMac()).toBe(false) + }) + }) + + describe('runningOnWindows', () => { + it('returns true on Windows', () => { + Object.defineProperty(process, 'platform', { + value: 'win32', + }) + expect(runningOnWindows()).toBe(true) + }) + + it('returns false on other platforms', () => { + Object.defineProperty(process, 'platform', { + value: 'linux', + }) + expect(runningOnWindows()).toBe(false) + }) + }) +}) + +describe('utility to bypass unreliable tests', () => { + const originalEnv = { ...process.env } + + afterAll(() => { + process.env = { ...originalEnv } + }) + it('always runs them on dedicated branch', () => { + process.env.GITHUB_EVENT_NAME = 'push' + process.env.GITHUB_REF = 'refs/heads/all-e2e' + process.env.GITHUB_HEAD_REF = '' + process.env.GITHUB_BASE_REF = '' + const condition = orRunWhenFullSuiteEnabled() + expect(condition).toBe(false) + }) + it('skips them on the main branch', () => { + process.env.GITHUB_EVENT_NAME = 'push' + process.env.GITHUB_REF = 'refs/heads/main' + process.env.GITHUB_HEAD_REF = '' + process.env.GITHUB_BASE_REF = '' + const condition = orRunWhenFullSuiteEnabled() + expect(condition).toBe(true) + }) + it('skips them on pull requests', () => { + process.env.GITHUB_EVENT_NAME = 'pull_request' + process.env.GITHUB_REF = 'refs/pull/5883/merge' + process.env.GITHUB_HEAD_REF = 'my-branch' + process.env.GITHUB_BASE_REF = 'main' + const condition = orRunWhenFullSuiteEnabled() + expect(condition).toBe(true) + }) +}) diff --git a/e2e/playwright/test-utils.ts b/e2e/playwright/test-utils.ts index fddfc89fd..226dc887d 100644 --- a/e2e/playwright/test-utils.ts +++ b/e2e/playwright/test-utils.ts @@ -55,6 +55,18 @@ export const commonPoints = { export const editorSelector = '[role="textbox"][data-language="kcl"]' type PaneId = 'variables' | 'code' | 'files' | 'logs' +export function runningOnLinux() { + return process.platform === 'linux' +} + +export function runningOnMac() { + return process.platform === 'darwin' +} + +export function runningOnWindows() { + return process.platform === 'win32' +} + export function orRunWhenFullSuiteEnabled() { const branch = process.env.GITHUB_REF?.replace('refs/heads/', '') return branch !== 'all-e2e' diff --git a/playwright.config.ts b/playwright.config.ts index 56f61628a..48ef63bf7 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -12,6 +12,7 @@ import { defineConfig, devices } from '@playwright/test' export default defineConfig({ timeout: 120_000, // override the default 30s timeout testDir: './e2e/playwright', + testIgnore: '*.test.ts', // ignore unit tests /* Run tests in files in parallel */ fullyParallel: true, /* Fail the build on CI if you accidentally left test.only in the source code. */ diff --git a/vite.config.ts b/vite.config.ts index 038bd0191..d4f918055 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -35,7 +35,7 @@ const config = defineConfig({ coverage: { provider: 'istanbul', // or 'v8' }, - exclude: [...configDefaults.exclude, '**/e2e/**/*', 'rust'], + exclude: [...configDefaults.exclude, '**/e2e/**/*.spec.*', 'rust'], deps: { optimizer: { web: {