From 47d94a6fc4f2175a2101f983dc19b9fc5d35d85e Mon Sep 17 00:00:00 2001 From: Thomas Bouffard <27200110+tbouffard@users.noreply.github.com> Date: Mon, 24 Aug 2020 14:54:16 +0200 Subject: [PATCH] [TEST] improve 'events' visual tests (#543) Use a BPMN diagram that contains the whole events of the BPMN palette. So, we now test all elements that the lib is currently supported, and we are prepared to test remaining events to support in the future. As the BPMN diagram is too large for the load method using the url query param in the 'visual testing' page, add a new loading method: - allow the test page to load a BPMN diagram using a query param providing the url to the file to load (via the Fetch API) - copy the file from the test fixtures folder to a folder that is served by the test server - pass the relative path to the newly copied file as url parameter to make the page load this file - update the 'visual testing' page to display the BPMN file fetching errors In addition, refactor and share functions used to load the BPMN content in e2e tests. --- package-lock.json | 6 + package.json | 1 + src/demo/index.ts | 57 +- src/index-non-regression.html | 5 + src/static/js/demo.js | 2 +- src/static/js/non-regression.js | 9 +- ...-ts-no-visual-regression-events-1-snap.png | Bin 43460 -> 36062 bytes test/e2e/bpmn-rendering.test.ts | 62 +- test/e2e/mxGraph.view.test.ts | 6 +- test/fixtures/bpmn/non-regression/events.bpmn | 586 +++++++++++++++++- test/helpers/file-helper.ts | 23 + 11 files changed, 705 insertions(+), 52 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf9d0aa5b0..58d8379806 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1514,6 +1514,12 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", + "dev": true + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", diff --git a/package.json b/package.json index 24517e9993..a93dba76df 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "devDependencies": { "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^8.4.0", + "@types/debug": "^4.1.5", "@types/jest": "^26.0.9", "@types/jest-environment-puppeteer": "^4.3.2", "@types/puppeteer": "^3.0.1", diff --git a/src/demo/index.ts b/src/demo/index.ts index be0a828f71..f0647860a0 100644 --- a/src/demo/index.ts +++ b/src/demo/index.ts @@ -50,8 +50,45 @@ export function handleFileSelect(evt: any): void { readAndLoadFile(f); } -export function startBpmnVisualization(container: string): void { +function fetchBpmnContent(url: string): Promise { + log(`Fetching BPMN content from url ${url}`); + return fetch(url).then(response => { + if (!response.ok) { + throw Error(String(response.status)); + } + return response.text(); + }); +} + +function loadBpmnFromUrl(url: string, statusFetchKoNotifier: (errorMsg: string) => void): void { + fetchBpmnContent(url) + .catch(error => { + const errorMessage = `Unable to fetch ${url}. ${error}`; + statusFetchKoNotifier(errorMessage); + throw new Error(errorMessage); + }) + .then(responseBody => { + log('BPMN content fetched'); + return responseBody; + }) + .then(bpmn => { + loadBpmn(bpmn); + log(`Bpmn loaded from url ${url}`); + }); +} + +export interface BpmnVisualizationDemoConfiguration { + container: string; + statusFetchKoNotifier?: (errorMsg: string) => void; +} + +function defaultStatusFetchKoNotifier(errorMsg: string): void { + console.error(errorMsg); +} + +export function startBpmnVisualization(config: BpmnVisualizationDemoConfiguration): void { const log = logStartup; + const container = config.container; log(`Initializing BpmnVisualization with container '${container}'...`); bpmnVisualization = new BpmnVisualization(window.document.getElementById(container)); @@ -62,7 +99,7 @@ export function startBpmnVisualization(container: string): void { fitOnLoad = parameters.get('fitOnLoad') == 'true'; log(`Configure 'fit on load' to ${fitOnLoad}`); - log("Checking if 'BPMN auto loading from url parameter' is requested"); + log("Checking if 'BPMN content' is provided as query parameter"); const bpmnParameterValue = parameters.get('bpmn'); if (bpmnParameterValue) { const bpmn = decodeURIComponent(bpmnParameterValue); @@ -70,8 +107,18 @@ export function startBpmnVisualization(container: string): void { log(`Received bpmn content: ${bpmn}`); log('BPMN auto loading'); loadBpmn(bpmn); - log('BPMN auto loading completed'); - } else { - log('No BPMN auto loading'); + log('BPMN content loading completed'); + return; + } + log("No 'BPMN content' provided"); + + log("Checking if an 'url to fetch BPMN content' is provided as query parameter"); + const urlParameterValue = parameters.get('url'); + if (urlParameterValue) { + const url = decodeURIComponent(urlParameterValue); + const statusFetchKoNotifier = config.statusFetchKoNotifier || defaultStatusFetchKoNotifier; + loadBpmnFromUrl(url, statusFetchKoNotifier); + return; } + log("No 'url to fetch BPMN content' provided"); } diff --git a/src/index-non-regression.html b/src/index-non-regression.html index 4474b2f8e7..b54272a786 100644 --- a/src/index-non-regression.html +++ b/src/index-non-regression.html @@ -13,9 +13,14 @@ position: absolute; overflow: hidden; } + .status-ko { + color: red; + font-weight: bold; + } +
diff --git a/src/static/js/demo.js b/src/static/js/demo.js index dae259ba9f..dcf7cd2d5b 100644 --- a/src/static/js/demo.js +++ b/src/static/js/demo.js @@ -22,4 +22,4 @@ new DropFileUserInterface(window, 'drop-container', visualizationContainer, read document.getElementById('bpmn-file').addEventListener('change', handleFileSelect, false); document.getElementById('file-selector').classList.remove('hidden'); -documentReady(startBpmnVisualization(visualizationContainer)); +documentReady(startBpmnVisualization({ container: visualizationContainer })); diff --git a/src/static/js/non-regression.js b/src/static/js/non-regression.js index 412d4382fd..55afc3b861 100644 --- a/src/static/js/non-regression.js +++ b/src/static/js/non-regression.js @@ -19,4 +19,11 @@ const visualizationContainer = 'viewport'; // TODO: move to UI initializer new DropFileUserInterface(window, 'drop-container', visualizationContainer, readAndLoadFile); -documentReady(startBpmnVisualization(visualizationContainer)); +// eslint-disable-next-line @typescript-eslint/explicit-function-return-type +function statusFetchKO(errorMsg) { + const statusElt = document.getElementById('fetch-status'); + statusElt.innerText = errorMsg; + statusElt.className = 'status-ko'; +} + +documentReady(startBpmnVisualization({ container: visualizationContainer, statusFetchKoNotifier: statusFetchKO })); diff --git a/test/e2e/__image_snapshots__/bpmn-rendering-test-ts-no-visual-regression-events-1-snap.png b/test/e2e/__image_snapshots__/bpmn-rendering-test-ts-no-visual-regression-events-1-snap.png index 719381e256c785b5a43019f57360d8566632fa1c..e6e78ab03083ed84ab1b0958ae2dfd5837da7a25 100644 GIT binary patch literal 36062 zcma&OcRba9_&0uxknAW~NkaDCJIY=~jx9Sv_9kVAB722o9b_fDl9a7eWRsANk*w_d zdi&hp-+kZz{T`1VpU-j5d9T-aUf1<}KCcs_r*ngxlz|k5LXoShsTiP81gt0&zA*_A zyp!n@?hgOM^E9}jjH>KsT0)^%QR*s6xBRk~Cj+z3ZnY{Ljf9)gx<|&5Sfs106RFup zq-a!R(2ak&t8Mflpzw15hHuL{dCO?uFbgwcVwzkrhV^vO9v|X+TvVwV%LIjZJw@tZN|X9X9X)8zRhEy zkMuT=w;n1L>7f4mV|nl$9?5?%G1Km-_wX@%2PeT4CWw4h=;IzaG3$SaRflx^|Np9| zap~DXOR^5dn>WugQ4rrUJcaUWwLpcHl?{sW;qJq`_zzGhMXac(xcGwXwx8^)Q5RI$ z-rinzmrn87*a8%)V2H~_+_WLF=aP1?IswncX5Y1s<8JNohUG@qT?x!ZIy#BuEVA@B zi*-6j9rEJW=ep9QrI0)2A(B>kfpx-Hj8O^C*5Q=O(ZSU#vOd|6+$dCMr^%7mVW%1P z%#ouY#2>aP#`?eQnt$@L?Zu@WotvTzSB#|Z-Mi0r^f0q5W4p7BU>} z%y*}}*_jHwKO1rWPWQ8`MLGsm!3XPI#`SmU4nh>X%)82~+DOrd8{XkddXM*qJCi2X0(QvbzBD%vm6EvRqLFjug=& zxcSD5cCkGXC#yY!NDFnRcJvMLqmw_Yg(a*at*ZYPagpwX|F_0b1SP~DFf)H+HRm~* zDAJ@)|925BxX1_GR;u)A%o$m{oc~THi9#M8o@R?Nm*9PD!s7qlC)lthy!HJHlh03!%;)shIa`iu&m!S{GLPf;owl+v1*m^{%a!YtaNBiYr> zsO41F|490985q*>@$n6c_66wZ(@HW?L>Cype@2&TP4DRFs3^-aus5~#n78LoK1hLl((GsS`*qE0uIdIi|_74lVNC@#yxt*TNrTl1IT3Qwx8A()9 zM%p2WLWQ#`(yG?g)fulP+g%80zsQnUd`q1#+FkPT-d+Gt6>*YA(ag?1HANIP84=~) z0nAK~Zr)-T;X|eGD?X2uFTFA2XQw$$MIB92R%X)9nXC?Pe7GZY%gCspt*wn}$$=OT z#+FFBLs0ML&4<5#--X>wh>r*VrJ^S52z%+o%J!=%L5&?hsspcTzMj!c$|#DCG=f## zU|49#kv1hIU z_SLL2QHkpnoot3{N$k$w4dJs}h7qhJPwYk+>|Z!B+^MFA<5cuj*lCnxS#Ai@Kbl^< z!JVSaPIL8s0)>`7t*C^AY2qm*MM5zyuU?_9XVMo`XLt5L&$`1asV_^S zF$HS;X>rlf%K23Ak|L^beC@jV$mhikYLrLwEN;IOMJi!!JR(yN%8GY84%i4m6b6mYRIQCvP3cj>9x^QNXTlM7|9UvG!;sHeo1 zl{vb&)UliiM;RJ!G*N!4aoM8DU|?XVIVS`gTHJk$8zpqRnUoN}mBHs5bFFDxl|-JS zXsn~C$rDl7tiBM9GPANOQjUM)aMYv`0pFhd@M(UkQS?NoxFTOYi9NrvvNHPWfMr)p zY1vqDer*l!V(;bING_ON(M@jD>8K9Yg760W{lgHF@WJ9NUG5a_@zjoM=8{Ycc1fdQ zcla+k*N*C$nw}}fW{m6<^x0n%q_0a|jlW)~XIQ`7)?-k5YdGmQ>@?Ohnq0B?X+3sw zt}ZS=EvVoEgm8hF>xHnZPvr^n$Fj9p2&D3&lXj#Ktie$(*q6g5g$1|d)uh{61+O8( z*4Nh$C(OKgmbd^8WB_~{c^CXPOi5?D$l1EyT$ddeI{BLii!&lxM-gpFv6S!A~`0+StLdF_R}K6+R=keifd*eX6?)j$}KG_ zy0W$!oa><12El+pn>!^O;F6W()b5lJS%=Bb4yH&GICoozZD4>-REPeb4FEtM0XYiA z-Yo0tR5ekzAG<`-E#p4B28Jn7pQ`b$>C-wJyyopWby~64GhOD9LnWyp1q|dJ%wUSY z<<*h5aj*bqVUC43)z4j9_>#Iiqrq>3QLyE|;L4vdK4NXW!2hd&%S3ZOHMw{5g+Xcf zc6hpGOV(at0|YH&r>(n4NL014v3b`#L*AhXFGeT5(AIzcNQys!kyKBjqKJaLdcpySQ4)perstvFQ$DhI9M)7{vxevwU4SmL&{4C zTG*vJ7720jb3gZu48LJ6nFDr2S;3@VdVU)(nk)9t{$WW~mB4rR;#=Gi5PAslAIMMo z{m;^Ige4AHCETuc?I;xqq2BG=QII>bHwX%FFk^ zGUjR&0X!#fnKdpTLu0)aaAC?ykR+`qA~Q2nz9H;FNRF$1wQ5N zfwQTx)09+JM#9{|8e=6X!C)Ruy57*%CI<}Cx3o-z^$#)g&gQS7Xce~T&O2~O^z}lx z(TJ|OtIdrUnNN)_2he!*lP>H8S!cbZ_0i}UWcYkL z86zJ+3@=|qCT{1*ikO&%rHhDLRsVSzchct<-!}5gxM^YtWmzbrNuH_^=IfCxc`@*( zoq^YxFO^d5zJC3R3`xG;ujivYH(*{_KM0aR7=~ymDk|#L#Fj4gb=b9`u(FchVLI{Q zl{JXWq=n(pB?6qVh~NfGN=m{;a1rAx{h1g?jUod8Z53ITs7f5HhhP?;l+R{OPZt@U z<@L%@7~h}p9FX(-Hyc&$gneniSv2$e_wOfa?A=Z0`!J6L&^3gy1prIF()nY8WTIkX zXt|3EcTI@LyLB^mS7JwBeKntZ)-^Xf^HAs`g;FquV%RpLmL$`4QHDPBfShNapL)`B zF4FLKR`0s@Jg%fMcT1wKQZC#z&Y<(m>Lb#pt^Km*E(vK)Pspcl4<2<`!-A`WVDnqj zb87lsZYbc&?o~BZ($y3VC2SogtD?_-PKx0%9W^oQJPb^>_CBrZgFbskz2u5Mq7pw@ z*A=R1y8rT-s*#>+ZWnBpsf_-h9#tp!`I)WXN4@WUF#7LnHKv!SW8e3BBT4l86tk1G_G9 z$yZ-OqOVe@uTnT97moo!#eQv;6Oqz%v-R z`+pw!+tD$1a-H-T0xBb~|NH2Ivb&|pZ~waqnJ~EQtG}JCH(}@?PxJH?fi&=?6AA^h z3;$p$^l3G-mEnHopU>b$pCsc-un(>2sZ^TsA3sahJWCE%I#M+T@+B`Qlvv-5SyBM4r5%6Z~EHh!AmFALyD_)2_reY zJyfdq6`yI}n02R*kB=wLUW3{M08W-gSD^@=&KO;QKj@tUnce3aEmYG%^{5Li8Ik(P zmh!$PS=f>T-{1(4O%+I zB0LH)D(?gO=GJZH_|MDnF*b|`>!rnCrHNts6N)JhRDvYX`!AA*spX~3l1FvC8ebua zPzHnpfMG4j&NJpE0=U%UB80RUFr)2giMOom+&va#gaG~Q?5=Qgb9;mU-VO~8T9Hd} zN!ag|mzPs^Z|+1|)0dQ&KLiY8dm7d=uPmI=+sNW=euJInLB}kz?cozy76I?S&35!e zfbA76yFqQP8yqCzDGeTZm+cn#YSVaG5*_9>^=WafnJ@F3nvewCuDaVqw}&G~=Q2%9 zSoF+R0Kge~+YU=tH4-;AHrCQ6A*y{1LCxR4W1k4agxU#Ae}bg;Z$K+y7z}b^pqQ6= zu_CKgJ^r~ui5Ggk!&)eI5`2GI7Dxwa<2t#Xs_F5bD^z4vgcwDr#ESa470|<>%Zy#~ zXbgCEyXW7?;~01V{6@Jym-Y9Sz_b(P0gDW;6vE?x}}LkR!m&*$O*tv8Q*X zWZ4R<7jW6n^JQq6*qtMd!0bdSUyALTQ~8=38r7i$NjLkF_?2Y!no*Zl{wx(XeHexd z<|8sIE2-=;_zx6|k8zN1Lm*O5`s(DS*BImgb4j08J?RC@Z3?!hB=AWAS89+SERr6c!zA{nT(PGrsJ6QPNY>Ke+$Eu0 zNUFsB^l7fpNWdLYhKcRb+lHA*})RcRBs`vTy;zo+3L?gR;&EM-P zKR0$Ur1!e=jqIOu#TJM?Dt(qRl3?E4j3p&LLqMc`-dH?mNm5jY>Jf&uS|)>B zFGFE|TcHb*)i-}hp{%7m9X_~78Y-N@u0#b1>&}v_N<_uaObNBbE-cQ*+nf`qjxR=i zYV2QdxmR!6?**Eaa*2tsit{{xy>M55ji2hP_hi{YM#ZZIhui%ABi?f5;aL}qeI$sL zN4(2xT(`S3{CT|HC-l2m8oZ<@?@fJKs@r0I=I<*OD^6-()VOKXWY6_CKOx!pZ z*NMr!Ua(F20%qZ&eOh9#tej+-RCESz zSbiBpQyEnHJ3wA;+)Aq0d#+uXk`79J_Sie0yYR9kzAM*%fTd5PT5Y+YKy@gS-c!8z zQpDcb;Zi_T?AC>JJGd@aj?Q9m@b4y_a8~1MO2DyQjWzi7b6bP=TrGZn8{uz2B0{BC z^5@l)G;$?8x7as!+6bGQDsRGWFdwO~Htn>3*{Ek{!@{F(pcL>ZE`M&YT=_sZYvj!? z_M#m!t()A@(E-xda`a?S&t1ccIx`2dy&tg*oy6WWjwEM{jEyBlt?+#M?jrtX($#q& z+5p(YCw7g`%P)Pdc|25jVNx<&WvPpD z{56;_>hk>+!4Vm=^fT08mRnnfHw)~_`sjtiDo>dDK4nV0PcHcaFMH38Dhr$X?hDhF z8_TgaRhl~W^d4It@7*pdDfuU6P9 z?hLIjayt{)@)l;F@7ALBz4UB%k1q-xckPuIKW}cy@DvBwG#^=N!d2o7r-&$7w30b> zU;nkIu;bo-^{#g_O8JsAmjNr)^DdUa$MEq)VP20wdp3js&o2V%2BX?)Ym)b6Hv+%R ztq*RESWeFcP5Vva;mf$`TTn>B$ya>>I|bLytoa zj&|C+I?r29%uA*6nMP{zHxgoBYWMi};kF9$^YKb=aaX0byGu^sY@}J%*8OTsreOFI zPn|iZ2)LJ5TvT*QGnMz<(2a}a&s)6*mb};);(?&uxf(wSm4SPsnNcDN7nuAb&H(ySc4Iq%a9YzgGr`CO#pF5kl%Jr{peG)%phS!*F^ zo}8MO3fUi@zB5{5XWSMf6}D~B*4?cEyr*C5RQTF$?9H+=Whz2g>nEi@uu$s<8v}DU z6!xfxE6w9lcy23GJ>nm@ztJaQvocmcEPvsh6%|BAD9v3Pnr-(TKFr+*3K5-psi)>! zp|tHMDoE6=fYtWfUukHT>k=C=dw6gBwRJ}%IjUyo1(#2vAtc=huY}Nht_|aRQ^rkR zSB9e_H2?gYOPs6e;m2*u3bY>xTLi7Ex{SXDk}}m!E$II8pZZ@YsvS{l-W$R z{rhnSzE935K2s3KFFgY!%X{LBL18&EzVL!+?CO3?MQPGfd0F zI6fFSuFLI_&4UVuVf#xS)EC3YjZ)cXQT7A5@lh8;=;`R_{6K#2NSJJJyVx%|M|R85 zaCUp#ts&R9c@l6My~v%~TcciNfKFNOx){oI-rS4&wd-W8XTMZ2b}mi8G9gjnh(66S zq;bn^VYfH`(LDQx$B2c^Pt9hr{w5<8SDKPsD7->-%2G-r>944_@7 zMIhZIt?I&4)BU)naJY%3mkSVG=*>vp3WEH}XJss+NHfhRu!WW6O5=KFN`CJYLGq+) z*S&_xNL*Dr%VM@CMaaS2#l?ecpD`!nS5|mX<$g?H&hn(#STMmbC-!an8VRKfTH^!h z8nRuRXZ`WDooGl=|9s^7;o!7kj=`<^28q$viWEQ z%hR~UPsp`x*B-Y!AiqzR%%T0B?zY*3z_nJ1#TH<-N^fQXVL*?18lx z$vTjX7Zi5Z{8o#LuR5uM-Q|SPN6k(eKdKv6RRUbZqt@8BX)vmH@$ zb@28~b?}8UY??+Tx_Xs66l!sv+m#<4Ul92-5PBqns|VT|kj!eN(p(aUsg;(Sa=FB3 z6!AlGDNn?K0yKm_4=)~|bmez#hn?fj@xAwL-!~819J+x{iPT!~-ynbfe%5^`GC95V zBC09-jkNz?TbHSp3ji$$asb)w{zaX0b`z_+ww+y+OXyNN8t|;)Tlwud*njUg1{5fv zRDiu;wYRxMEX(;MRB!Y=AQ`rf092Os4`@7bE68D+mFKHG5rzz$Cu_6%x zG^h^T)(IR}cd^7F0Rom<$HDGKvuvAy#6(-d1<1T6+d_c$wmRI~N*8lJXH;nxBeVL3 zV8kMj&j@2YWEW9Tc*l^7tV41}7W4&Vzc;qUntpg!rdi&tc}1M*{s-!RSYO$=zyP8NFYp|=;R*uOty{Okq|q~#Hbw2U<>VO~98Kk)`m-b` zZ=2me#ozRcO@)mb#>=KNmhSuOdyF3wFD44K{bO59cbClep1QNyl+nw=Ju}_$QdqT6 zzvXW?kKb~2m;2`{X)`Sw{T-W2SRsfS%M*=fVPtxwieEaR7q5<_JeTgNT6#z+|Mt{* zGXx+Z>?&hLzkd5Ro9)?OZB&L7=K&K09?u!Oet#>!f4DVb10fC-b~#a&WB*%xd%w$tyno+n`Sbn^ zy+TOP(2=Wdh9-mW4JyKx-G!`l$@^@TZF_f_f;Wf!APhF=d~)ILx<8sR@}gt*lT%+P z?ELEBeV>T{T*dJI<)_hGdoUF;e9a(tLFUGTT1xak#hk&nES}ZJkeR#$fZGM|n&@2F zNTj$g*acx^FyOFuK)&{z@~5v~z9i96r4}SPFI1H0)<>K<|D$>OkRKUkl;XX6d`KwA zM*;A~-L?#-1A)3v$_=DiqX8APY}v~HcmaemJQYCsXk1-wUXyP*KH5h{990*(labsv zJ~rn5{xl~NqS0Mm;$JJx2%c27ok<0BFRyGO#f?-EqrQ%e6hiuf`t!TI>c?!<#g7H5 zaTI?2ZK6IWlG3ImYRQ$pAJWVFQ~ryytvge=ZKkraJG1X2zSlbF_B&7Zb^M|vX7COA zs()h^_A2q9#cp{;MW;Z>`WYtguljyKUNkZFCzl$_;mMVHjjs4WxFmuQCF%NRmI#Ek zAF#HZ?SywLrr|6iH#oL1(u?MBuxvDi%;b=V(-9^SCD~Vfo$P12~ zOOWXgaIuK0;RQt(UCz8EfljT+6%*lm={x054D899mDl4n37?lc85BZfEdrK`FxK7+ zi#Ds?H_Kvkd3zv&hx7J8-i5Ae{r4jdnfZ{TjXVdryo{5$n;*qe6E46Ss48k`7?+8h zoGwc`RU1Si3YlfWiO}OibeHWaWsMV-!_03s0<`!Ph?L$Al{7{=!U_ZZt9Wte1wIl` z%7!5YM?j?wY zauE0s{N~~%{(R=l+vIWsJHdM>F7WD(-AKZp)HYg&dNxlEi>08~zlxIc7-8OijAsPI z)@Ax58)a2nZd+Ee7@97I zPyx+u?4s(@;@Q=KJzMu{Dbe&<1l@y&)fMuwy-Kg>#&qr1gGJF-oQ2&3fy+V zNoiv-Vf_cD03<}OEmj__?(8E9EELI;K~RtVfwX*Uk8<2aoa~~!EUvn-)?L1L?r-Tb zL*xUf0~ePA4q;3Rph^SjY`m3StFN!m51bhYK4<&=h#B4h((RqqtCEg%pslEYQBfpw zq})V;jix|r-HnuQ5F}8#vg?EZ@=pyP#Qn#wSK_W*Ncfu5o3mhtzOJfz>Xu>WLSGit zaZs2#7X)z8hL5jAPPz*0>ik-8ovq>RaBZ+z|Izuq$=kWAUj&d8W6>(@khbG7b|1*; zAOI}Hs}blu0j3j8@yER@KBjgzfs_XXe1UDeI(b3biwhZ6XHMVe!D)Ly>=@ClC&=Uz z|Yc{qCSP}FRuGw4Jygg7-qbph?7JQnA#>O&Jj{34B z0B`a~mfBaFa5brOhP0h`Gx#Jx!lx65iW!a0FqHaz6*PM^8q`kfdc|Uc(j*-f34(T8 z;nN+0m>DjSPs{Mas$qQAqme59I#fcCXpdfh#GGMAAJ-W$`PXd~>+#&8S6KvM^R9uQ zmloeOrzFYrIy~VH-{|D|*aBN}Lv4=a;8myJ^xq|O`fGY+5c3OeWq9d8IO@V1wE!_f}p>xqfF>@>EuqiRX)xD9H;e5>R3 zU|8L1sdj8^fBj^EN2!wc+-UAt@-kUGt6I(FwDOo;-Dvb*P#ZiBx~=o5@>ANbxz$nn zvFENvF&4f*EQMY2!n=uxuV!1)s7rUN{=^h~U(AZA#KCnw&AM+cUB7-SU852-Gj5d# ztA&Ai4?3VXgs{^i17F|?KG(Py{`pH6qrycKL(8t6Gvu8E{7ZK~#=xyw4^b*iP z&vc5fW@yo%;2u>q-Q0k41XUkMM(U?@R`bacBJ}+B=*`FsiK-Dzl@%p5U7i^jQWgEW zHksb%LbRlGGNY*pOA-oh=+x#z*RS3=;9M~jFVYB=?-dpfrFb?{nXVMN(5Nv<(h1LT z4C>OaCLM~XhfqH?Ul9Xlu+P5MBxk>j3Qw(zRMiq(Su}+C(^l~F9DGXC+?Vi z#T}M2PmVerZe{4$N9x*0Xv866zHsbn{|77?SN|hj4Gn88HvD9b8Z#akUj1u-bgyB2 z(rFax>xZvhq-{cW9Ed1dR~m(n2ZRUoU5`DHt;17=dQ@_F-FEvC;lpOJwxXQO` zveW5e+Xyc;RVI(%_VH$lRmSnC#i^M#Y5pkU7zN_O2t}?1$O{g zAS9W7uKRJ(lIlz6^xu8TKceycf)!AEz;K`UMlKbp?q$-)#2u|*I4fVm6LIyT2 z3|uqD9hgQ8;}cly<5>x#Y^7WpRe=J)T#DsAzvW5N8*3`xaakB^S&}c^nM;tQKH}{G zT*huh$1K0XLlriqkoG*7JGj-`8LiTjhTG9&Ja2&pjoRgv%g0GKPOkEAyu?X&&fN#L z+D_!zIK?a;zKXB zvoIeiYQMEG@vP>g#20X(uN_eg*DPtVQhfqf)Y8B^sy~QOpKHO_F%E?!X<6CAvcEoN z@|AY*X!I+dNNZNGmM~Ei*4NX4xr6uYU3wy527UVYH)%S9htPX{SG+~0u|kJ{B+J|T zzs?vMdZuoJ;{A(pn9kIGl+Ut_2`SBhzj9l-=pndPWW|3L4M3@}OAGk;{oS?H`G-xnp8~UZOb<@B+a5jV8_ZygAge!1 z4BjeYIQPXWbQPJMSD^)eP;!8xkc4&)o3b z(I?YODFrUw)_!JP9srnEG&S?VZ3XpX5EL$ub~3p8@Bd8JeFda0edK+;!z$z|7*BA7 zMo2zAF&H6QwKcs|Ra^l{!#KIB{>-``={jdE5W_`3=m-ZD`z`XM|{d&5gdXLXon^y$k3_aS|T-B;<-*4 zT~-D%+%?cLPgJ-1{=5u{TDI@-B~^X!Qgjz6k7H}Dj%+USFvNo)k0tXZ`dtJfQc^>4 z)MNzSANU8K z6mW!Hy}fa09}aCSYmcyrsVUH*)Fgy&91ww7CSC6$7z6PYLCyr7A~8XoBl)M7^l8+o zhws`Bb_@RQ1{oo{89rdAF`5EW;_1!rt%|IJxSG#ep_h6%GPJh;i7cN1zZq`pB*a0q ziz$(_9CCaHM%$~g%I~b6{8)dp6~KG$vU-vlttt}Qbsglr%#qLnx|EK}ivO9Y4v_Xf zulU>qtT8mKXhA^OO|F$^FSR6FInJIMI;O4qiMT5wZuTa9&Y0$wtFdau))vu>28+!CAmtRG2n=8LM~xEJ()oyQQnE<#kUH z=La%*Kwk*xpKZU8UI!KM8@Af6=bTA{EAzeSwj2;Pjd`!1EbG^>Z6Wq(y#=XCX zF5PXnfNyV26z7F#K(Sj446ezVL=T^c0MlbYK^x*I3u4x4W6b#Qmb)Y(CcL~q_wi}R z?DNYBlHnY>xmqyYu*5v4+>E^TO=fviu8j1WI;89z?(blMag)gub)t!<7YesUzXa|f zn?pNO1#H>^E0fI(%5YHeMt0S`_S~I>P8ocMVhqFA^ zP&w|;8eidHV@vB%70==;e{TtjtlIGLTBexuFA!D=!2~l@qF?Cv_vdG??yJRmhK6*9 za~F?U*}9$Bxkg$Ltl~AT;>-t-0Tij->j&yfF!U(MWwMD5^shIYUo@-1t3bveN>bIj z&43hF-)>u;s8ao)QebRaPi%$Zpm*1NegT$0*M^RHk4p^k_O07MtIhzu-vJeKeDMDE zyLk`m@2{-C*E^rL@S8ma)YS8W0{qb9{b`}#y-keGq^krH_H>Hla-%A{?SbWZ1C>0& z&n!5JD5LPTphcN0nxXRG)BvjhR9Rq+0>c3~ z!2prK{E840kC~)s5aI}-&X>pP&z$AZdOMe>kbv-|Z{`v@essnGvCqxJ1K>kNMg;yb zC`cdzYotmT8vdvI;Wv!ucn2SigdUz>ZQFMRGL;CaYjtGTRhUBl&C-iHQsoByRR>Dr zr27EQh!n0+WRC4U24`CVm(+-V=wbyxC*&#J#o#RlN8P0FbbJ&`0LffeV%Jh}UIH+C zHh*T`(L-f-PQcYF;7=BjsFT;0j0vh6NH*9D=RAisiqyf zxl`m4D@FWaZrwQfN#7LAsuOfYAU6n$Meg2IOGb1wBHSR);FNh?MFq}N1mahwT%h=c zNbBIpj8^iZ>^C{Pjg4mfN$fEI8jzfdIP||Tb!+{`ptHTGaGbHwpW|%a4!q6F!UXBq zeyK&Kv1VU^Q}}r0x4RA$`0aF+>>&?CwvLJl(A)(`nrQAjscIQ|C`L^^37nAE(e9#Y zA|oT?QuO77=dhRaqK_sw(g5FrJOq#i8KX9Eu|jBt@(DcvjBz4x1WKH_er$bt3V9$H zy0xZC{k*%sy&~#1C7TK4dXD!n+Q@DSVD^)J?R+vZ+wZ_Dx07CE?^0w*xV=Qz+Uvv8 zg`zr9et)@EC-D%F+3DzD7a5u9z2OE7Y2{}avyQ;nqS_j`U&_98p@%QEGL%7PERJWC z@Ck4M70Wzmz0(VxcM$E6lX8}ITkNnilb`_CL^qMK5d%A-6=+jY;8Bp#MXt5IJZi(d z0aJ!NzCfJ?Gz2#6G zUS&XxHf7ozFB!FCc`K&8LGWl}@_GS|thQl7||pwRklk2+X`gbNEC zcL=EjG?EaZkW>s93Z_(k^H^|(GP<=0;bdbAppnQib9mpCsg80E>Jfit=hdW1A-8s* zkEm8KK>>rVoff(1n@={>2tNFD)&dSz5g}1qmexl(eev;w7e{ zL06?g5cdAhr#A{JD#%g5pb5-yD(uFjjK~FUBNEIB@#Q)xE&FfgA%KgXAzh@k?Fzxo z*p}1bD9BgAF9nSb>d73lFSA_VKfS>cg9ws^*W=$G9q!|ybmg{aL-w$F;YY_q1v0*? zkFZN0E*}580X;#ah$I7OT5bE82DP#u^QR5z88g0sb9!;-wVmm=+7nP}_HoOeQQNI9p`~5*c6utjLB>0{s4yxjM!1&U z#?(8)O+uXJ-jf+^TNQ5Ta>tB$;IGtZI|~*I zMRF>Pw%|6OOu80>2rIRCc-zAN3Syjqfa+l(v-Bd_5vbf@gO2%E?k7EXO(SzGRGvG( zdQ&?=Od?16*(gK*T?^X!c3X}j0FW&X5rLp=90;%giHMxY?cXns(HVF4D%%@p?M1l?S6(b&h-QFCT^FR@P0A7B0etL;d zRX?_-Hh?>&<}dh2z!x7$$75vGn=X_t z#qJI`!y$_YVSyRqZO!dGJHVp5ckc?``9K2EUXh9rT7~p!wOZ_i0X#O zsx=nlfa`=xZ{OUX!z{KP?K#T=DGjwSqQ!%tQ=72VBgou7O$lDCopt8p?Zv#%1X%qu z84kJc;5^w|4AiqQJ0H@8Y%q&Hs}nKAEPg1r_Cs->wW)YM)7L)_;_n#QGE>|boE3CD-JfTdr&tZ*B5EX}MnMi^I&g2a=2XL^52O6?f#)))WDrdv5xvFw zYNT~(87c7P)~={mfNsc#i1@O8q68lz3tmTV>lPWq=2}%bM35h8?FUy7Q6G6YP#cE@ zm4K$T_Ckth9tG%EkQNF0=MLH_LE(+Wk3T;r*IGbToG#_b0R%9Ad6EdYg0!+FsbN8> zI6Ie%eH{OqcCM$bUj!zjFF@Asj}>w(MCuQKbU9m@K#8-f{~H|$iG;-9A_|eqvjcvY z(nGF{%*4Bg#EUtpLC{xbD+kgz{cE@B1O%FsUSLLG#h7V9FX0KE-{}PNSBk895(2t# zi4F!gx8It7Zef7^svSkuSt{)Btbt`*65^_m*RMegG%R7YLG+@8Jl|GM!gWHjH&>2P zabHXjp1?5^?7l{S&w0VKw>V`+!eBrvsLkp`Bl>|HY67eUh~lo!nFB|L9QZ+fPDTCt z-gqP!$82-XDh`7SYHeqc7w-Ue=p1BkkzI4|K9G$#7rh ztw69C%t9jDQ|btM?vD6jYMYUV%p&Qq~2tw%&2^h{}1S z@)YXePm}_(^4$@|4~UF@sh9K}Pf%Va=v-NUVen!+Yz^F5*bGCxMFcOza=?<<9cMOD>^ ztpms_Q7C#5d$MI888Ft^qWS&LAb5lS2%71lIv(8AkvfG4q>ZT{zaYd4H1-uH$}^w@ z!TW=>xlRXdkRwX!Ssh6{$Y`%nD)!D=E^L7@?$3%_C?j|xI+4_eP6cm8=?9cTulzUc zc}S#|Uv;`x`7y~_JP$c%%l7gya|9+yg<#N{=g!g zXW9XY3kj8IC16RuH~YE`ACT5Yv>K;uuBL~I)TT@?dEtkNo&Ny?)FWoedKGfGhp|D19I}6sEb)8q>zuGC6w-YS!z<{}&xB(D zY96}MZ2ggS`~AUI8LvZ+$*Hx=Ok8Zb=IXF;3$%v_l9iO*<;&oSWkc*&opI+8djeePftVIQ7C`*| zyHn>`sYqC9Vyqw`MRd#x=eHC3Q)DXpS&h8)qm0K?L?w;`@y`xKiGm{h`|oTcO$7xe;(B};z5!dNk{+V1;~{!AHl05J_K18yk9Ix zJOsx9RaN_uG@@-IrmbFSSHQaObxvm?{6WciA2KH!s0ROmV2`JbopG1M;4rjGmytOM zD3Q>#_m|DpkvNkLb)KQ2;gDO%2IE+Jr~-ApTe!n&xa;1Z4$9J+nk0b4XPy*LCay$g zQ|1kfEG0F{%>#|6JtiEyC^LO2s^e+B?Mec(%r7Wl`^FsC;eSQ2`g5Sb^XR{%ZZITK zhbwdGS2zwT!(d(jQGg9_1%qJS-EUdM*4O#xQRZGX2B^<2<`dJDKbby`&@U_t5v>uJ7T z$@GRT4dFYDI8Y8Yb{(hNf(gTr4S*zf6+0nNH*A8b!bI~MSd0i| zLmbnwnht^9W}$~$NU3(be(_idnWvSh)-3+Ee|JD+JYmZKois)4d!GZ0_LZrn_XbO9 zG!CdN=!`L&`;6KlPu2tp%`ae-^1;iRc8=Fr5y?Z49LcMPuVE0tZz=o?|0gMN&*H^9 z!aV6YDShuF&Nu-Y*SXIsn^fO9Rbk$oiW~=pdofbBBkUA%N$_a;WE|aDwzVM1$aAy5 zunN^G0D+=I_I)A{J5Aa{_E@$e>=I^j5R55~gU^+Ix=a2-vWnoppE)-HG6#Vv(l%{yErOIcBLqBUC+yR_ zKqyFb>Zx|lmekPjo5Y^NYsvgycLK1KPDrf`R^d!QCh#1MHF@(KBJhCl7q;|7h_}NF zW)cf`b(JL%NY)md6fAC^CrgGX<*ye0LOiO>lh6Ss3K1w1qAM6w_WFI>uH9g|PZ)nu zAs4C7!B*HS1$8C}y>>(IS3Me`6!$jCZv=-4=(W;&zY3k86nVi#iX4Cp5%gqlmRlZj z0}H6y`n~lcN3Dyr<}tJHgc7z`w>ai3=NIr}d|L8KVkPl{A{PtX&@V`%?D~c51r#ko zkDV$dc*-7Qi++8S3hkz>Xj9XZRdD(&#~^6?OF;2}A5l6cL27|sdj8qXUpwu`a=<== z$Ck8CIPi={sZCWv&wS0_*S>2OO}`4_emxfHe~yqs36eiZG9mZU&XG<5QWYF?sYjc| z3TXecgqL`pEb$Jmy5;LdLjw?;jUuXpRQa{bsIo(@KL>Q9AT$L+cY+Xf9dN7=5bFUr zz;wYW`i9Op1jz>*?TC35&#P*#l*x|*`VJHt_CamaU>I-&`{IZcPOg>e<~a+g$8nik;sIh$#tHgYFR6sQ|3d zKmVePyR=N>|IBSfM4^sN$FX6zC$<)SY*Pzy$!mvy$eYY?pxovAFgx z2Xx_lz(BFwhRJ{UK=Ew=UyhC`G%Jghk9^A(N!2Ot5qE=yLXR`EK%`vN5zNe%&+2uM z7ICDm_E+TdS^%Vx&F*GD3bIwp7q{Bc?$<6&XJb?_9-75iKyg4J52Tlc2Jck})aKA{ z0{(wcRJg0>X@k;xSwDaQ#{UfbK#N{eZwpujAP5+ZLYDw;*Q3wWe#TlDd+*4W0^8er zLpq25HLL960QU2G zrxlTt$f1uLZ}-sQ{f)sPc~8!R^A^B6fkF3KxZRnhu?*fWa5wW=RJAm zR*M0=rN?Duz@I?=g#Twv>>r)#=dmCv6#N_kbVHA?tm5+e45Fo2b7H#YplcPXhX-7- z=zTJ;-Yo2riXc62xf}`nYQywegZMJ8(ghwLmh(HT~J+9xKmS4;Ft{t#YL*)Pa#F~2nGf77J&YqGBzt?W}P z!_${!XwJ;1aMDoH;M=jiU|TQ9y;Y&o6V4fNTP)c4QGF1hP9X+!Jb?Ua{J_b29LCIfSCGwo>eQoW*> z>)KAK3R1NQToKy^M&jX_*4oE-J`=`>ankml~2H++|3MxiF;dB|B&;&ZUuQ-OFv z4yXs4_x$$u_KWE?T|x&G$~{o7c8Tb1h(0ad6%Y88rZ?l5)2vRJ9#LQQ2&v$2#~q2u zFvFp#H@)`IreIS#DH$CpJB=W`K$6>!HR_~4W%<|{UQouWz zVt9{qDjOv^;q@S#Rid#+9A1W%S965v1=#U-&%s~M(PtH{{?ALa?b-k&$jC@3gijIZ#Mo%7Gtq*bL+eJYu7S&2%m{M(N) z!Z4ZNxds~dnyAaERG&sii)Qtu$T_6i)wH(@K+|C9Et-Li58meY&2KYxJ(V4}qJ2{x zdn+L^F)k0PC_kG{6JX@`_xFL*f7WBSE(_fn8q{xVd6Rj2*b{7|x)sjy$ zO=SKAJWE1C0+-BtjZ;dj#Kgn~<=@!JI%4$OvDlmNY-S@VckAJ*s()qE1j*)SW)$I_ z!oosRDdig|AzfP4n&#%f)s1-%bkOwquKOQ0T7GcEQ*=5wIGmkclT7fE&Pkb)#79lw zlP=bc-@C$AHsolwS6w)yCdNPxe~sWO^1T~$D~xW|o7}_py{W%m`1EgZ=#NZkX=#H> z95?mVqZH`IKW6UISE4Eza(oflkzZz1-hH1*jGjz9NHpy{;REEq*L>)>#sd%lK=nfbH3ByG_%SXJ-<@QpeX zzNM{zn)>=H=u~hp8B`eA1qNoRzkO4~uHGLX1Rtwoy-KMqr+2RO2s?=~oXwjaAGdjQ z2DO@`&H3CAjvZ->8(!NFSL7;zMJT`_k^S4#ZI%*2Z%8^&(ZwHyYd>|5Di*|nFM?KF?W(yc`qu6Er&mtbbLAXbB2(vrOm zJuu$Mc&Nx4jxdaJqgk#g_lxNu0Y(m2n;0~7K^6$zh?%WJHPblg1h$k@79|%lyx}6uP5chC>s1;T6=YiTiYyeE5JNO z1LCx}Kv1P_(2ujoq%y?cYMwMon8Q>|mS0DWwk!=L`Y+CzuLYzvg&rRn6b}8b_TD_6 zsy%EQUz$5jG@y{8B1tOq*npzYU`oaul}wr2GBrtrWD4ONqJ%9;rVJJB$`oQJQz08W zWXhcPS{hF0d4A9D{e0f%egAv@+tb=>t?zIT*LB_Z8W*>B?Oje3d6cn?c{bVTuJM1- zsC{v0&DYv9+Av`33c8%$B|DzPFjP}@@@gD*4^@}w8O1Q{&z%!A<;3>2KYMnaDJMJq z6h3ov6Sjza4c+fK_fHfN-idcKrOg}j^77#A1rvIQ#IKcJYdd$M_f1N^d#h9!;zX5Z zSLRkI=sw;K5L5S)4}B&otPsn{DYkp^ENnJ$5SuI~K)AGhXh_SgC3a$1xU_i09ouXN z3hivDbSsHU^?_mc!gm7gA}5xQf9le>)i72vn=$ij7cb>{@%OjI767*vEHGIn~5myJzYRyNppBGWi3=fj1V2h>=z@k~>m zs8_RyvJ>hAPO95%cig41Bek`<$JtL(m1eggpslrHDEnl_W*9$4^C71PAN^OAs?}&= z1;JohM8+(lwbAb|bC)Y0PVc*z_?&iDO4wP2gW}3FUa;-%-Mf-5yRvIv80VeL*XW># zcur(_%J%1wwK)Umo#xi+fU(>*RlV)iK81mxYvuaP;ql@Tg7^%-kh65kThex9Kq?@i z-ikdhhM8AU(8s}}z@zZ`(?E_rzoA4hx-$hnGf39w8xv8jd6d0YQ&UqwZ8mLRyQ9VR zzKLop33F^hrRIgaZ6B2tuNHV83*abS)3WQVPQ)2*+5puh-?G&~arEgja_~KHX~)Um z+CJ&`euCw?qDA&wq^jsVVgi0;h}%E;e(jl^ii#c#+wxmn_ zCr=u!u@76M>f@s4hhUo>^9)f-E@=Jq4l{(-t~a=zs^+>zkTFr$+;)S=lzL zpwprYeM()@M4Q_1R9;#-Vr)z*;M3>N2VL`xwnw~oG9*32oZZ`{cLtc*8M^ce>GNgu zanBk=S#=8Qoqd(nVxhD^UU)iqrEKbPgYz+rYs_5bYqcq_rUe89R>ZbN7MrUFw!g3w zwk;S-bo(%y_ePrM6th(-V6xVDDwLcN#P`A1`rPSx%^PFK-`-_c@XRqVqC~L}C(}>P zX_s*nuo|y0TB*F^qw zHmeRw%pD6M*n7y{!tCl2JZktk3i|x8lPL$dY2Y(A$vC(cTxC#7=oied7drcI+Z>aa zH2E@c@}<(~n{Pv!(^?*_0v>Urqe#HQTSom`q(&OYhmV?REhT!rme^j--jS)VUVA3f zQoecc$+gPiiK#1r7Mc352jyzJ9JTU|Vkg{d&p3UgUpS_ul-XbnKNvFOKGIi=3&RNF zBkeT0_T8Gz3X0rIL))aV)|22Tl>SU=y02cO(HZ69=&1EsN5P|K@w`hX_6;6`OLhJ7 z;lgsZVN_tk-<<6||GwvIv4inY?jj<43NaeJmN`rv>d;Nqfv1A=k1(d&HazXD**LzttpB59MZecqd zs%G9r>!ueS3ta85^4jipE2Z?)fKb#DLNr8tqaGbjAwehkRdaK5!debmdPwP~h)=qd zn9}Cvn73y#WsiGoe8znvxw^F5+mtlxnfjqkO-)xyrI`aoSi~X4kf&oME~ll#RU@V; zX?HeR?OH3owe;Z$@gl#`f^D(D1rln{L{I2v)Ze~!p5}xYp*V5HoBJ4(MSV-R4RXWd zibs_nkhd{9b}-)vezfb^!_^IjS#rH1HT(|wMw&~m?uFkZ2Ng1+O%m7 zt3zj$SliRT>#dBsBiCRcN2abZKBz1q8n@QXxuIR{5-neu=XlCmiksafno+)pMdZMI zeRmo~lyfD&RU41=RGLn55?WD&xaQuvh#S#QZGOG$AhF%g!<~DYAr;^oclsmq6Cwjs zPK~m$H`6w47^m#q^J<$jzsjT?7gRrrkhHfcPXN(we3f3dl|`8O4^Imrip16DvX+yB z6WK8cxm;Xyu`Mr~>Xi+?9DJhpknYsfI&wQP=`(U5Y#Rif0d2=~ILa}@h`YkzbA;^d6u(Y%E;s((uRA4Ek>Z(n%kT63fuAklzxdxA!-{J zUi7*aa&&0U4QY3d>0|)QQ zzzHjh48G@nb#qu{a&Uy#*sa+YGtHJRz-uuiQMYEF5K*~{H)QrkzM1v?n_rhx#`5(2 z+}(#lUg9r5*kqiXb6I-bk840yIOm_2mxGp(SL8+>uzfyxb@(2r&9%7GHRX6mJn({* zu!ywDU3lx#k393&MWt+hdND^Za5kA8mM`$>{qV3onezR;3i0&)uK|E6G%r2l&M}N%Dfwy^)1^K?Z&jVJkcf)1 znbq;vOqTrLo76=Y{}K$s2o^PA2p6CY#?L#Qwcxjx{JglSf3JdBNT-%7S0%!e6NCwi zrP_mPu_nhAqVqr5;R73pDl?bMW?|y5MX*PJZh*!DBv3Jj zRU!|!OinHF_t0yD5E@QP&Un#3FVDpY@HyJ6EB%;va%DRlb|n`CcGMmL4!jWMqX8p%~hfr3sX-?Vh?|(6~MZCD4bF-%KIPAg!1-#Le@8~*oJGI3CI7nIOQko{I{t;@{I=d_u%AHb zb$YTLUO0Hyzcx75qvgJz!v^FND;2--S|s|f%Mw$Murv|;VK>wsTwKS>rj~xN_f5ON~osslNr|LlWUm}pUsANwBugvWsHB-yz9;IFOyFBs6unevm9cF9 zd8hEx|Gd2JhF=gJ%w(NGFK`CvBEcAbK$MjY9PHS;{IiC{wog?zR|dR?@zN) z7w~f&ZfsDMXd=xZ!C~^R^H@agpcnnXYq7<$_| zD$^!=<1Lk+dzCbCb{hD1asb|aCU03Z78q{zmS5(ZnDx&~0H;20UWv2)X7B$MmpFX) z=W9qKd2yX!#|5h+F$^moA1)vtUWb~2Yq_>K%%9|{Kp`vgoSR~eO^h*oX@eJn*5 z%%aK?MbT#J3&WVXW!t@wYcw=8#D(1SDBOm$kkfmhvx;9@S~>^;B4u(k9X`X3`#=n% z+9nJ9@Jr~#1goBfibbi{H#djb=LkRlcnH@3Y!yV@3VL+k1k#r4D*Q{rTk&a>PWWGNAajQ?M#=$Xt&yhjR$>i|-%wt4m9dDYC}Kc%=|<37P%q0+N^ zIQMgJZ}sZpBW^9>AI}P^-t=Km$SXU4{yd--Kc-0OL%!2P6H|OQ$Xj_RyoD;eX94kn z`rzc!{TcO*h#qLU2ilP6BZz-pRYjuffotWLCxifyz1BD3(9oVsMM`JN`MRPa0OJZ~ z4Kvr%V~vYBs6jJ8zq?njt}UK7n~kmh{rj6ok~U0vc=ndFPElG${2rz{=WPX!h$(1l zG6Y;+wvdI;LkMzwYw3>qmX>hmJi~($+rmo`E*^=NqS*oI_r>*tQb4lZD#cEB+PHY{ z>vYkhNPU1U0?a|4V`Xg({4rS2H>{u+(Bb#|2WbLU+L5IF$XrAh+kOxvh5hhDlg8_UzH7Lit>mGjlX$nuW&D)(@t--mQ?4yK$&dJ<0d z_B%3~6&CNs-vGWp?kIY!d36oO3@etzez2L=t`!jk5r)_O*p;=s6 zQO%#lBA!0e^yG4V-F|~L0{h>*?c82f_Qvl=>nTnG4%ukkpl@w$gM_1CU#wU zy4!dgR`$&eC1y_hcFZK4So|9*9X8F4XQidTJtJ<%y{}qqD>VTa*3gjSM>D`(<$RYX z+Z4Y6z3Mugw?VadWGZe0q7yDy0uvE=q4aM1MB!53fa8&g%IARfqw{d%krb>0zQMiw zk+{zC@vsRy=N-nN*jdYaOlD`>JQIB)>g6N1WPKp7Vi@q(*zoUwR)x~JlN&e)6Io=X zxiUG~1x`-)9ty7j*a|jDRyJx>y8NU=(i_pWd$7Jh<)!Q|R#Uo#qW_f%db&9Uh0{}g zrJfM5YFxgdpStN-*s99ABkU|hkp!aATb9w_odg4`OJlnkRh826$2d79J@O4omQB4` z_Db_xyJk#YFH)gs7~`P8Jerdss3UIL=C9wr$bp^;%FoZg5}gBkz^D2AaAe|&32)$5 z=(@8-yhE+#5$F0E^P?kuE#VM-?M7Rr`iMXZS}c4*dm)tQ$BaDL=P^b1H2gNOZTjKp zcvn|f@jb41#QVp|F{C<$(xd~9zHMY)>*Ui67dKqF_HkC0@}JJ5FfSDq6<~o*Y?~)@ zkyAHG%a=*jPi3dSZ<#D_5pFEpYwWUYt=tU|`@sPB!X3J*sYj9?Q9EW65A1N$`DWtD zrcFEreWl;Nd2Clj4eJ9zvm8M&Sdf@SynKDaJn|hyJ zS@vlDvb8U9a-~t$Aim;k>XzNCtgbACPR2>z8)E94BerXyaQwiv+ss^&arKQmA=zy% z5U_0CC5Mmvl@9d{4Z%9e8~HRP1Nh&Zh+H}!HXGH7=JnO|rYB$0v$6zwob%qbpRIRS z1|8~;?ZxbFe`W>idfo|}10a*Kbg5jA^Mt`DD@Ddt2d7xP7n>6hQW z6=(^q>T;AR+26>A_K@UHU7LU;V{bnb4YAKTNWk_Wf|})^d{`^wWvV{w9KZfe++e^J2 z6T?0j1}kvNC>Hy+IFfi+p&>#&g%vi#fMLs%&`iTSxFoEbg!hlZY2nY)=qu<>B=Sz; z^h^2wk`CZ+vdKEvbgfM<fLpGVwM9!Q8%( z$1po4(k;zg(Mu|N&(#fxZ|cF9V&4$B<)zKrE$)kppCBbg07t+~u$ z*MZUgwrhQKx?vhU7=)nHd?Gs-6D~?u_t%)admYHo$nulvdk%wXs=n8DersoCf`t&S z7~T=~=vvz?jddak4L$6o3>8e{$u3CboWPCRHG%WQk}z-~ykwt85<3b46w2&_KiL(K zG63a;I-K6Exl|zPj^8viG<@ZE0c1jaFy#@O&vDiqUR|y-7&evJ=w#S0m$rZ%ff3G# zO%3QPRi`a?Hqod$5_05BjlbU9sZAQ2*&l&WR$Y#{!a&JY`jxjS#Te}@=sV7)PZqHL z4n)~t*^EzpORZ-JR61O1%f8jO-Mwk70G9Wd9iWS|t3czk%88cSare8&%C9;b5Bq|V zxyXrh*|dDe6H$)5x5y=brhL^C7NTlo06ham{S!Xc<<~=hKzK3#e}Is8^Nat|kUf2x_DPGJJWZciTE= z1&qzZHtX+C-=Ml<KG^bgx?!!g z?X))JCD^wm;)m1dl}=x=%HTRtKa+KT@1GOt=Erm{FLrM_gX=;d(@qhAa$+TRZ<7sI z#DuJm?-Dmmb?_?Jw<$)q3CEewDW}jnab#?#MJ2N=_d!x$1jm(quEwxgF62@`n{o?RGVEFGLYRP3*+(<$xcr&h5j73LUa4N~zT zS5Fx=cPd#%lIiT|ct=UeNrnf~f)ECU(R;fxexKV5UgK09|IM`O3wkau4C&e+dz@sV z7xBt+F81A(P+A3@0^7y|HIDoB>kz4qjNs~RhTgrXEH@F&{+d%|`VK72J;9u4aT%v$ zGW!Dp_XFhjJ}@7CHxZulO7s=1omJi+kGQ-^t|jFe57m$5;5%};wA>Bsi3`Z-{nGR{ zz3XdQcVlNo_Cm(Vn5xraY(B%o(#%F^W^x$n^e-b5?&91_{c?6j-3e58d6Zn+-FS1K zyH!R-enFc8=i;{}qJq!rHlh7|+;ufxM#={{h$lF`9RjUyubs-fc2n4$U&WX|Sxz!a zWOLNMz$gBJZe{V6Q3|xdgMpWCxqe2HkgG*h*?!>&UDegMCA>6z{F{1t#G&r!ya9lvnYZh z=YL@^m(Ou$*w$D1pUKR9cr%ki{=TpfjeQ=O<3s&a=hUxhJH5aofrRyytHIn;&S@Uzr`S`g3xocC+gf!Yin}(VK&7K8WbDIy#e3*3saTccfjX&^k3Gj5QzpDi z%>66rg5bgnZNY9LaWHMY)rViX4DC}qIXPi_qC^gG%T}IUj;EZeqD#6Wovb4s&YIfv z=vtm}ZbsHU_rYEfI&*kY>AWE`x|3Du?I`?2Jv>F&;d5eB#M{63CXL054en`uQkC4# zJY>uf^#%hPU=4*u{pKibiF*v5^81za3#l!A$wp~e>Gt6sg`QnptJRXO#Ot=1IySx7 zd)3I?`h7~m8D%AT6t*oQ_v@_%{E2TqJ>n>zIxV)Q8#Rs*l+S)Pj@K*a)@wl#(s(@jMPqhx@ zhJCcggSAeXH*Y`KqD*J^H-b#<#KKzjxoQ13i;qQTDX+-lC_fb`;=UtD;qftsLse&} z1U9p~M4hSJ=L%U#)F8E%X^h70;18}WKi9y>*C`W{=9(Ts1CfgSs_hC-qbchMlfqMf z;xQFlCtV?2f`SP+1$2j_k!@0BILpl~>=uJHY~@e^$RkcLcc9HO^L=C5MpZt9hC5>m z0X5_`6?}Q8q*N`IZ$H5fIUlT3W14^}AB{%aS*eaZd))%4;XF+zpr;3nknj~mK$sc5 zr~GFgcP;IzsUWi67)mq3Pvjs#Z5Rcx=^NCKLLBnRx?nL-sg?%E;{a#`6M&AyoHxj* z55cAze0L`EeQ}N+T|5Wf-AG9aLxGo+R&7{tF~S%I2iSw`2nA|J(Zw58Z-zd0L2gzu zs2LjtFbw6|w?gj=S5v=lGXYT8LlC^RB=dXk~I4e4v_L^eb=NQpQU zrj^s;39km*E`pDbA(PgICo-3GNiX3zS;rb4gRKi@LDR8Q)=lyg zU^0h7_Bj_2x%az!cF>=T8ZdJZrSFt|o%}(nqRa$wAQ@kwY`DR++c{79l+(C0Z8}di zBj5)@v~EGilV894!^$4v|gR@ezkItTaTr2Fj*+y+eXUHq@|?Z zo$j1V+%oMV5F>Ut>wszoVza2vrkp8t8Z%xh!MMFamFh%0+gxen$YBU(8gl}1+Jhy` zZdU1log-AV3J9&KsaZ7JOF?q*y{D_IYmYNEvS8DeP+zEMt_76G<#o0N#)`Wp>{FC* zpD&|&lW!=1_c-R$KIh4ozH%f^nflPKD)zga2Z&@x^Dw$+bXTrYz@w#YI_>$u6Ry>K z!Pty6iKcYJQv}qH9XVs4PbqFe9l+-!mHj!D?iJY%8P~g79AX#)cxRJDBU?KR94{O` zzNiq-u`ZSI$mZc20GL!PN8x;?C^mW~J}U!tXma(h?bE|=>Mh4a3M zhVOfzU1pwE%pUl;c^E?VmrVEC^uAJ?=l8)#WglndWZ&v6Duw%$1CjPu^A( zFTc~@!f>3xjNvokVL4PWJ$6IG1bL1VFBF>{yZ8x{sSb|M8ms$+54J?V6(7yGSn?<% zV<%3)P)L(quG`aIksNCLVl-Vnd^2=tuW&ozGLIo>F8?fNF!D|$u7Q`C0FD7zcI51v9$wF>Kb{|g)l_S6GmK%pLVo0Pn|Eu)paDEf;e*LD`eEiP z=&>F)Y~cGE7lucqqZ;Ith~azY@TM>egP}A7kxBz0hbq_c((GOpZ)l!+efN~EJq|-a zv7$G4+N4To0c}=R8F}c1Sl#gx-(lxZRF-#0!6=O6$wgMj?p-loNV>GtB9dbys%-ltINhA0eDp-(g z6sEP!JnvPL=Wx`A`?4aEnIX)$1l=^V`tm;{m2G!PuJQLxkW0(uxZL}0+12NnhReeL z9ywiQ9hLR;!w$s8=}M2A57n%M&S&m!lSY+rzw3R|8NLqj;V8pC}Eb<(RY>8Cy(_^R3W$bHqNrzX~1 z#p-?Ak3zJ>%nk2d++Adc;Vy0PL&>kbRK%j{y zYO0PEcy=*PXEof1gtIcMVoLEvmjmJu-*Vox^EUG?J#C!QJSbYAd-dfRXJOtJ)28Ae zUZTj=K*p=H;-W`Qp@^ZqU6brca%X#Y-c)k;?Job-wkKRpCN$TpQ?wZ>E=#Em-*xq}_U$H8q7Hp?7*BsTjJNp#gUS`Q&1^FBK$d5{!%lc!hxonMnYoZSt+8t=-y#2peN)h3o`M$# zcCipH&qE(K)bbRpTR+E=x-x*q4WVYyrf`WHKdJuL(y$AJQhJ%mqNn&dQFvQtq+n zVp1)J1{#5ba+SACpg$A;B&ET&2W}Gf?y8b|fgyeCYlh7cbdh?m=wTCCp6J_lE>3>D zanA0uy^U7)r^3Z8vj&r&EISzJcI&I;d_pg6%Usrk=B`e3ojc%i`bD1+^?svCsJX&8 zbx=D{z2$I=7Q9vsP>sw}87(OtSuO}=MN=fg|p`xXyz9ZJ&LF|K}>&P)OZ0B8ZDmqbIZ zb4|88>W-{=K$~#WHzfIwJVT?uI90GjB<{1pRTfKk;+k;~(qF7aU)l2bs?#SP6}4;p zwYIijuCFm2xgFpGKgwFQ{GB<++q?d-PHZ-$Z`o}z&b|2R^VV!q%g8K28Yh|iKviba zsH3s-FWZ5fh*LTXsytl)b6hdK*D9rB$DItlT}HiDK-=vJkD319}l#vjn9(sj{om(7}U@${;iYPDF_T08M4G=LMcR zw#g!r{k*x@8vg`|qP&G1nbV0C{>{N36P?*LYqS8?f^`9h0fZNN!QLlb(Jkm^3Q}=5 zE2mvEI|wucGWZEGpm-(Wv21W(4f%4 zJ5W2Q@8cfgt}Pq#O*_m(OU(gNx+@YNmgYJWRX_)&0{k?ZhN4iw z08{T*@!@`IMsRZAR%l_P&H|nR-1x4sy!eo~hs_Jg$?7_H8)}AXyOSqXp_jr?=Y^p# z(~nF<;R`rGIL8%aaJPcqZY?j-WIEl*P!Kp4_G)LP+)+opVam>+a>hx0(4jrfz(_@S zlx&WEm`|k8Ue9`&Xnj9;(X9{v-*rhGo^7ImYwN2nc*rk$|5UJ*PdA3P6{c18~zDD+k3Nk<<-_PdYn{8AFiDlGth^Ek`W%QJS_5+OA(8?O zD#{5xaP&Ei*Xd9ILhAjeYwfCAmx7iRErofRb44Y7Jz|Ly=E=5hZCnH8wjM{nb;W*D zB_*c3Q=R)h0S>s~hE4%pLHf=FvG}yA(rzvGpu4*fU;~uZ(9{G;aFdF(FaxT=cMHBN zA@yRxG8U~HaBMeodpib#izJ_?zx7RvOivU}Z$V*tu8+@TiSgtW^1%rtt6@A|9j>HQ zYT^#|>KK^cP0(-x-KMAbzakpf0+vQZ=NE_)rPoxl zVbZJl3SU?#%+xFqw;1FA2S|dSEN?*fx|ys_q@cobF44GT4r_{GRzrf)((IDNkugr* zC1bV5Q`%&?L6`?MtHtBE$5^;$&Zu76&AaM>zNp49Qzxp1p9A|@vuy6LYyRjo9%bM+ zU_3o+9PUv7cHR@L-&Q`&1L-exOIn?{iO*2OUC4nH%_ggVAh|!mdHN&ox4#AN=3Xa9 zFw7Hwzggic5~s>p#Jg8e@AN!?R?SQPh0E4yH0EJ!QLIGm_os;1*vvc`qDZ7p_<1tZ zXLW%jgeVWL!b5DPpnyGXQf{R0_~6&sMD~Um@y9HJdDr+7O5eIL!;eby#Poyek% zzSc$FTQc3(+si(2!QjQE`OBaPV&@G^dnm3zn?slg{MvYpHqcp4$C@9r%V6B~=)QZW z_RK3Zyek}X00rhbdeu{J4mKs?eyg81{_La+@nCIRX}hlv=6KaKulL_%p~HbIH_$Rf z!(&j=^QgjblIE(|r~*5&sSJYnih@TdP|_9TNipErJZ+&>P_2~ERBs*>PK6_F&xoB$ zK~|Pi+289@c-*6J#6uI64BJ-5LXKhY>Zlu1M?u@OZQGuFxhOY1IXLiKaq>B7HKxDXPH!TUX}`X}xYH*# zBxnis%OD`SEWRk6nQPjy=GN6}sSjV1wS-7jhl@+rXyezfkKwdW>>0bNIB7ao9bT}3 zkFRB{!lfP0atcOU%Kk=>mty^Le454roKw&yqPl`qS%$n|aXvkxAeqr(*KDM?xVU_3 zZ&xDy^B+2Wc-T*cyaF^A4GmFx!)omoUA3e4^~jw!qq`~^@51hEXy@$bZ-dPO6Hl2}t4&r8A}WBD_s zj^SXxEK$~I2N79OW+z)G3?d~awqfLIl?72GMJ~}2Zq^UIXSuHyfzy2%NyJG$I6?hQ z)cJSfyZ@x8PC4ey(ecOsXm9@^0RKmOOA78HAu;@2d;5P~rMVFsZH8kdg^a&6)#RK1 zmRu0RjGq#F#87H!ziG$+c?mTb9}I-jZ~DjoJEZS_i0Cq8|CeoA&p=Y^XX zgC7YoiuhT&|1TMN<)9J-yVrixds~XArQxXGg|XjD?@Q!JnR%l%L<5&i1raCi;9e@( zwDKTORfsab*9OdnpfR$1lewOE>ysZh0&W;W4G3csJLPxbGlI=;mQR>@#EdL-mlAkt z^aIlo%wy?u?>qmAEaFRyN@pjdt2^k+i@>>ex!ur^$ zdhg>8_3@m#`;gJRuB)p{j6x=$)Be4#p9u|yRKW8Mom?nEf;7>N+ctNz%j;7LgR93{ zISK_WBK5bQ_|pDr#n?NV!loHdiC(3NPtdw2%4Ru1=&>Zv#uk7(n^EMKoIy|yHOL$O zQR^3IeB(Zbz*HHC+W=zKiGhepHx+bG8?nwkraR!`IpTua_4bCAZ;#zRZ7~jtoydu8 za12Ju8T>bbB7YMx)_d#)p+1|X`- zUuId%8Uc*Gl^h^9L>b|vwrfDZb3kCgO!2E(lnpy>a=qnOmWWesv!6KU$@e3)!0m2Q zSS$HWe98{+?YZ7#yn)l#kMU|we?K3pgf6eLYVMn?=zH1R9D`(_TsUQ>O+utaBg&Mas6rKn*-ZHaVYB#0sndEd y^4sj~KPBKZsojScth>mM8##YeW$gWN@V8~@3?ZM0x+_%jYgJ_pCF&lNi~kGtIg*P2 literal 43460 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 diff --git a/test/e2e/bpmn-rendering.test.ts b/test/e2e/bpmn-rendering.test.ts index 1336fd070a..5406feaaa6 100644 --- a/test/e2e/bpmn-rendering.test.ts +++ b/test/e2e/bpmn-rendering.test.ts @@ -30,11 +30,10 @@ declare global { } } -import { encodeUriXml, findFiles, linearizeXml, readFileSync } from '../helpers/file-helper'; -// import debug from 'debug'; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const debug = require('debug')('test'); +import { copyFileSync, findFiles, loadBpmnContentForUrlQueryParam } from '../helpers/file-helper'; +import debugLogger from 'debug'; +const log = debugLogger('test'); const graphContainerId = 'viewport'; describe('no visual regression', () => { @@ -46,13 +45,9 @@ describe('no visual regression', () => { comparisonMethod: 'ssim', }; - function log(msg: string): void { - debug(msg); - } - function getSimplePlatformName(): string { const platform = process.platform; - debug(`This platform is ${platform}`); + log(`This platform is ${platform}`); if (platform.startsWith('win')) { return 'windows'; @@ -139,17 +134,43 @@ describe('no visual regression', () => { return defaultImageSnapshotConfig; } - function bpmnContentForTestPage(fileName: string): string { - log(`Preparing bpmn content for test '${fileName}'`); - let rawBpmn = readFileSync(`../fixtures/bpmn/non-regression/${fileName}.bpmn`); - log(`Original bpmn length: ${rawBpmn.length}`); + enum BpmnLoadMethod { + QueryParam = 'query param', + Url = 'url', + } - rawBpmn = linearizeXml(rawBpmn); - log(`bpmn length after linearize: ${rawBpmn.length}`); + /** + * Configure how the BPMN file is loaded by the test page. + * + * When introducing a new test, there is generally no need to add configuration here as the default is OK. You only need configuration when the file content becomes larger (in + * that case, the test server returns an HTTP 400 error). + * + * Prior adding a config here, review your file to check if it is not too large because it contains too much elements, in particular, some elements not related to what you want to + * test. + */ + const bpmnLoadMethodConfig = new Map([['events', BpmnLoadMethod.Url]]); - const uriEncodedBpmn = encodeUriXml(rawBpmn); - log(`bpmn length in URI encoded form: ${uriEncodedBpmn.length}`); - return uriEncodedBpmn; + function getBpmnLoadMethod(fileName: string): BpmnLoadMethod { + return bpmnLoadMethodConfig.get(fileName) || BpmnLoadMethod.QueryParam; + } + + function prepareTestResourcesAndGetPageUrl(fileName: string): string { + let url = 'http://localhost:10001/index-non-regression.html?fitOnLoad=true'; + + const bpmnLoadMethod = getBpmnLoadMethod(fileName); + log(`Use '${bpmnLoadMethod}' as BPMN Load Method for '${fileName}'`); + const relPathToBpmnFile = `../fixtures/bpmn/non-regression/${fileName}.bpmn`; + switch (bpmnLoadMethod) { + case BpmnLoadMethod.QueryParam: + const bpmnContent = loadBpmnContentForUrlQueryParam(relPathToBpmnFile); + url += `&bpmn=${bpmnContent}`; + break; + case BpmnLoadMethod.Url: + copyFileSync(relPathToBpmnFile, `../../dist/static/diagrams/`, `${fileName}.bpmn`); + url += `&url=./static/diagrams/${fileName}.bpmn`; + break; + } + return url; } const bpmnFiles = findFiles('../fixtures/bpmn/non-regression/'); @@ -166,9 +187,10 @@ describe('no visual regression', () => { return filename.split('.').slice(0, -1).join('.'); }); it.each(bpmnFileNames)(`%s`, async (fileName: string) => { - const url = `http://localhost:10001/index-non-regression.html?fitOnLoad=true&bpmn=${bpmnContentForTestPage(fileName)}`; + const url = prepareTestResourcesAndGetPageUrl(fileName); + const response = await page.goto(url); - // Uncomment the following in case of http error 400 + // Uncomment the following in case of http error 400 (probably because of a too large bpmn file) // eslint-disable-next-line no-console // await page.evaluate(() => console.log(`url is ${location.href}`)); expect(response.status()).toBe(200); diff --git a/test/e2e/mxGraph.view.test.ts b/test/e2e/mxGraph.view.test.ts index 4b69bf42d4..0e484fa1d7 100644 --- a/test/e2e/mxGraph.view.test.ts +++ b/test/e2e/mxGraph.view.test.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { readFileSync } from '../helpers/file-helper'; +import { loadBpmnContentForUrlQueryParam } from '../helpers/file-helper'; let graphContainerId = 'graph'; @@ -59,7 +59,7 @@ describe('BpmnVisu view - index page', () => { }); it('should display graph in page', async () => { - await page.goto(`http://localhost:10001?bpmn=${readFileSync('../fixtures/bpmn/simple-start-task-end.bpmn')}`); + await page.goto(`http://localhost:10001?bpmn=${loadBpmnContentForUrlQueryParam('../fixtures/bpmn/simple-start-task-end.bpmn')}`); await expectEvent('StartEvent_1', 'Start Event 1'); await expectSequenceFlow('Flow_1', 'Sequence Flow 1'); @@ -72,7 +72,7 @@ describe('BpmnVisu view - index page', () => { describe('BpmnVisu view - lib-integration page', () => { it('should display graph in page', async () => { graphContainerId = 'bpmn-visualization-viewport'; - await page.goto(`http://localhost:10001/lib-integration.html?bpmn=${readFileSync('../fixtures/bpmn/simple-start-only.bpmn')}`); + await page.goto(`http://localhost:10001/lib-integration.html?bpmn=${loadBpmnContentForUrlQueryParam('../fixtures/bpmn/simple-start-only.bpmn')}`); await expect(page.title()).resolves.toMatch('BPMN Visualization Lib Integration'); await page.waitForSelector(`#${graphContainerId}`); diff --git a/test/fixtures/bpmn/non-regression/events.bpmn b/test/fixtures/bpmn/non-regression/events.bpmn index 7517a842d8..128d1f3f00 100644 --- a/test/fixtures/bpmn/non-regression/events.bpmn +++ b/test/fixtures/bpmn/non-regression/events.bpmn @@ -1,38 +1,580 @@ - - - - - + + + + + - - + + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + - - + + + + + - - + + + + + - - + + + + + diff --git a/test/helpers/file-helper.ts b/test/helpers/file-helper.ts index 2aed1ae99c..3bb55d5dc8 100644 --- a/test/helpers/file-helper.ts +++ b/test/helpers/file-helper.ts @@ -15,11 +15,21 @@ */ import * as fs from 'fs'; import * as path from 'path'; +import debugLogger from 'debug'; + +const debug = debugLogger('test'); export function readFileSync(relPathToSourceFile: string, encoding = 'utf8'): string { return fs.readFileSync(path.join(__dirname, relPathToSourceFile), encoding); } +export function copyFileSync(relPathToSourceFile: string, relPathToDestinationDirectory: string, destinationFileName: string): void { + const directoryPath = path.join(__dirname, relPathToDestinationDirectory); + + fs.mkdirSync(directoryPath, { recursive: true }); + fs.copyFileSync(path.join(__dirname, relPathToSourceFile), path.join(directoryPath, destinationFileName)); +} + /** Returns the files in the given directory. The function doesn't do any recursion in sub directories. */ export function findFiles(relPathToSourceDirectory: string): string[] { return fs.readdirSync(path.join(__dirname, relPathToSourceDirectory)); @@ -50,3 +60,16 @@ export function linearizeXml(xml: string): string { export function encodeUriXml(xml: string): string { return encodeURIComponent(xml); } + +export function loadBpmnContentForUrlQueryParam(relPathToSourceFile: string): string { + debug(`Preparing bpmn content for url query param, source: '${relPathToSourceFile}'`); + let rawBpmn = readFileSync(relPathToSourceFile); + debug(`Original bpmn length: ${rawBpmn.length}`); + + rawBpmn = linearizeXml(rawBpmn); + debug(`Bpmn length after linearize: ${rawBpmn.length}`); + + const uriEncodedBpmn = encodeUriXml(rawBpmn); + debug(`Bpmn length in URI encoded form: ${uriEncodedBpmn.length}`); + return uriEncodedBpmn; +}