From 6bb0ac5acc4d85f266326832ee7815dfde7fbc39 Mon Sep 17 00:00:00 2001 From: Taku Miyamoto <40813148+miyamoto83@users.noreply.github.com> Date: Tue, 20 Oct 2026 13:24:44 +0900 Subject: [PATCH 1/6] Add a file preview E2E notebook with its test data and run it from run_tests.py when mfr_preview_enabled is set --- .gitattributes | 2 + run_tests.py | 7 + scripts/mfr_preview.py | 94 + testdata/mfr-preview/README.md | 22 + testdata/mfr-preview/preview.csv | 3 + testdata/mfr-preview/preview.docx | Bin 0 -> 44647 bytes testdata/mfr-preview/preview.jpg | Bin 0 -> 19652 bytes testdata/mfr-preview/preview.pdf | Bin 0 -> 14684 bytes testdata/mfr-preview/preview.png | Bin 0 -> 8609 bytes testdata/mfr-preview/preview.pptx | Bin 0 -> 37302 bytes testdata/mfr-preview/preview.txt | 3 + testdata/mfr-preview/preview.webm | Bin 0 -> 115517 bytes testdata/mfr-preview/preview.xlsx | Bin 0 -> 5576 bytes ...343\203\223\343\203\245\343\203\274.ipynb" | 1787 +++++++++++++++++ 14 files changed, 1918 insertions(+) create mode 100644 scripts/mfr_preview.py create mode 100644 testdata/mfr-preview/README.md create mode 100644 testdata/mfr-preview/preview.csv create mode 100644 testdata/mfr-preview/preview.docx create mode 100644 testdata/mfr-preview/preview.jpg create mode 100644 testdata/mfr-preview/preview.pdf create mode 100644 testdata/mfr-preview/preview.png create mode 100644 testdata/mfr-preview/preview.pptx create mode 100644 testdata/mfr-preview/preview.txt create mode 100644 testdata/mfr-preview/preview.webm create mode 100644 testdata/mfr-preview/preview.xlsx create mode 100644 "\343\203\206\343\202\271\343\203\210\346\211\213\351\240\206-\343\202\271\343\203\210\343\203\254\343\203\274\343\202\270\345\205\261\351\200\232-\343\203\225\343\202\241\343\202\244\343\203\253\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274.ipynb" diff --git a/.gitattributes b/.gitattributes index cbc003c5..2554d426 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,3 +2,5 @@ *.ipynb diff=jupyternotebook *.ipynb merge=jupyternotebook + +testdata/mfr-preview/*.pdf binary diff --git a/run_tests.py b/run_tests.py index dd25b221..a12f95ab 100644 --- a/run_tests.py +++ b/run_tests.py @@ -40,6 +40,7 @@ def __init__(self, config_path, show_disk_usage=False, failed_result_path=None): self.skip_failed_test = True self.transition_timeout = 60000 self.skip_preview_check = False + self.mfr_preview_enabled = False self.skip_130mb_upload = False self.skip_default_storage = False self.skip_metadata = False @@ -257,6 +258,12 @@ def run_login_tests(self): def run_storage_tests(self): """Run storage-related tests.""" print('\n=== Storage Tests ===') + if self.mfr_preview_enabled: + self.result_notebooks.append(self.run_notebook( + 'テスト手順-ストレージ共通-ファイルプレビュー.ipynb', + target_storage_name='NII Storage', + delete_project=True, + )) # Default storage test if not self.skip_default_storage: diff --git a/scripts/mfr_preview.py b/scripts/mfr_preview.py new file mode 100644 index 00000000..841fc1c5 --- /dev/null +++ b/scripts/mfr_preview.py @@ -0,0 +1,94 @@ +"""Shared assertions for the file-preview procedure notebook.""" + +from playwright.async_api import expect + +from scripts import grdm + + +FRAME = 'iframe[src*="/render"]' + + +def viewer(page): + return page.frame_locator(FRAME) + + +async def open_file(page, filename, timeout): + await grdm.get_select_file_title_locator(page, filename).click() + await expect(page.locator(FRAME)).to_be_visible(timeout=timeout) + + +async def file_list(page, storage_name, timeout): + await page.locator('#projectNavFiles a').click() + await expect(page.locator(FRAME)).to_have_count(0, timeout=timeout) + await expect(grdm.get_select_expanded_storage_title_locator( + page, storage_name + )).to_be_visible(timeout=timeout) + + +async def expect_image(page, timeout): + image = viewer(page).locator('#base-image') + await expect(image).to_be_visible(timeout=timeout) + await expect(image).to_have_js_property('complete', True, timeout=timeout) + await expect(image).to_have_js_property('naturalWidth', 640, timeout=timeout) + await expect(image).to_have_js_property('naturalHeight', 480, timeout=timeout) + + +async def expect_pdf_page(page, number, text, timeout): + frame = viewer(page) + await expect(frame.locator('#viewer .page')).to_have_count(2, timeout=timeout) + await expect(frame.locator('#pageNumber')).to_have_value(str(number), timeout=timeout) + pdf_page = frame.locator(f'#pageContainer{number}') + await expect(pdf_page.locator('.textLayer')).to_contain_text(text, timeout=timeout) + await expect(pdf_page.locator('canvas')).to_be_visible(timeout=timeout) + + +async def expect_table(page, rows, timeout): + frame = viewer(page) + await expect(frame.locator('.slick-header-column')).to_have_text( + ['名称', '数量', '日付'], timeout=timeout + ) + grid_rows = frame.locator('#mfrGrid .slick-row') + await expect(grid_rows).to_have_count(len(rows), timeout=timeout) + for index, cells in enumerate(rows): + await expect(grid_rows.nth(index).locator('.slick-cell')).to_have_text( + cells, timeout=timeout + ) + + +async def wait_video(page, condition, timeout): + video = await viewer(page).locator('video').element_handle(timeout=timeout) + frame = await video.owner_frame() + await frame.wait_for_function(condition, arg=video, timeout=timeout) + + +async def observe_pdf_print(page): + sandbox = await page.locator(FRAME).get_attribute('sandbox') + assert sandbox is None or 'allow-modals' in sandbox.split(), 'The preview iframe blocks printing' + # Observe the viewer's real print path without replacing window.print. + await viewer(page).locator('body').evaluate('''body => { + body.dataset.printPages = '0'; + body.dataset.printComplete = 'false'; + window.addEventListener('beforeprint', () => { + body.dataset.printPages = String( + document.querySelectorAll('#printContainer canvas').length); + }, {once: true}); + window.addEventListener('afterprint', () => { + body.dataset.printComplete = 'true'; + }, {once: true}); + }''') + + +async def expect_pdf_print(page, timeout): + frame = viewer(page) + await expect(frame.locator('body')).to_have_attribute('data-print-pages', '2', timeout=timeout) + await expect(frame.locator('body')).to_have_attribute('data-print-complete', 'true', timeout=timeout) + + +async def wait_image_width(page, original, larger, timeout): + image = await viewer(page).locator('.zoomImage').element_handle(timeout=timeout) + frame = await image.owner_frame() + comparison = 'image.width > original' if larger else 'Math.abs(image.width - original) <= 1' + await frame.wait_for_function( + f'([image, original]) => {comparison}', + arg=[image, original], timeout=timeout, + ) diff --git a/testdata/mfr-preview/README.md b/testdata/mfr-preview/README.md new file mode 100644 index 00000000..6720a6da --- /dev/null +++ b/testdata/mfr-preview/README.md @@ -0,0 +1,22 @@ +# ファイルプレビュー試験データ + +[ファイルプレビューのテスト手順](../../テスト手順-ストレージ共通-ファイルプレビュー.ipynb)で使用するダミーデータです。個人情報や外部サービスへの参照を含みません。 + +| ファイル | 内容 | +| --- | --- | +| preview.txt | UTF-8 の日本語・英数字、3行 | +| preview.png / preview.jpg | 640 × 480。赤い長方形、青い円、緑の三角形、英数字 | +| preview.pdf | 2ページ。日本語、英数字、画像。2ページ目だけに検索語「検索確認」を配置 | +| preview.docx | 明示的な改ページを含む2ページ。各ページに日本語、英数字、画像 | +| preview.pptx | 2スライド。各スライドに日本語、英数字、画像 | +| preview.csv | UTF-8。日本語、整数・負の数、日付文字列の2行 | +| preview.xlsx | 「測定値」「集計」の2シート。日付は文字列ではなく Excel の日付型 | +| preview.webm | VP9、320 × 240、10 fps、12秒、音声なしの動くカラーパターン | + +画像の期待結果: + +![図形と文字の配置](preview.png) + +PDF は ReportLab の `UnicodeCIDFont('HeiseiMin-W3')` を使用して作成し、日本語フォントを埋め込んでいません。PDF.js が `UniJIS-UCS2-H` と `Adobe-Japan1-UCS2` の CMap を読み込むため、日本語 CMap 配信の不具合を確認できます。DOCX/PPTX の日本語フォントは変換サービス側で解決されます。 + +XLSX の日付型は MFR で `2026-01-02T00:00:00` のように表示されます。CSV の日付文字列は `2026-01-02` のままです。値と操作ごとの期待結果は Notebook を参照してください。 diff --git a/testdata/mfr-preview/preview.csv b/testdata/mfr-preview/preview.csv new file mode 100644 index 00000000..0340a792 --- /dev/null +++ b/testdata/mfr-preview/preview.csv @@ -0,0 +1,3 @@ +名称,数量,日付 +東京,123,2026-01-02 +大阪,-45,2026-03-04 diff --git a/testdata/mfr-preview/preview.docx b/testdata/mfr-preview/preview.docx new file mode 100644 index 0000000000000000000000000000000000000000..f269062bad0ca302de5c021f8c21acd33f651d2e GIT binary patch literal 44647 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 O`JWB>C&vs*9{XRkN75kx literal 0 HcmV?d00001 diff --git a/testdata/mfr-preview/preview.pdf b/testdata/mfr-preview/preview.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4df94ba9a09f6111455ac7e2a15917c7e5114db8 GIT binary patch literal 14684 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 literal 0 HcmV?d00001 diff --git a/testdata/mfr-preview/preview.png b/testdata/mfr-preview/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..1469a1c1cf6a9bc6b30f4ad4e78564105f35ea20 GIT binary patch literal 8609 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 F|2L}4Hh};D literal 0 HcmV?d00001 diff --git a/testdata/mfr-preview/preview.pptx b/testdata/mfr-preview/preview.pptx new file mode 100644 index 0000000000000000000000000000000000000000..4cad210897104a88524096e78beaa8fbebcf7a09 GIT binary patch literal 37302 zcmdqIQSf!u&0elv?q%CXFWa_l+jVM;x%N48&a+!vd$)BrFEZPo zdG%*R#`C@r-m0-37b1P+mHXp`QBg*dK57^xy{Y+~zAGs)6f;Eiv-hw*p0xDN|GjEV zdO~(U)fYm9hcRkka~d2xfxNV=qU0>#1Iz4Dy6p1<3LYyqea-VmQFW1(Lj_L0Wji(4 za{tA@@ej6^vz=!Wi1&XQxnI3?QU(pEWJp5(Q@h9%3iL(3cn`b8Zoeq2u=F*CAV~ikH zUzFGpf3+_$6cmQK@q=BcvnyU70IE(k+lkoBC32`;Hz)ONExHR6oSw~Yj$6E zxdcGU$i6-1h5K1H$-?vYzCRyg>vt}{2(}xI(t*(yyAXqdAy-0YCexP>jbx&v5~^bu z3eZ0NKFI4x}9%3RTn?+7B3Ga*60}7yN0t$kI&p zVWNBis6A!p^?U44t&MJ9DjIrX z5}k{$;&xa+K+vJhMUaUM}rUpry+EX2Fww z@2Qs5gI1BCX+nrQWB?FhMW_-NGBx&Qjt2&pic~QVRaXOuu6txg$qu=MmQ}%~uMh~$ zBheb1Zrvcp0!bKCooi@&jyoDjZ9^UE+W^WK zF_?@iU=Kv9oHLEcRkVLBT9d@xI!(Eik<>rfEqNx0v(8NpZltrc=eerk<13|$kB_#Y zL|nRB#u0U^d<{aHEYK$3?C}K<^U+PqFuw@j*)MNyX%lir3K*khF^x}5FA!h?LA1=_ z7v0U$vPi`Q=0^E)U?WND^n48898X}I<{eNIvYkx1P_SRUZmYgL`gqBCfz$WzJbJ5M$s000R8oF@Z&`@hnZsoWDY$AHj5d;^~>Z*QI; z6!PQ16jZ0uGlxa7e$1nWJUYZkyy?XD#ghzjr055spxo62PY34IG9tTtqXGH7Aoric zNRLrW&6C8YA=WPXOVcY(Xv7MjJ({W)OyI5&-A;s7H`vz_Muxf?gNbsCbd`7z4FgyM zISc93*%vG#1wR>W4a@LmIp6A;!F}1ZPU&mPJe3mD3G-pEp#{p%>QcwL3wj=uqtJII zg%*gSX;xF{I3DDi0T0wVWfEQl{Io%H$he}oi-vo;7N$B}37dRq)UgfX*L6hX5oPJU zZh-@C*Cm&fiwhcwSo4)!$Jp})$A`y8i7E(DIJ_9Vv@$D`-u@o*5S@E;q->pYU|s~R zN|aTz4N&wy8-vG1(l9@8NHEr?-RqEK1nTgB4I`(k_`okDJtE4HM~``+U%_epMpo1y zmf>6`DM~$x2tomntGb45HmM40dr zt`7iSk>27}k*ddy7&FC}fU})jujt7B@P*}W+M&AY?}XVHieRg;>rbIz&5+x4g}fEn zHzPPK@0$F;p}H9$X8iwF#7}hGh=Sh*JO={+@R#)2+dI?SJDNCs>zskJg`MqRFUUp8n&ln? zLg>{KWw5PdZ2@0@?E*q!jSdjB4utG0KpBsujLC|GBiqSb^}g`AvBoj*v)nBI-PH3P z!TG@)C;BmnlvzkY!gfzK!LN1+W{;eN<_%9NG6`%lB{C>TXGcI@4^1Df!c^LgR&;* zC~xj29_DeMrmOz1NuB0SZh>`)y9{CRVdJ}D`UPm0{ZxRDs?t~dC(UPr#(3~`$SFS5 z-(RZ%6v{vE^kr}@78wot}@8fRyc>++jQN!aD^opURd1Tv<;DYS^}v*eaS zhG$*KL^>RTfTx6Vk?R-6InA{?!^_GS*B_&_T(_J!Q3plqKx?=G)rswW$n7`w++8@@ zsbkS(m-9~uqP%;vrYer+q7H_O17>f-J^6ZQAa@aeh!=vg-~$j55)$XcNI_Fv0)`NV zfBbzr5e9&C#=1SfT3J(|0DS*AD&;;&3i{XqfFg^0kJP77(QoAQE&OETGos=X=wEq+ zbOBO9{LQ1sZyw?Q*DLoAk^T1IlyHv-XQ)RxD zfjgE=g|(;dfo|kVs?dwFQHIrX*!KagrACS!-4r`q3O_>-7e(dk;Y@IB>sFg?=5=In zR1KteM&9V8p?)US5(azN&7X~bh*v2X>Bi$Le;h$n?;-_y)vdxT!_Cg8RT&ALgS5vI z_!d%zrT<3YyYEHZrhZ2w-x{N#0^X8Rf9nX|r1IQF8Me9i!qS-)%v>LQ&nCFVhv0gy zije=;_-bc}qlkRRH~hbJ`G1x4-{SmNJvYXW{iVyIPZICK`yE!?l6Q&;R2G53{ehs~ z{z)8_h0la*J_P+;$U;ykY#TM{Gsl~pZY<>wk}#VAm}5!ffExPSj4Nd^V>WPE*_Zl2 zJZB~6$2lZpJ<#>~I_sMi&PA~GGF+!(C;2yG#1_nHL77fm!oyA6WF~& zl`DCZ(|aufFvCL}LV=EurX8(f)vsC26{;7yQ2^Owp|Hr|8xA&8wy#*t*_?F0A{a@y zTfxr`N7t~kf|kf)*krMi8G3ubLP_oolGsqAERp&#khNcL)_$f1YYf>)%ev7YC$r+Z zvAW#Di1+fl2R4goEc_8I@6SNCa4{C6<`X4#?_3IitI;#8m)jNX{AcVrx90lzKH48#Ju+7r2IGYX}q{o)7NNg>j zdF|8L_dI;<2D3KpJo^?AesF8uy;JSMR5(^P=}hRQ4~;>ZVHDaFI-ps0g6==nNAfG_ zRkC`wgNT8kQES|pM0FwoEg*S@t4#(KuJ(rLiUsB(+x)^8S;tl|)}Zt(rQLe?xpn_% zK#1Di-f|%*I-JBmF0Ox1(QCc_Wvk`|K!U~Ssg#76@srq%ReX+ZOy$e8kWDyrYPbbg zLhKm{OonF$)I8e&5z}`T!)}ylZ?|QUgFpGQYRr))Je$Yd85+Fgut+v6H>uM>Ua*<9 z7?$+;=>k_-q|H{j(A8{-X*`LgW@-<>R7qne6qcHu=XFHP>)l(3c zh~?U~N?B|Y+n;zA;mONC@&sljy|GvK`~myg3{n99TrgNuPXqmN?jqCrSqc1#{&?EQ zWHJ{%XQ~yj2%cV$_4F20;Qg@b&_7Lx7=PPh!YC>3Qe{M8r zG}}ZbqPfJz|GrJN`GYVV0_auUcDo6cD#?1e>0TdmY>bDHkq6rW(EwBlak;Zwyqn$7 zwL?{_o>;~RdVm9{$xV#-6p=+jLo;3JkQYp^HvS}VsJ}Bsa-Nc@!f(5P-;wB#OpfsQ zD%$YP%Zxt`H8dj)Dv!BVFbN?W(eKsU4JMo{ms(O1p-h$#WW{F@#iu4psNR3xU|^H9W1 zAa|=Y0OrI>6E!*fa+6lH9dPY?z+a%~)L6uY#02U3~r$igx^n+B~rB z35GHNHx4sgx+t~{8Iu!TjG+LH7L2nN-Y9t4x<5`g7tzQPW|oF4u#%z^I$(rDfZ^dn zC(OPAVFBlSg{WPZKjiI4#Gy8dOM*&gNP)SOP4lo>0$XHcpoH3~J6BqNa%H40+a>f- zA(a6!BTM&E*|x_FL5Yh+JM=s6(^d#2#J?f$sNm3{if|D`+B;_K&3?CWgxUOm~`1^<3A4Nkc#4(%B@_I_n8Qe|1S{}2%^JyCkk>C1c z>xdq@p$iyw-zwa4J8`R(rY}E=yqc(YwLbfK8713r55kuhbx{sU+-$r!O#1ui$$&B4 zSmYppAJRZQtb7|Npq>#)+eb*H1%DT$pCdI`0IdQz9Eolx&4BhGb3=u4Iis?54w@{d zc6GCQv9aDQz5u$?CL8kH2I`O$BsvDWF zwl$d#dqyyfv=K{97R|}8k`P{eO(rZvd0LHB*+?_*im+w)4`LQ$quQT>SEgAyd`Z(M zXLI5H>$Yg&YP9QlY=?SVD6BymNV`O9TAJrh?rd}}!=`DTk4PJObBTkXX}g_&iV9Mp zkLE(NH?s86(J=}+SDRXX5dNe~44yxOUVdWM$UzURlTZ<&@xjbIm4Y+#p+1UZZzWLn zVi5=wDptxRFjhl#&FUF1JzLvLRG2Z7axsbjf*T<;2x{|T|-u7+thMNx8ZTvyb5BAN%0XlC>t_l zIy48k6?B~Mm@WP*EJaiFB`H#Py0s89rS7#_POy^nrgOMH|L}Ye$t;`h@*(pA%ljhh z($cF|#O4Aoegf??akmegzze&I-6*+w7{v5NU(FZ{zLlRcROXPD(5=6ru--j33gIEP z*dX)H{H9vIHTCKMNO4WNcW@;b)VC=-vHzhyTsqi@t=z8L>nm{#|n^3xv#;%_eL|yKQHkADk;k!(XoZ! zKDX)n_-l^%mpO1YFtj#Na`vz`ar#S9V80~#jah)dwgHjaST_p5!D79Fj06@PHXJM(^lPA?J({)( zc^u?DoXSzu&ZdjZ)9u0Xot%WiY{YY0cznbQg~ugjq-cYkRT`Iw&tLw3dEQ(fA6~{hLr0(dMyUehcL+9RL8~e?66x zwS}>XtbvoWiK7$!KVAGoH8rnn_t=oWeB}v``S$yIsKbdKhSZD0GF|KfoUvI>fTxjc z&V;17BIFWyQI_3~vF~YD-&|wslSGMc2C?I;$_qc zh^k+m^`{DH-eQzUotknM(({Zt$7P{wbC7fg#w9^NAVug~g0$J~(OAYV4!v$Nt|CuZ zq?bM7XwYd=8WDOpl5%`mr$$F5sI!SHQ7V8KU(Z;RyBZ^NsQy04UYf6&}-GJAe zbl^G6^`uRS=_<5F!5@teS0+!iiVbYVPWQ^%(V|KfeBUZ5sz;@B)t>FWCTh1gVJyCEsnAX#FKY#amzpjYs`JgytWnEaYU z))=8VGDVYA8Xe&$1P3$DWE@R(9Mft%dX&OY?M!lKI;iL)_KWInfvlCPN@R5$<{!(= zIGgu8aJqa2m9Bsp@(o>=evA~Knw(|Enj#nyKT6fS#+T!y(gnW zOT&US>4(n;2-wk6Y1Ct(RVpq}kX(g|dRB9gUxSbf_Vzs833)fre)3g=xt<%qSV@26 zu{P4qWTsY3Nbpg$h=m_Q4r4BdqiCk!?7mr3Mp`VIE7O-2xsz7!^O~)mD}I>Q0fcab zcsFZozTJ#Am4)Cqh~25E56>Y^#bZmOp-D4auzFM*_@4q0EeI*n7mL>MbQA=B))2Nj z#63pegc|{!+}Pi$?G)6UiXpFxvrvMs$XfbI{_sHH9d^kMqmn@g2mU&XEkg%aEdAAa zP#*Tu+pV}c=b%yvnrx)1r8Vod6R$=?c{{&*o_u2#CQgsy$2--3SNKMs$VZnfG?`6{ z*QM;uwn62yMHwwCm95m;Dfs**aiSdPf=`G}k2vxQ3Xk*<=8;y6;B6Hj?g&i^D=Eo^ zYMWuzmL_M6h9o?;=&6IaAnt}z)+xa&I%dq|!gstN_%ksTWIl_T`*4~%JJ*-(WWdPCss+$Zebnj5u;U~j5mW7x zKxWngk-IoJfQ8<_uIfG-Ll4WWW7}^yIQS#Is<5NIW)Q?XFa!bd!9e835aIH7+*O*W zQ9U?ChMdYDj^w*O9`1^_o_dV;61Np5XOqUAXzdC~Z=XOfQh`U*E{78^s>RAS~=9-(Lu zqAXIf^tL%zXdsNqz#evl9mVpGnp^~7!cZg(sQKTVQ@7amp`Oc&4cmUzkfzE@7$r#P z_nqpaPZmKUKNX*Fd2n`z;q75s=hRSc_#W`QI|ilK;pkU;&RpC-aNA4zBHgZEadqp0 z(B0gFaN7&|urIe^x!PyoHf#E@uePJx)LXcJFZnZT4GC`_WYW0(RrHy4-O79rt;tv;Tl4drxy;-;aF6h=M#jd7cJKOuEwi>FLsF7@+OSi zT|~itd+jA)7co83@W@jA5t`G?&_yAbp3Z6>>kRL4Lo@k7>!6%q*(MyXH_7k~c8X)? zIQv44ZbO3q_2`EB7rtk;GSN3o*RDu(gY%A$bI5HWJ!5&fj&F>-!aj_meNS;s&XkKOtC zl4tLoIAP7eR$w>m2AgmS=3vo+FF4%#dT6MCaMCBD?{z;Ltol4)%`$(oJl(LNP{VsveKtl$`GXzqTRkhP`TC*O0**MwE~n6A)zLKdU)5C$5>XjfxC*Ut6KoVm z*%(*Y3azmdk|<3~WSXQY*9MGLq%=?yE|f+e88OEad>cLHlU-p%jsV`41h<80X_U9f z`Om6@=mzaRK>yWQNr(SX>;4|ORDKVyiT*jPG6o)YF3$huLH=>U__qmZRGW!UXG8J1 zQZqje%2o#ii{ia8h0*28TrqaDB)@_hwju*kkaRtFW=hzy>n=LfL7UXE)ZEox zCLVwAWIUz@1t>x)Zfs4PR3?rwW-TdAWalnR?cThdM*@X6fIJEM0y0h7m$et%LLzF? zcsIa#_hP7E>^xepB1ygA4>1}B^y;WFUng8XC0Guc1Yl%}uc)||7DGENIsrX!Trhfs z4V~&<8_Hhg0*z$MoSYw#$Z(A(6dA=}yo(4Cdgz=l^Sk0GP|-)N(hvEe!WYH#aqS^r zK(uN`69u}NewATehKc>z{8hMOR#V@rmb+LScZAu~InUh%Qf3SMSW^EPVC{+HM}e z5msb{94>Ce6X(brP)IKOeI}WU-S*Fq;~&&hkYI-$iv(dn?AL)tq{e@OSNnOkPFL`^ zp`gsgj3VQoXqlM|6({DC74CkV;R{O%Fc8;F(P*w*nWDuPN@0*LOv1aQ*ATshp@_54 zqj(AzZ<`26cxZQ0!x;^$3ff_|;UVUcJ*PQvp+A|G&)Zm6CxO5vj9cMn~ z&nc9AtIYte; z{Cx@%%Xw=`ld0NTh6IwF!trPLmhj_zKOC*`|fgjZC{{K)kLm z$DZecA7K9sID#eiLl`)zGB2EL2XZ}HJZ-M_`+B`N<5w$DY2Om;4Y#LP@%pKn=P$DB zj^QbZvQ~Rm+{BLycP@zq=8ARi!yle6IotJ?$E~o0ZxWd1`t;Opm8kP2TCR#8UQ&SJw;-c1v#@(#&}qJZT{ z+c4DfS#NrA*a>3uE!*Mk->~X$vJ=+)UH5F?Xr=w%)&D&lI^cQ<5WufD ziV0|BgwFJ%C@&0UaI~ZNxXCbHkLdsWhsbtZiTP8k3iMaIK`(pKR)T_cPeiDmnVP^4uHF#i}-R+j)a zohW?2q))cgAZoG1Zgg+{0Qgq|0(_jqQhl$ZfPOE)|4SG4za!vZo#uqPPRtq`g6|b2 z#6yof)Pt~O1EQV&NO@kjsT-mlTz8VW76fS-$;C1y(7xt{gJZm6qOphHDwjX-^FUrn z>JIze#4nsKpJr;zWyNm<%8FlNn}L`o-L#je&dm({oF616_y+=u^Ldl<-PF3;E6L*z z*o~*yq0Et!GJcgds+MI5P}H;1hI{u}X`a|g(@Evsm#g<^|C(BL9?3c4Af%C0(8%oM z5Y47f5fwY)SxanCtV9&VRKV)gMsGZ?TqsumX5ebnj4zbrg%ww$axO-rKO(Xg?~bP0 z>Ya6u&Fpluj?26(N`ndwACk1IYj>X)PX-|z{o;pN zCm(Q+p1Bqgg?+-}yCu=My#}Nq-7#Cp#z>D&y9WG+xf&rdnX-^oW=q}E!=Y{jE{v$- zz*=(?KW%k^WGaJ1<)7x|<-w>c{e(3feebzvekmB}1x40a!?+PMx2$fe-70XXO!SoHk% zuwX+?V*qRlK8ZFw!V*800N!ri?IqDS1{?*}-GiuqZs48j9|UO60r1F!!<7Qbfde2e?oYh0XFeectj_~r zJFROzvjcej3}KHUg0AVj*M^UuiD$-fY2x?#`HqbLK>nFQ0d z^&zTP3#s*3+;z7##Qz?kwV=3FjZOavvun)eX0NZer(tds1;m||Z^a$15I>%wpFwtP z<)<~(SYAe9p;^HexM`E3ZBK85MPdJk50tG~Jog*6vwy+%Ze@AVO>KjJ2x84h zzSs^2EQ@`RqSwJwLUYAk*TT8@@bt;f@8k7jZOd#}#eKc%6#FS!c>}^)Bo{Y)&*7Mq zqsa)pkS#5i*ef|SAQOyFNHWSS-0!2&!b^u`1ccS*{>o#^|Ie`~wC>-mT}Y2g(V>U8 z`b>>TLodp7%d7%qUu(V!T@DWfc*B*&()waCH&}~GM={vtExl?Yla#98Au}zbD^p1! z4uar${n|bKw_Q>HjM{&3u>T7*|9{l}g`58z(gLa-N7{UQ&E)SrVgDUznf`k8M%5X| zbS?y+F1_4bcwZtQ7`Vsz6AYZo_0)!u`4eyof_9Ce8iHwWFUK1;hks$#5=ulP=qMjIIbRL^ zt9_qYGLpK%$O@E2gxJjdQd#N-GnlE`K6)Q>uVrRSip;X$zP#mUhyXsTv#i0k2eLZx zEXRhg!>F%nGRcs1a<$cZ37Uw0L?WD?YVa6dbavn%XfoE|B_EvR1xFV5`DF)iMcneS z+E(kd#}T!rKiGojPBKMA02z2eg#y+HmV_@g16#f6UG+A#FY$RNdpb6tgn@nA2i!TI zvuVwSG5Ph(6+ra>AbQ3#rh3S4YR!Y;fPxp+;)Ic zf(rI}^$Ex%BJL+&IiK!Gwfd)EVCadr%&U#3S0tMm^KF@tE+$2BagTTK&q)*cd!zO6vpxn|wmH8vAU=d_v1g&t61Bym6Un-LRsZRT#9+2tC;| zQV|zHBLGp33Adq_rEkKa(blv*w_yg$Ufhl+{Bs9TM>1deD0U3IfPC&`?>3_SC&znc zd1ltM$}UXa&)V*aeBpczO?|p+(goLXHABJ~=pnN!KC@N@6hp7NpbS13XyCyKJ|!mdGC`juW_)F<0PksBjSOA*w0=s5$R_T z+K(3{h503AuhB))Up3e?=!&Y22HJ9^dzUl8G&@H~paLy$vW6s^&?{L|*}2-38ejL$ zn$h_?eeng#uWQ_9*?W_eH()A2XTnKFoRJC~cFBByx9&K4UeeV`?wihVz|4{87VM4D z7lGgPY0%YNoPAQi#!SQeoj_W}Lz8KgPCBZ(O_1)N6QgAyuIat%E+N|fYQ-Y+<#_BP zi1@>Fviv$D2EFz?_u?K#s25O zDpLPK)9Bk4s{bF@Lgs(i!Zq8!mbAB&AWlQ7Q52C}piWVeacqERNlNCx^+{IIq;SP% zt2%N8^sKxx_(mk8>TuXCHYTARi52Jlo8hhhO&LX13wR*+v=zKjkGMv)%c5FJ3LQxcMoOsw$gjkLMuB|1d#-~n0 zm2cPDO-a#ilV}Aduf-|b3c3TP!Aa?;>i5isu9xmS;^HhaE2R{}RUwE`pdqvABSW8N z(~JsOqwFcgocM!DnqV>0GmN_sGtxuJjICOY)6r)it;L-3dkeLH$H~-UNBm;=NMd)3 zLSQXl?5ZHy$8Xmp?{_1+Zxv>6+3}7VrI*=uwFne zVXZ?HTck7XvutYj2ximLtt$h4YUGr&o75qsU_8%M;nm&LURVLQRc>q$ zPu)su&NsJFHL5??rcb1(cME!jcucw*;zi_$vHG(r5}bqI16&LuxJ|H(Y4xWQ82D=1 zc(W8Cy=AgF;!QVZR$1F*Ow+W~+(ePi)KEG+tGaZ90;#QJkc@RfQ||C;AL&cUFhJ_4 z1I|0N5S*bfb2X+u^GecsUO0WY03qVQl||B|BRdt0UQ`IO%GCe`9g?;VKC}cj9=+E+ zvXx+bnl3S2O-gw-WHDDXo~mmAri=U6I+0}qy62f7{&R8P)n#w>y0^50STbu;dXK$a z9OUR*k#Ym(upbrScLy1e;YUo!198Fdyc68w$3-YLUUh#-Ri>TAVp#@SQFUMe1vlHT zV3F6MJVzuCE%gw|)g>X6T05w0x;41Sl2;<~2gx1b5!+4t+c`Q4RG%0uo|G~Zi0W>4 z6Ys31*L4GZ25b$;`9!Fdx3ylDl_KpI5n=|>Rxa6*t!38Jz_vD)=e3#C3kCDlXAT1bo*W^L8 zj>b(2I(Y&m4DT6J#o z_2?ULmwWMb0kuv>@SWOZ*oW@>LvxtTniNSg!!k6c_&1v zUHkZ!lx$^moBX>d#ErDCtS8xy=uXSCF(M<@>Z4tn^0CV=0Q1w>U{;r0Kg8u4tJ4P$ z+?Q$b+_eWEEKPpPnw*PEm(U-NXzc7(nZ$*BKae}-Q5N!~;{rg=Kag6V(f_q^{l7=_ z-<>-Qz}Cj=p5eumzx&TDcVYKCW z4DeKo^r>d{syYy%M00jj$7`z@n~#vYK3x}s!o<)o#8~N2&&@$j2!um7GWr-2m=-Ft z9440(Wgv7=rF7j{DsDJA?e^Vf1@X+mJV-(>vRh)T<1j%#pFbPb_XjORp}&^#0ICX) z)pl!s33Z68A{C@hG;GKoxq;W5ydMH!u>ozz{IFRNYfU+HkLH}yRs>qFREh4)Ycn}9 z1C%N{pErY`U14-8m7q`SXF*hZ^Bv7Xv_@pk;8=xSTD;Ro$s7aXs!KhB<_kWzPJK%NhvpyF(X5{^O2@CfUW}jdyo5Qms#eVoCG(d?Q>6W((-#NQDp+xkZ#nQB+z_wCM%yhLw(~sUc4Q2zd zq|gl@(zRAM@&d1$>(8=nq$qvuWfok?!0S+rZzODtK@i#+cj!gq@-+sVb?t}IGAzI) z_@J^<;hc|Tv&miLLLu`oO3HFM-Lk|Q@<|q@qmZJisee3aF8Q>V*{u8#Cx2##7nxTt zn)al8k@(T;fIr2Og$aD^h7 zBoD#(cZZ&l4I#g~3^Y`9Pu^qKwJ-`$I{bv3aLL}^RlOS}&naP}GPknopPKqrBrI{9 zw^BZG#&l*n-}tTE~SbA@8mH^#DcVUIi1L=es>% zU@T52WzBN=bgqE(?7HiQ7?E#};%3)*+7lQFMoDg}cq6_z&Y^v8II6HuX%;xKuQD3p zsSQN^DB?cg$js=F={Z>2|2i`b%?qE)ce-Gp*v6`sPrDw)EfewM6Hm=eI)Nm_V{*W> zd~|GxOI#CT9TQRK3;ch|(Z6BxpTp6Ug8taOZ;rCz{P!GX{hOm28}WI6b2Miex*7ul z1Y&VniFU)*Mn&Fj>6k|V%Ww=1fi1jga#4B0>Vj{QXM_wQuW6OTvsUE{w%`8t;N2Hz zs2Hy&nk^4?HA0QTLVF>H(L=+pU|iAlPbJb?3JH01dS@2=j_IGp{LYmq zrp%nM_tX}CEHXy4L#Y`M7OMKm_Gu~d?u>@PB?^3R(Wrg9aY@jZX0bBThM+%a=O<1D zNlod{lYpJ9UYvOQH(q|5oYHmVPI$EyT0y(8F5sj>(`w3zO<1#dEE8hO+PX=kKY$&s z7LAq_I#y5AS~-b@ON4`|sxG|V?#77ewInN9#4`C=Y)Tng)VHB0tUf?VRd3|rrJbeU zt!fx<7T*Zj+>%@!kX#mN!we9S9=In5N=5&U;-}U5!)9X}fqtqe#cZJyVS;%~!p;Zp z5^Y8#139U7iL7RjCZfk8$cjWR^cL1iAVaN^B1(*i+D7q2K`4pGZy3sNLrBj`C53F| zHNLv@wsBdpUS;_CdpAtR97`JZ+(|^>MJWY)0{ezHU^y;+`oV-XsTE9n2()`;T+Un& znxJ8vYYNhPYEzC^_o4>Z0QP7mSgOf=_6byLjNuP;0@sL<#sZBG}N4>61gBKY~}6eZY$Wcj?fU;ia%hH z*1>WCF4*eT0gX2M8pYk7uoYckXTrrU{jNQ)ur!wXsHShfF8oDdt!u!}T0bQTp&yyj zRz;w`KgJXZRWi{=!r9Vq$u?jtsn*SF{iSM$km`gLN69a1&sAkU&KELhy)C@|2i$xd zQkx($pEkDRqsVgE0-ye3H^axeK2q}0VYo_rO&kW?q`B-P=Uf#MKXIdMET~Rv!1c#t zmxAD$Rv>XRPJGy5ZE`%Oq*nKucyBBjq*d%CPB>qV5*bmOz}J2$YY zrOZ;0Pp61fnbL^8j6KfDpemC;;9jiT(uaTUEmL$aX3Iaay;!e)R3Bz-mfI*|@`R5* zK3Ksf>AW^dce$P{(S5AOuf3qUliez>8i7yE9ps9oX~J6H_p+48q{ z*8Z|u&$F5mfM^r@0^7tgzz^MNJOB$q@GbAM8=6&)GdBLkBai9v8>+)b+27)g%swql z0(24|S$W7B50yo09Z$+?Ky(O;Zd}JQ1_)gXUR-T6n^+9P;y~J>h#rI_X9jIZ zS$Ke2V{ajmUXRO!Jqn1Ac0z;~xYq-cSFN@xXlA&fl9DYJc?6RoK&P&nV)N#{bi1S| zYm398pAeImAOup0PBc5ZKC3Np}y1?T=U{Y8D7D%%yG$*T9-a%#F{N?jwW<0b< zen!vFi)bMg3tSu+UT+SLlAXa}n``7dl|Q8U8;T3Apmfu==b(72YvfH#ZOkR+!2|gX z>QmV>w2LWI=6h@ae2|v)mfatja{C`W!tUc`1LX%v6ns|wp!-I1cC*};ESzg9Rr29a znpo$Ae6Uqob>noX2b*9oAmzyMh;ya}k5O&t7Wi2tHx1Cz9juJ zOsc5aafo5bNrFov*k!+ffl~mqHC?0jhFc5T+X*AQy?0v;6u72oh1M0H?TG%+#xWaG zv>6oSSoKH=AY=y3%?gZeZEGSl-4hVZ^TJFH-5^~CP3(HnPZZS?oV=urG+dEOuHVgR zc%PVAWSGq5u#eY2cXk+%7Fd?09WGerAA1|MrzBJL&j9?~7>WS!zgr@){hnPKcPIIBZy2yaqQ^+mB_PH8!H4nYf zGpetGB5hDlixisw`4U<9ER}?kgxzCckCCR;JGe=J1u~;=Z>{gYSOrI8Yg&AUP*fG3 zVW$&2e`%D?85gV4rMi(&r()l9hiSwiqTxd2thY z9VNhs=Cug{}kW-?l7BU5IT1Szcvygew}uNxcON{EIgB8(3I{6o^XXKcNt@_TbF z*#Q}w!Tk~BmsuoLGeuR;_qUifiSJ?vd2Y^klGmWw(0g8usnF%)F4ova`H$jfp=kv5 zg7m#98)&gjAtet`DC%pq7pseMesN84m34K4zj?Ll7ap)XS59|f?dEm-;pi4h(sp(G zZn!y^E5cZ-?Zs3pM#F2`dAqBeN9Z+N>1js+(oFLN+n&s~&yuP&Pn}G(Zo$LC%6mhh zbG4@$xkDS6xhkYxdCF|YZ!Q<&5Xk3JvEecz?YW$L z88A3*Xj<&!IV9psxx;2j+>c)g!Ar_2BsJ-l0=27?DxDzpL00uSn;>0m(SNvA#z*M4 z6>H1#>}L~IS6irtT2pjGh~IIdJ)cFQL=&w0pCjbTMf+LJUa?4GD&_R&QhhQiQzn`l zzcdX3*&Zj}#1xM^U_x?p{^J)X|(RmaN5cEwJYAKTOPMztlDZD?320DVvR zLVb}2<<3D%k;n6t%+lb%<+zT)1(ANv75Lrc43(otF$s?6d}g>2Z$j(BzO;>lBvkw$ z$1Go40&;lFgqW1N(|5P!-eqr@y><6R5zR$!ViL63uq+duXkn*S45$CCXD5@;Z9?Gq zyFRN@BhJwkK->&Oni^{^4Tytu9O(= zd(}WdcIoRUV+eESQmx}P%(z~+dwpS{3ii1@PO#RG*Gxt z$=>KQ(;}m;2!#g7QHg5iFm^CuO7EL!$opS#>uS5ks{N?V`+&$e18w%c3+ zi9+%ZdI{d*7UHT~F@t3mUHz*)Y>S)vnY`*P(JpN2E#Ou*Mmu0czRHZ`A& z6nw*84+{U^t?PteA(wF{LSe-50GSqn@vndI6qVG5p+vg7D`?+-N{+p9?AW|->VBx^Nt71@UMrH z=|K=459{Hc&BwrT@ZEhN`+#-VZa`fT+QaRJVzv0z;CRkty}7eCZeFHOXeHdcm$djK z7qxy}`#-sPXPtG)#(oXG*ry@4W+Lkl$7FLN^87?Lc@KdHJgY%W6~E}!K5`-Y#2KOZ zbj^2nwgIhjK#t-ehRCrJS-Kt!BgPma9)nH5@V)x9G$B&XO5qqOc8a(<(!QbwXRz4< znItf{Er7Wxp&AWNZZ&_Vm*LmfK3 zk#vi$TCB!$H$X`W^sVOxu5rMapF4#sCPW=IUx1S%8Mn#$|;}jh%*(7X}uw7L(YTrP1ZmYA~`n1F@ zfkfF^+p2+-0Ln3<;6C}{00#iATs&f4RW(}RyLtjsuf}5@Rg~N#dFBPoT>icfPJ#bQ zSb<*PUMQ=Zx0)pdfIDPa~C z1TGUT7NZ>e2Ur^>_i2{1J1cR!I~2rm$B)ZXwat&9Rgp&xXtQabX0gkywJO4A6KPd^ z9f8JD6sn5T++=#K_LmB{h>{(2rtb%fOBkLzYO+z>iJy{J+Ov1wXG}Li@+Qi;VuRfw zU6L8oigug>FN%nL@)OIQ;tC0Yjs_nNC_Qv(@r|IUHiBw_9yFi@=M5^z3<-7C43Y3C ze8<>xddovp+&uhMBH5rsuh_WhNV4xdc2CbM7$C`ZATZ&sy~XOrhVm{aNS>alQ}5kD zE*;P6KGvX19HItJOfPNr`|wti?^9wiw#P(9sdCbwGVj%W$j2L#1^HtL8@o}wI0VYL zi&1V87)>UhTqkg!OfZ*>*hmij-DF-QoMGHLP`9A*koKO4`toIdBmWg7PDVX8rt z8}asDN>Jz3i22p@?E%Va*@L8GJRO8tDHPNc9x5b7{A0kjAzbU)EXTEA2;UST!%b`n2 z{uH%52!f%T_u*w40Xm}OT>^JmfXYrE7E;*zckO*puYU;I`|c6L-s88^T}AD6tl8M# zbt6Y;cpZ3mrl;D-$P?BpX0z|eM$*~9kVxDz;#Li1KqESTq-lFsCV56psQP#uFm7Q* zINKn^_%lAp7MLi4(m|e_WK|KgHhVotim2d{94p*}v|E<~I~$na2~-FFz96*8M(1(4 z-Q2EwrN#P-x(U2Z=8PoLOs>TD=~2 zmv5|JBIHUkUxaCEc0F3jyHi|& zQTf4@FQm!-7+sTyistU98C^h6t=hO{{3(g`1}~EmAF^~nLDNIU$WFDgTR;id4`}fW zh|FYy*xfv1KwVB-qY$ZoPgG;sLNR(vLY`<^F|WJ0D0&3s^2C+K^Z)n4{d4vDzq4?& z_AuXuzlI2hU$Z;^Un_~|{t+W=|0|Kc`GyMOYArS)=DnLC(Mns4vapY|qdaFbBT_S| zK=6BUPR9^{yV7gBa}wMSF|#X2K#qr6LLpc!E*D1RBPsQZAvv&$$-%A@(B+@;vK`(@ zDDld;;-fWYTt>0v(mUxrphk& z%Vl;~hf+iYEkB3)v)x2xuVudcE*;5cj0lXz*8@P;-2Ni6F#Q&$~s7zKD~_ z1u9uV0XS^YL#qFXIL$dTRMmoe>u3s0N#GPrfOhA*5Oa}^ZaYi?#3g^LFFh56D0CC^ zh}58e_SDG1Fs;PMwy*8CRckyHy*y!ad9Ec-lVO|ce(4|8$C1l%VfB)V^N0%ki^1s5 zCdL_aWq^;l=N6^x2}Fh$R{#i#JQQ)5v*D6`+H9 z16KX&>rM3Pax`iw=+FiZ4Jz=@vh0?F4eN@?oo4z)F_sB2?JReUdW+nmuh&h;*9IX` z8br-sI+p~S7%&TRSD^K*7)C;5`yhlQjm9{$VHNwLeKrB2lyEnhY@=#u@Pi0jxdp8h z;v(#O5uA`(Xbf7B&kOU%fXP5LA+>&I(Y^6+O^QipD!`qtd(Fb<(u7j<}kQ*HdAwpmJMP$DSD9OpWN0SJU9 zBbGlgRs+Hf3ceain~+K}C%NXak`#)|KIx9tD^HohPE|M{jnHmHB4nk!By!XqQ$qlK zuL0m**fjek%cPoaG_ZQV5B@XAeH)X^qddrV3LLmRlf=d$@$ijsiRBh^1!wJF%h}=X z>FRR}U+G4t478OWr{w~s8WosN?!F0zq4+_8ZtBCCh5fPY#d_N)_|wnW
nLIibK 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 z�ubl;=r=cLtZFp*nUo2H_+7Mwl@hmr4FeWS_cST8XlV+-ZXadsK`!lgdUW7S7R2 zY_8ot&|nblkyhA^iO16}q8_k@zl*O9YK*qjo0CW1#<35XVPJ-9BmgB62$37_hYvnAkSl1-?HA5WM9U%@La7A%gOq26#G`)AZ4r13Pr3dkhr-k`h5rYSLFP?T3dPWcquto2Nj= zn_9uE;e)}9b?`f$qldd#NHDL@yuq@(U+7p{W8{%rcu3$WD0~fIn{Nl!x;z0~+KE>b zsa%1uZISWRAay;a^C)v&vHIDsJlDo)^+FRRrCVX0YB7U#uFn^B{`OKcZ$z8M23d^;p z=Z4y)*?^iy#mD1oanbAt7l*wo{?Kf`50p6GwX>-&dln24TgZ#d1$9B`+ZclS({UzJ zI%86^DCXzPs3^VXlTw1(^w%>bGHHikP=3TpRU=6QMLEXtBUVc8NDx(Hl#`(|NHC?S z9S%wK+dB*Cx%oc)RkRCFS{im`^lUEvxq z$r#N|hiA8~C~(v{P=T|~yilXNk100Cj-wK=snT)A#cw(Uya%4WD=O8;YAQnW$&9S5 zpHij%ljH*NMZ}7Hgy1eI`b;Qp=R~!gNMwH+gM-?N=A`i|x3QJ{8FvDbxv6SnX?A{{ z)jq?LR-*b3CTEWl685E~iKe>atU!Dh`zQTK-b&MpkFvZMM|PvFW3>*8lC-T=Pt&t2 z?uW-|r{5Qw&2L2UPwxy)Tb?pJueaCB?;~)yXT03kE?JFRo=zUxt9esfZO&#_X`Y^Y zGrZ(A6^y^;P5BG!s0grS=QUx}`6FHWWki)@>Z)Zslwq=0>S(GZxNIiiHg}Sua*Tu* zqr>MJ%cgVFZF9xvlYe8@#eI=f)ldbaG@ zwt|a|p`GSmfPJs8{A;+bjm@7% z-_UR(^1puYzH`WN(%Lf<+x{364>*1-I?IsJJB{@tkp}#Kc-;&>UXa6Pi+v^AYH=#d!Aiu@^=NZ+c{{!xCLVq<@eoKDaqxhFl zErvgkfBWixHW_`3`_Dr2SpIXg~KK$iE5w*+J_q?mr8~;{OBgZ$f{y<$6ng+u`b$P;7xekbe{U zvx(1J+khW&syuZxc@BlQ0@=7zX|jiCM_gt+~io}b_5AJ2#Xd6xt{{|)im rF8$|o;M-8pFF_x?e!K4e_rQ>xB%$QS0D#i}uV?=cfuYMF literal 0 HcmV?d00001 diff --git a/testdata/mfr-preview/preview.txt b/testdata/mfr-preview/preview.txt new file mode 100644 index 00000000..7af927cc --- /dev/null +++ b/testdata/mfr-preview/preview.txt @@ -0,0 +1,3 @@ +MFR preview test +日本語の表示確認:研究データ +ASCII: ABC xyz 0123456789 diff --git a/testdata/mfr-preview/preview.webm b/testdata/mfr-preview/preview.webm new file mode 100644 index 0000000000000000000000000000000000000000..0ad147524e6e0ac52e0543446b12c72a301560c1 GIT binary patch literal 115517 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

-X^+)F~==l(RsH3zLnxJmlQ#41@!@Hh&LJ=FNS0)kA~ zgKZ57ptJK!507@bGwRA?s~AWOj&n}1E<+!jV&Qsk&Ckur7p%$q07cr7G*qN)E`*`I z1}ej5aB#V1>9C$9;~7-I@OE@sK>Ch^wvr$t+?zrFQ43nS~wDY1RtOC^FcNs@tS&dgu0~3AJ)Q+772iJnOjm>GM#^7uU7!a8tnpg(d zu@!q^?Fnm*AV33h6eL8h_=qZ*?J9g7E9Ze;m_P#tVcFJ$}LaSz;eO-D_RAQG*Bcw4kFj?<7vVCz{r*!h%g zxvHy?8UwrCaf#_p*!oWIiHj>r(8BuXR^^GctT^-m9YXy=anz}(a9!;!7qX++rM~gR zhUvdFm@{_m_qOPaN9D ziw>MzEQTe7fBCLo8T4Hp(mRAH3GCxJOf`x!YL29dm&==toeg1Wd=Oi_Fk-#8lj zY;2<8d%6}FLjrt>#{NJ$UH~S68B_MrI zm*bZsdwf18%d;8)060P#ztW27?Sbw-BvR^6sD@jK&dz3?BwJ!_d z^{ZZF+!sNq^<6$*ij*&kx* zJj|Ys7wcu`Pa_2gtSnOy?DRUpbn`OiyU59Yg3_qGp+lfbv9Yj}S(Nr4hR$Q)9K=|6 zcn&G6_hx&cx~XWji4h9fbI-1zYoPF7P_VdK4+XhUf79295;(#}oG`&>$N&5CLGh1* zZM@Bj69~krGgt*9h<2_>K@hg)UV%SLVu7jw+qM9hoUQMfVs=qvsAIF@| zv+duZ)$%jU)Fu+gU!&Q5`Bqlcw+Msb9U*81X z)HSt(X0pqWdQQ!{Be5NB#vx$X`mO{yO%U#yf6;UYDnzHicvR}JEAt);yzW_A>Nph- zp@C+yr_P3yEd`t-Ek2F>`&>H{cm$MD?S|ss#Vp;CSK@Mk0sewdqO_*VO#HPAYr4kG zqm$X)l}rey;8_>6+j(8UCUeQ}fOQc|4(ERzlI)rmsRGo5O56?QCv)hdWd`5BT9u;q z^m`E(fPK$X>NSOa9kOgGhWD}a>XUhx2lWyUJjrUBw2hzLf(z$8{N%|%^&XUxx|uAw zrwrrP%l|^o1w7`DvY_&#RIQlpinY<>Fbnsgb}QC+z(2$h?$%Z06=ykP@W01XvClbIbt)FMhmR1%f2A&=He7y3!rmS+AdPh`c4 z1aeGzN*o?I_F_YB11}J%0JKivfoclcOH0vkYgE2JIIkZ#iipe?r(MihY+mx^b4RQ6 zP&6|>RW@l-TX7|6ulyKFrN!r&B!78Tl{o99g(tx5p^L}#DJ8(KZD{I*wkCVJjQdpM#9EjpYS18X z^w@Ix1Rdc|+lcD-;MLrFiLG>FQ~z8rIV*7eRfrw4v=0|67b9B=>K4_Ny+AK-+7^Hn zxONovkf~p6Sn#YpYW6)5y7ph=+$sfXNl|-coD1uJ3W{w%LBLB(_9L3`yW3Ft@Fisk}}k&u0P|wIVs@K|6fn%z*q^iWb4>w$F^ z$c|6}iQ!m=MubKW(;<$s&VZ}0*qsOlXmC{~lHD@?CWua4^7b_n5Cj&{N;RgQO?EVa!^S}7P z@)k7;%UIK&*S;5Compr7l7G zoPjwPjA5n(Iwk9O&sU%av>3jG`sm690yUX{AX$XXMz+4B$#y5 zr}p2TxsJSV(?&5X&3rMP??;L>9&y_vJ$5Kqd%S}tSt9n=z4)#wo%v=2#w z`2-^l!wSc|bRVoQrM514@Rll|<0W;DHK|Nf@7ovy_?|1`MB?`ROPneP^G%Pa)_=VD ztq~e3Mwk80WY2h-azYOaWd;hy)AxAY6V<7mZhO9HXpMR8_rbj9xcfFZ0F>_-H4C-B zlO|6V8<*r$fA4SM=uv?4@5*zY!m?rW~mf2&ZI9-E6Tl$iSGQ1BG%c%oH8a;wN0 zK{~b*=o-XkYTuC6CtSLkCt2}5N+npwZv|l&jk-c+kfS*Q2;$$@N>?Tt;7`!aX$r4Y zr3OjYphWUk{f!}H@5o3UKr%Z=)XDGU_PY;9%j}Z1<46tX26!b>OU0TKaG*EKr6b(a zIN?3-z^5#lI2hp^egQ*C5(*}W5!L0AF-SDk_OaXyt+RTmUe?_!uqZakDnd7N8CCq% zU<<=aXHh$}b?hrtE^PuH|E3=vKcEwuE(bTyK+q8bAA7AU$s5!jSg5>KG2(Ot2`4n6 z5vxl3Qks87_DFLqB5`3hvdjYQsmv4WTq7^#MLSaw(%xi?4((M+C9xd0c5yxnPxx1I z#FFGI?}B%5$Oja{RQ{4)zJDv^a$}txcB7V@x7Zzfx~~`7-n`2L8*D-|d>-8;Z0vBk z|K#DH+nKPH5(WYBkQ9UYEGM-VfYBQzoc%0(&R1%r^vST6_|4jOIvNMEr@3 zWnXSC%4sQbn;p9`2ul3ZiE3x30LGha!ntT%>vcgia`-V;=9bWI3~7zcM;^P9Z-&YU z6^=iNT6>3g9NPL}3LP^QEKQ>A0m+r3Ptq}|gtT}C=#{OUXBmWr!qosE)BloP_kUzV zD6cM2aHb~f*>~^~8)`uxG^+ZPwLVd8pevxS>D(vrkpBT$p?DbI9ctB}<_E4%=TmPm zb)7h@qjEk1mX8GYRJK*MJqwy;2U4`ZxK7Uii4TwwBz0QAT_ghey3)s!7DN2A5?{IWzk= z6KY z4K_}g78rQugn~OwHri;($dW488-@LV(^o}EhK>Az>gM?k#idsUH43sO)wsObwyI|A zJ%WCynFkEg7j0t{v!2RYrZ0V45<#^_rGU6^VgbET9A+5}ekaGyrZ-~J@_vCwDz7^p zi&Z;jD-(8u7_MBK->G}6+0I}13g(_f{rAhHHmq`DAG%6tDn(FDt-wnX(_8d#0R zyFhnMPKL-Ta!uyIPK5aylU?$h?3N?g4{J4J%4MNwsImUx8#lZN&3=%hm>4!=bv?#s zA`QNemR+)~O)SFZb*NP!d~$m_eQI^l^wT!y$`Sf*M~i_5;giUbnxV!VJ$IO(i~ANA zMS$Pd%HH5Drq#&mb9)QNPdqtXzl&*(4*pxq(FhfUL#s!f(2oYD()pR-5Cecl|I2Is z|M98?OfYo5SS=MdXP;x7EuR6Nh5i_C8LUihAG0MAG4^cA3NIU=sk9jZY? z7GnO;j2K}`8nu#Ya`+-DCfhL?EY7p<%ITq}CRJ5QHi!fuMvnd`8JrdU)p^J3dWK|K z8+&Vpwx2ty5xj=M*7PvK{1kkloGHJdhmvsr*tA~NkZLmm2i#WNoMF8#h#i7C9!XD} z-fEl=fz^(3`2Z?*E;Jz;dBs~FTJTl(OkH=3MF;8ybcTDT$Gk7ensjwf-w?-mWR3CD zz&cZ1m!3j7M1Lalq^ETr645Wd|}=XX0kPdK*fz z*r=qDvHj@lqXwPyT0!hZ%a#Ry&a3O6YrIzYPH~rje|R`n*)(xT-6!-o_QkeIt=8eiAWhRbL5PxKLSp=}a9L?Z#{xBoWzLb!_)+uYi6;%6x(@0V zO8uhMS`+(#q2l}hl2jViP#tjl~_Rn)LkjM^G6xj(MXyHIjO_EzA^gYRD( zMIHtg&;?T!ry@L~6Yd4xjfO1GrtRsmy`q}61v?RZGYN7ai14Qkb~{F*j%)n^5zh1K zahSG7vl^*mMIdYaW7VASTzH}|A>z0%E?7&W*u=-n9Hyn`ucYkHl7YAUe0UOdt?l5% zF|;!-M>wYqJFLoYcyy0{;pa5WQn!Y8^kz1j#^0XDDc;{+X^TG&XebYtfh;mhX>6UT zyjpnXB7a8wi2z{Q{~sjk|C_GVgOEn1EQ+i!bp5>REw*t->hOJV%R2RczcnJss=wfI z@qf)cAhk3%mT;T4QKg@NpnaLNAlwya930 z=$>+*1~s8~#Faat0VGp=&qBbJ7=C;tx@^&%YA515rcXCMM!porZ(J!#KYn5rz1cjQ9|3-!9X>t zxO;LsKY@z78&&+3u9o!Y&>9```0DkePGk!}_5^4rvuKw0?n_Uxu1aLNfGj(^{{W7( z*Not5qk32Hs(Qgzwe@63P>AO14D6)KNTJ4GoZHybwp%LG2RQYa^r?iZ^%6?Gigq~< z94)Dc=ZKG>QYofPjw|EAn%pk(=2!RoU?4O}e8i2*?q121Oweq)+pG&_u<0fb*$4Ac z&vB6tmSDQLsSnC#?M}p;!3h#`HRrhB0F69q>%Ujd{`|>=e2GRKhJLt~=p( z9(f9*1@F$0A~J<|tqd08)!x{Dk8ld$a2V2*$vz8)@_0?5zZSWjDbC&hH2eC*&21xP|+Av&ba0F@f|X`&BdrdO4Z0+1J90 zD0shTkYN1Ic-8$n7X<2c25#!qn+6Lj>;sXG`XT+Cla}mk6}r9bR5s&}apypz?3GXh zK&~?2Zi_MBHyRRw3wGVzJWY6JB-{eVX<4@G{ zo?j4lo03MvA~^@)=xlmX^83e!c5sFeu*eC4KAbHA&T8CAQyl6@f@{iWJx%HBDB+Os z9GFK_Yl9O{TC`Q#!*L5DXK)2pYC`WdDG*4I!kRmvj;`8X^T3^Z1TN)zEScVSFVoTq zUTc>$%vF|5N0P4nX~Bnehpx*gbJ12eW8|J5gw#UU7)PmGwmj|ddW4+DLsuLS4@jLV ziQ*d?K=)J#MPPz~^A89m@JDMtPWPHp5G2Yj*|}CHyz$vI^MU@D8!}Ui?ycdTlgR7tbYOHLHYsKoDefKsU70J`7XkqxA< zGk!c_=Vm{vLIIg9&R>jdxvdQxL_cP32X z^YjHKU9eA0>8xE)mZcv7E4XE$nl)Q8zP-eLU6XzKyOO=v)^5LsC;zsn&oTh(NWZA5 z)6or|Nf0a+Oo>3(4P7Q-985aW`W%e-ypwl`1TJ#&9rDXn<0QyZ4zMg^^NdmO$ z4|62IwYNrRHvY<2P5?eZL@^=T6*Z%tePu~@y3Eb_RDw$rpr_^Nfh?kGO6>EIhH8vF zgmyT|_)UCs81IR|UiWx~oA22d3rgJ5L|naIm0aH9r!`G?b}-mv_-liF7RR)w)Y*{z z0X41zTGv`LgHTn)yTPNiMzKpC0TJhb&^ctddU#YD`x=L+e1FG$0+$1Hp#`Ca(b2m@vg*aPspnY!arcEdy6_CW-_*j_BF*{PhP3Iz{&Y2Yi$m6XtNp8*4dTP>T-DK*b1(nO-H}4G$hUQPF_kYwN0f>I=>cP%# za~oloJdqv$*y2}yF#=3JHHaf{ACRDE^Ler$DiNpTUIM$k)AE>e10HNVhuK-ME zNe1%thP&B*E{!T>AcyipF7Bj#Q;q#LgMI25LFoL&8hO9J^Py1rsVuDEHAH7Lbi1EC z7S)`nUt>OxjizHLQ9DP5EbOj+_csGQKA%WKmzOv;m2$>N-HWp3w&fI29)d4VKhi<~ zkKM8?wca=0qKA8r3zDn^NYo6|c|^u`5XYNS;0eJNBQR@t!|!=S*;*PXm+j}sXJPx_sGNzG^a*jgcm@eC1eS8D7pand4*q0N zF&HN!*PQ_V40KJ_A5lo@qv`>Fe`q%`ZG9C%lJS{ zBLfJ}dAW^LoHJshkQu)*_P6CG?Vey#AcNTs0^|u6-~@S;3fJ%stL|dKb*{ewXin_c zqW|S@Ie8KvS(E<8DZCz*!XT^&5;OG8gD|o_=Y){d%}L};y$o?^Uj+UK^-!`Lrz*K>`n93Aqpqb|nq1_P@PZPk7hw+CGqq!o3l~&1e7)0zC$m}9=CN*QQIOoM4O#yt8xK|Rl!sJ^E! z!F=x72v?dLCp;X?oN2gA89Pkk&$d1oYK{|3HWP?Y&Vy}cW?$XB#IhEe`iBkIF#IR> zq7elCc2fJ!@r%^avIosv2MFkiZ2ra+BI>a67nKCkA|x5QyWaNNGEF0CjI*3!Jq2RRQp`U88eU`{~OEzFP z1x|sp1If;fiktpyFRk$qUcjF1*wtwSiHr2EeQ!_^*BJLMfYu4{fJJf{6x5w9pgwzj zm>4Q`bO#B(0%R6x7sK8y*D2F9rso|sVoU%AI<0i50|%z@gX*r0dV=dH()Q*u?(AU+ zqXo9FCfa}nu~AGMf7fYeRj$Z($O~Jv8m)25&1r1a`Boc?^h$E~i_Qc^x zyBM+(EPss0IK1H*PDDDpJ}`&y$$KpI?}(wG;kCQ4+%9>0`bGpOqr&CZhNSm&y6s34 zg$>ai(||9S(8a6E|Lyo@+5ytdF~IL+qK)Fm3iNP*jcGQgKkFk`)I>*piWHz}B47xp zmI*lsTQaM#oUS!nRXZbvygl4InjMNV2K&gg2-mY{%OxvZ@8e6g5{_}S7^MDA#m|Pm zzP|w`n7qju93(OKBuWKQ-AG_}fxC=${=3r zz%g=mXziO+@;kqK99o3Q4IQ#rM0dk$lfu2Uqp-R$k!h{m&asfldRZl139D-lqRP1S zN4+?am$<9Uh)}f{2IJ;7_S}-?n@xdEyLk5OAFLz5&d4tXTB>nzEb&mCJibKrifTD$ z`#`?Iv#P&2*{dV!UaEgJ;oFFEsV3P{o`PNw3JifUlmmjRNQveR$!#Vl8 zh}`fOWDmbbETMw-oY%P4jNN0_sk7d|_Fs7}|E`1(+j##2VTF$r_m-EV7mJh z)q^hcfJ(A;YO{~-HN-U_dUZy?;YM}qL~Ohj_E%L^D4OM?y%F>MXLiRrjVxHp@f)nD z3*&>0uH^??pBodW&BdSslAzk6p6seO&NIch_A?z~qw-FPi|ZrToy^ieQGYtr?_|IF z!$qSgo7&pGFh~9s6&j=z8Ka&f&KX(*omWWHEY%5;*(2;Y_P`C-mgkve9{r4&dBctCORS?+=c;=@bYWducP1Tl`ohJ#tvWe&P+!5m3E@fC9oq63KX^q;UI+AzcofDjg zAp02E3)UXQzD#oZTk& zuU~FW&JUNTqJM>8xg}h1k6vF*cWy1=9iAB)-kI%m2}i+>!-v=&A}1%Y*Ai2R$-{hU zl&c$+8Nf_@wmSEdR1X0_I{#ZU=BxhyK8D<2r-AESJ8QX*wr{RvIj>qzldA$|c}`$t z-f20YYsqS4=;an}r@;~@4i`AF9#iSZT0vy*vba?7UC;r4+8xucUp|Rs&o)mv$o5;* zZn-fu6B0qcxOi?0gzdz^l?Qo>d8TmLr*?nWCeKQ?~h>od1%$6q8H%#&4ss8*FbN-T_LNd=t@FXLI?ROw;Vc4?lkG36&EHl zd=5W6wvf#ayTT?j(O%Tryn2J3wT*1zxx;xYGxY@&k}0GtprQZ^({M;Lqd(!z^&tzM zIOWtc+w-%ubF-qHBtUtKS0@Wi=FtH8UHXafutzg;x(q9uk`brHlz~jBC2co0PQXsE zqfb)>o@{nwt321#tDdeizql9a)x}&-^!M?e0xN-0^VhbqSkXpja4h{$<`qO~m;=7J z%Prb?=O>PRV>`P;W`4x^mB{(;j)d#+Z%~tY8}i;hgPD(mAtbg>W?ZO7QM`XfdRt^j zq-5x2jLFVtJtH8kAL3P#MHo-}BU~aYbc^eh2|~N&XCLM=@L<@u-77SRbjDDSBQ!YP zR(04RDl}bPVf@!(bPvu^znLJ{{Ekj8f6blXE$$}%b(xtx%1|Ic3c`-D`O;jWTRUX= zoo?ky3&3&p5;R53xx>FJVbX==CDT{hpALC~N4B#z7Cft^337`WVuJPd+R>(yKZHYS ze>Dspo{K}Xao{l`{9BT{MQq2*yq(gSC!M7j8qQCK?Y|DIvOB@+<5jYa`g1I|Z_Z^? zWD4nm(l{z?gb404R6dHOPf#6DjVoolh*{Qx2=(kJteleV1Xp);dt}Np$!F={`(r!; zn@i&@xTwXxm_>$nUg^-<5qj#%1sE34Ix%YH9uc<>2w$3icwVvp>3xX613(G?%W^aBL;jOh^Anexg7#8Zd;caIY=dA(2J5}jgJC0^Cm48TfIC1QF@kG|D;L=UbF_AprRJ5GBwo&Ecj_!T)5DM3 z=D5`Wy-Ht+G;6djhu$|>(HBg-O-%|JeZK&`nmp%Lrg9wx3LTlR1IN)M5HK^Y=}zn4%SYWw1=zA1EU;h6i{8}aT+9>KGh za%6?_7RKh6f+zda<0p=E9ymCLZ9d3$#U)Az&L{;)4u-ya|9l|xNWgwpe47Uk-biv_ zpO{BywO?Q83GNPu&pVFietEU7!Go7PkUF&y3|~F{ZnBN+^`QVxf_8D)Fn1RWYn07! z;R?12oUY!GIRq7<`mwzE)8_Rp5Lt3&3S>q%8|ehb*x8$MAXepv1r=uR{DXSn$!J3XIlTPO88C=COv9l(9fzcP(ehs zmuRu0n(O#b*`b|$CdNRXnC{X(%1PFOp)(c4Cyd~yei-fO&=>Kt(dW!_=a{FTEs7Yt zwZjnY>5}uLz-0Am0TxB{Jp{cX?y4BfM1$_HJAqwiBT+qw6803NK182Tq7o|+7h`~S zWyj8?s!>i>1O9ayxu$8@Imk0c`p-vJq9bB1USa9CUnU-uxXCs@R@Kc+Ihn^dR$>)F z;s@*A3UIIJRLrJ?()V!{-%|;urd(JduwXY;q_hrKT4Q{vE=TMzrWPE=;i4$IEECIa z1PR2ofde})q*+e^Ye9fKi)G&8(#sa{+{)+I8A8|!}oqYvGVZ$#0XgVzaIjhfz zsDz2F0t8L((g0j-JMWA`a^;uUGouYON}+30--sa^CEqZ0C^p7?x)&6?2R2gdi&(xdo@<;D}n0Y}yu zSCB`M$wAsFK~RAO2i9oj%Xg<5D3)!75ia7Ig-1+7^dk;FcUZHCYfqA$#V?lzLT0lW23KDN{u0 zAqqKU4b$GHV|Xz+|M8h7-D$MZ(0r!29R0G+blZY#4W1I=jG4w~PK@mjjEC#{v#B83c~6NlTe5 zy(ads-;Gn7Pn*Dn7{%lFtH*cL)4e>ti))}gJdGn8n{v{{)&KS(7Po8SN|6t#W$Bnq zB3mxD)*>H4XXwFf6VjFr8J)5?wouV)v~OhfI{=?ub!@mJ_rqtwsw7HyN>Ab`x#{i~ z#hR?aw@T0ivosJ6WEl|wPtMGlY5EA_JL}NGs*;f&)YLpOJU=flUdQ z`DJ(CSj0rz_qObX;-xPr53g5cXAC|&o3T@gC+)IFm1C~;Hr_GH@<v+jV7s*><+BeNqLOIcz$8$hE8n0#cufhZd-#B){B4WE+X zqp+rj`eZ*`5Gs&24`QsgwH;+KG{u;Vy0`9NjyaH#Vc^^no(l^D2dr08CsAeEXv4=qEAp)<8WpQw%a3U7TCNqX&b z5MmsoetXWxMoH0;w1hd<5bcPEYKwm>ye4pa5G)iy2Y|``59hbQ|DSVjTs|wBUx>!# z0fP0LY}od{90dKN1i5e#rm!k8*$}Cda%UxJ+g$PkHAl8RmNjMh6AE zVe2N*VuYZtn5*y5nHmM%To2jGwehcty+X{j@j4A)=&No*G9yG#0Ps&0YZ$r2grLj| zYfH5IaU+%OwqXrX0t-rM%56(iLX2b(wtvPkY#15u&CMZppq&&PeLcVP6v4Cm90)PDkH3J3^`S0l?G z;0|8D79fXQ>;C(3Yc&Pd#`QGwl5AA^>m7jnQZ1+ z350khQ^%u$Op3~dI$9#V_7xeO=$#*WWrn7i2m%(@TA59(H{gu@kr9mNwPA0DbjoZ) z!{qVRo4r;Xx2ViXK{57M;2pm7`^R!rf?*6Aghj_tp$M10P(%&@R{P)gfA@dmf(ln$ z_}&nC$Atd~t?nM!LmZ!dTuIlXPzZa^hY#5-Vsd@--Qc(T9IrU6U&YY!CJGM+tt+=U zqG_h6Qs-Yk*bgN*{p*T*&pRvLlE9`VfB1oAqwSkH&>L?2N$$;2v_-htnYHfy9HJ3L zL%^4b4tBuPw}hHHXAgZ)H=^b>jJdZon{P@k3zkkwO8PS%Go>kq=(9oDUvYY9pERQ3 zi5^39yXE8q=DAUenE0{d>w(US4#|h$k|#HbBje=E`&l(7@qR0kTq#Y@rZ~RtZKdBt zt$J(%lh!JQr?(jCUFkyo--D4*mWAYOPhCs>rkB3~6fQnVV~h~P<^x18b49I`w`qTz z3DKw2?()9DUcYpqnVa=O02Gpu{`~qUQEV0={a>3z^_#-8aXU7X1ZzMeyT?AiL}okj zqip8U5kvT}vhj(3?rp@K`8E){w?INYnZS(6@3v!cCGmwEZ2$#7ZitoC54vYrl0=s!y7VcYUDTG&loV>&@@eH@EKQcX6#Hut z*(Sg@Sbs&HUoojfI)3HPsq@}HC_wP-4+Qs3?rz&xwZGzW<(zrZP*`67hcFIp zb*sRwv>U}jWxqY{&rR4#I?>u#S1K2Hui&l0c?iH4s)$^>$(Yu+QV}vneLCR|(ZHtq zW@nlt$86@+qLvy#DIO8Bv_MKapn#-~xmzc&R3=2r)0+>SrB6*{>AR5`xLzH4u57B$ zF`&xT0}!5!t;Q?BpJeh2stK^^Nt|xeI(W=-pR(pIec2W}DM440OtF#y-e+$d`TqSL z#8p&26<<8*^vp~hDeerB4L(Rs5K8aLV+xHQD+deiho!~j@{ql9}sT-F&z+x z{l8*ZY8Zy&u*-von~??vQ{!7=d;ytl$=*Y#8O_gFidI}!27yJz5nUJkpAwc90FL(G ze}?FPj@!hg|CF%Qghqm#Fl_AXcb-A=%{45;`#o&vAenJZTMl462A%Q4J1YJ86)jVJ?t2{9 zSa~ke66Gxs@!-vB)8%BFb;^&7y|g%_4ZF}YnsWYnA=5tu75PvtBPSWDWGrQ&D8OT$=jVKYqS_PVg|euV zdn@l}g=qu2{jN+Tn*d|wsGb$;OUwos0#v>2f9(cVX@KgVd!7Ks-wE4pP71+O{hjKrn3km0sI&aE`t_bnXeGyb3ShN7xi; zK7JzyCMwhGh`q5S)_TdUM19aR>D97TCMa%2LZVNqx_=D+bH}$`0^bm}^$GHPn_^vm zd}gJgN4_0=p~lQ@XXNnyWZ4S9$&~#QD+ep>RsrM2aOLiLh4!Z0kIpT89;9MWr8gqV z(Wy#~8w~C2Pmm?`xPFj0|GO)u6MF*Oo;cQ$^-$Ez*c>MhbWV z?`AjTh1Ls!p*OhZ;!_0z*X$|C{mYaU{~!hrx~xD5WP#%13;#8qPpE{IN68Su0RyJ> zHb(%bKITIzbst`0Y_R($WKl5;^?;aTB@R|aSU&7E2s5WC?Z{T?QB3f={>3_7R4UF_sLhLU_9IUQy{Yg#k*cXM zv1swQj(4NXu)eQ(^pavm_HvgD{2xfRWfPP&Y{lcwt8&Q<`GlV2V$AC$Ne zkbMs(VY2N7==cE9W^NfgzWo@R3d0Bxs1}iE{kS?dD#P< z@Os>G<|Z<u?%KovmOY8dt;B=WqYYNP#0_ZdFDmY+hlTo+Cl4ASX_N zO2hz}aKx&6+^k~HPt-NLDm!h$eDgK~QKNUFG?RiQGET}f{}N8(C$?gYuIDe0Ua|sK z?}JRm&A;9@sg{vGkNQ#*p(t>aS~m@9B&bP6&^dEP**e;?jNvk4%~4Nl$Q)8f`NPe{ zcToU*Sc{pFrr!(@0q*G0CS1HRA6%ye<~i`$>D(59g~EdX@QweCiys4)fRvxT3jh81 z4(VEgR|?9`@3sPz(@s-sLJYzoh{`4_6bW=Fw6MM`K`KI4%c4FM*pOec zP!pBIRUrmqI=xl*Y+4b96F#PQt&FP+rH*DaRD&Jozx2Ms@GD}{Y3e874DMHQUkN}1 z`5B2X^`5=<>tfLsPq({+L@yfQQy)l&0PFUn;I(9N)}qL5Po4GfjUX{M##(IU%a*CsP?0Tg(gk?2c z`sSQCuW#8_CH&GkLd(Z^*b>tB&VW*0jBLS1tzWedosu)7Us2?7FOqknpA`dY<&N*( zDBAYCgi+ZX73u7iGXr#WJfTjX1b`-4aqqSwDUfb-0%2MQ^EQMIjeI1V>V20dqF2->A92{ruw<=C^bE7li7)O zq}Y&aYESTqZ#ZYmU;;+60pJ$IcbsC#EHl zDG9^^qpAw$VM2>Qlhl6NZyZaTybZ3?J zAYj@s;~MAXGeJ}sw3<&&92|x5g#=g$mJy>Vv)c#MNZ(~G(PUEtX-C;CA5Lmi%yU$s z)v^wRfe&4M2;oy`uGx|u{M`+Kw$0*DA0oegkh)-FGHiBY0L7N=-;)HYK0xp*6Uhg- z&A6i_RH+}t6#^BCxdI>re=z>h%iQt+0Z|4lzpWz}!`=O`yy>NuIFrbylB@yhPTx2p z2m{D!i%i+U^0u7tt!&)9fT=^eKh!Y6&>bR+PN(4^ zqtX5=#n$DPKbJUrN-|(jWO6YU1w@J94JxeDog0L*NH1XWw*#J0bHA)q4=+OxSKmA-b!|I4M=znm zD!OiD3L)-;)5zK^ll(=LsDGnUO}F9oCuJ#-ig$Gm z^xWGXBzVHc^Z((zhwq(;qcV;m6MZ|xh1Qqr`GL}{fn>e`$F!FTN2JzO>c8!;If}3H z&&ya`kyKm&K#vht^)*9Ub3oQ#xpdl2g}JkoM%@s0d5FN)?hm*G}y6fFMK#RvBHCMv3z|1A&!O zx!4LxHeOQIjK)VFUYZ+?4x?d1zJa*A61hrAl{dIK{yG%uJgT|O+&}UxC;S67wbst0 z-OV{)g@eaRlW33RHib=CZvK4jtdY`mqSmx;?>(}~ehov~DHsC+PM|~&y)7V(%&edi zZA2kn%bwcc>gR>{sEH;vikD(Y~DoYWBLrwv2Cl48uD(xY^m*Xt83QG$dMT1CI{;yX=jDLhb6{+fsr-eOQu*@*O#E@F@TwChzD*IX zXSo^^|DxJ`{0~17NW_Cv`@ILMAid%2_2)OPfz{P@=$a;k9NWMuq5N0zB#6;9d9A^w z`dcli(M>7JolN4Em&KV1lZu^9AE>Fr?}>k^0V$$?y82H&s|wMR2>&JLc9H2jK+|k{ zm5w3Zzkki+>D`3(n>!!`4F{%15SU$&Lc9W1o8gnhd<5ZkUdVMHBwH?8`kiUsEBY!zW9ywaNf>x@7P2pA_+#l7+H$7_#^#m~&tqwp4#< z`B!hIK=Qld8+c7T!j5Ct{J3}lOoA1=mtt=XwUljB$(qK|{$*2?f0}6bm`^@(33Xey z_t$CkiJVQ^PmGG-5P;s`MHlCcJ){YzX2{GOGLeQ@Vu}J;wB&ya8mLVcA1+W%E2_tR zu}93-oIfZ_s!AFqn<)UihxC_~F*3D|27N(DH3N2Rlj4#&Xh(mJD9D!Yo%3?Z2ay-{ z0eMJ%b+MU=)!+Lz;UvC*Cs&bw3_!f{E3DBi0JU^9mqF}aLc#FeU~1I+qv_O_Hlq!PRcq zMpUg$a(?1$61h#GkM(Q4l4r$uyHy5UzXSKRDL`nqQ@*k+(JW&FRfOn`zApy-DHw2yd(O4QPfWA0Ih9CXgE zHE9w%aoDj(;nH<)&Wv7Lr}9sJAC{}t9tc9!ON}D?S4KMfJZs@rr{pio0q|P4@&RnY z=7|%mD~1hDFd$!UJ?`p$vNdI(Itf{q`3w5y*e%Hep^Xq?`->~JlF*Ut_Q_%0=#%4s zaqanp4~gH7DUkPnuFfH~Es<&3B@DR1qR#PAT{oPL=Fgi32@8eqwzd*e;M%wu3NBq5HB0<>EU;vw$MHUIr4D_5y-MR z7TB=3`Aut#3+A4da<}Bgo*(ZGdnlEqi6ltSysn){^Q7D}jYYUgOiTx(lzf>SYVjAN z5qtLeW|lyryHP^?^K3@`AQy?8m_;9`0HBtrX8`bR5ODbo H0QCO>36AT@ literal 0 HcmV?d00001 diff --git a/testdata/mfr-preview/preview.xlsx b/testdata/mfr-preview/preview.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1c0283031e17e0190cfe7ea6e608f6edd4ab173f GIT binary patch literal 5576 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�(uO1Jrzq=pGvX`t?NyoR%Qu=*K^Z3&~U&abfVn_Y}O@B|0 z4kmTM!y@MR^3cjQjRRsy*Y$+ZxTvNTv^*H-d|)(4YjGQ>$xUKun7t_@JffMcBQJ-; zTEYZ7BL6y{tRCjN+w{m>`4yWzU_f6mnxlBIhd6xSk3Um;K1S=ca+1V*YOf!E~5^*QEcF_BXBE6pFvC;2<@}|5dhsTKP*h-n4R4r~GXN zIDza0NGrcp%T4IbuJIchi2p|qxe2^kg?|HWkVW}MO}+`fSvP)z50R5oB=}#d$W1#p ibMm*HW#stse`Kh-5;}5%2LNCrcPO%Gar_+Q0saH$DXY2w literal 0 HcmV?d00001 diff --git "a/\343\203\206\343\202\271\343\203\210\346\211\213\351\240\206-\343\202\271\343\203\210\343\203\254\343\203\274\343\202\270\345\205\261\351\200\232-\343\203\225\343\202\241\343\202\244\343\203\253\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274.ipynb" "b/\343\203\206\343\202\271\343\203\210\346\211\213\351\240\206-\343\202\271\343\203\210\343\203\254\343\203\274\343\202\270\345\205\261\351\200\232-\343\203\225\343\202\241\343\202\244\343\203\253\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274.ipynb" new file mode 100644 index 00000000..009f0a24 --- /dev/null +++ "b/\343\203\206\343\202\271\343\203\210\346\211\213\351\240\206-\343\202\271\343\203\210\343\203\254\343\203\274\343\202\270\345\205\261\351\200\232-\343\203\225\343\202\241\343\202\244\343\203\253\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274.ipynb" @@ -0,0 +1,1787 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "3cb34d02", + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "rdm_url = None\n", + "idp_name_1 = None\n", + "idp_username_1 = None\n", + "idp_password_1 = None\n", + "rdm_project_name = None\n", + "target_storage_name = 'NII Storage'\n", + "delete_project = False\n", + "default_result_path = None\n", + "close_on_fail = False\n", + "transition_timeout = 60000\n", + "render_timeout = 120000" + ] + }, + { + "cell_type": "markdown", + "id": "af8bde97", + "metadata": {}, + "source": [ + "# GakuNinRDM 総合テスト [ストレージ共通-ファイルプレビュー]\n", + "\n", + "- サブシステム名: アドオン\n", + "- ページ/アドオン: ストレージのファイル画面\n", + "- 機能分類: ファイルプレビュー\n", + "- シナリオ名: 形式別の初回表示・操作・再表示\n", + "- 用意するテストデータ: `testdata/mfr-preview/` の9ファイル、接続先URL、既存ユーザーのアカウント\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58924238", + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import datetime\n", + "from getpass import getpass\n", + "from pathlib import Path\n", + "from uuid import uuid4\n", + "import importlib\n", + "import tempfile\n", + "\n", + "if rdm_url is None:\n", + " rdm_url = input('GRDM URL: ')\n", + "if idp_username_1 is None:\n", + " idp_username_1 = input(f'Username for {idp_name_1}: ')\n", + "if idp_password_1 is None and idp_name_1 != 'FakeCAS':\n", + " idp_password_1 = getpass(f'Password for {idp_username_1}@{idp_name_1}: ')\n", + "if rdm_project_name is None:\n", + " rdm_project_name = f'TEST-MFR-{datetime.now():%Y%m%d-%H%M%S}-{uuid4().hex[:8]}'\n", + "if default_result_path is None:\n", + " default_result_path = tempfile.mkdtemp(prefix='mfr-preview-')\n", + "\n", + "fixtures = Path('testdata/mfr-preview').resolve()\n", + "for name in ('preview.txt', 'preview.png', 'preview.jpg', 'preview.pdf',\n", + " 'preview.docx', 'preview.pptx', 'preview.csv', 'preview.xlsx', 'preview.webm'):\n", + " assert (fixtures / name).is_file(), name\n", + "print(f'Project: {rdm_project_name}')\n", + "print(f'Results: {default_result_path}')\n", + "\n", + "import scripts.playwright\n", + "importlib.reload(scripts.playwright)\n", + "from scripts.playwright import init_pw_context, run_pw, finish_pw_context, expect\n", + "from scripts import grdm\n", + "from scripts import mfr_preview as preview\n", + "\n", + "await init_pw_context(close_on_fail=close_on_fail, last_path=default_result_path)" + ] + }, + { + "cell_type": "markdown", + "id": "ed0fe847", + "metadata": {}, + "source": [ + "## 新規プライベートウィンドウで GRDM トップページを開く\n", + "\n", + "設定した URL を開く。同意画面が出た場合は内容を確認して「同意する」を押す。ログイン画面が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bbb22ed3", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await page.set_viewport_size({'width': 1440, 'height': 1000})\n", + " await page.goto(rdm_url)\n", + " consent = page.locator('//button[text()=\"同意する\"]')\n", + " if await consent.count():\n", + " await consent.click()\n", + " await grdm.expect_anonymous_toppage(page, idp_name_1, transition_timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "1f804cf8", + "metadata": {}, + "source": [ + "## 指定したアカウントでログインする\n", + "\n", + "設定した IdP を選択し、ユーザー名とパスワードを入力してログインする。プロジェクト一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "af4260ba", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await grdm.login(page, idp_name_1, idp_username_1, idp_password_1,\n", + " transition_timeout=transition_timeout)\n", + " await grdm.expect_dashboard(page, transition_timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "86f86774", + "metadata": {}, + "source": [ + "## テスト専用の新規プロジェクトを作成する\n", + "\n", + "「新規プロジェクト作成」を押し、上に表示したプロジェクト名を入力して作成する。作成後は「ここに留まる」を選ぶ。同名の既存プロジェクトがある場合は、別の名前で始め直す。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "49f9bf58", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await expect(page.locator('[data-test-dashboard-item-title]').filter(\n", + " has_text=rdm_project_name\n", + " )).to_have_count(0)\n", + " await page.locator('[data-test-create-project-modal-button]').click()\n", + " await page.locator('input.project-name').fill(rdm_project_name)\n", + " await page.locator('[data-test-create-project-submit]').click()\n", + " await page.locator('button[data-test-stay-here]').click()\n", + " await expect(page.get_by_text(rdm_project_name, exact=True)).to_be_visible(timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "750feaf0", + "metadata": {}, + "source": [ + "## 作成したプロジェクトを開き、上部の「ファイル」をクリックする\n", + "\n", + "対象ストレージが展開され、空のファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a843b7c3", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await page.get_by_text(rdm_project_name, exact=True).click()\n", + " await expect(page.locator('//a[text()=\"アドオン\"]')).to_be_visible(timeout=transition_timeout)\n", + " await page.locator('#projectNavFiles a').click()\n", + " await expect(grdm.get_select_expanded_storage_title_locator(\n", + " page, target_storage_name\n", + " )).to_be_visible(timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "822c8452", + "metadata": {}, + "source": [ + "## 対象ストレージに preview.txt をアップロードする\n", + "\n", + "ストレージ名をクリックし、「アップロード」で `testdata/mfr-preview/preview.txt` を選択する。アップロードが完了し、一覧に `preview.txt` が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c876bf9", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await grdm.get_select_storage_title_locator(page, target_storage_name).click()\n", + " await grdm.upload_file(page, str(fixtures / 'preview.txt'))\n", + " await grdm.wait_for_uploaded(page, 'preview.txt', timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "89b88d32", + "metadata": {}, + "source": [ + "## 対象ストレージに preview.png をアップロードする\n", + "\n", + "ストレージ名をクリックし、「アップロード」で `testdata/mfr-preview/preview.png` を選択する。アップロードが完了し、一覧に `preview.png` が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62939456", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await grdm.get_select_storage_title_locator(page, target_storage_name).click()\n", + " await grdm.upload_file(page, str(fixtures / 'preview.png'))\n", + " await grdm.wait_for_uploaded(page, 'preview.png', timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "be6d8cbf", + "metadata": {}, + "source": [ + "## 対象ストレージに preview.jpg をアップロードする\n", + "\n", + "ストレージ名をクリックし、「アップロード」で `testdata/mfr-preview/preview.jpg` を選択する。アップロードが完了し、一覧に `preview.jpg` が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8f23430", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await grdm.get_select_storage_title_locator(page, target_storage_name).click()\n", + " await grdm.upload_file(page, str(fixtures / 'preview.jpg'))\n", + " await grdm.wait_for_uploaded(page, 'preview.jpg', timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "f6aefdca", + "metadata": {}, + "source": [ + "## 対象ストレージに preview.pdf をアップロードする\n", + "\n", + "ストレージ名をクリックし、「アップロード」で `testdata/mfr-preview/preview.pdf` を選択する。アップロードが完了し、一覧に `preview.pdf` が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eea878d9", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await grdm.get_select_storage_title_locator(page, target_storage_name).click()\n", + " await grdm.upload_file(page, str(fixtures / 'preview.pdf'))\n", + " await grdm.wait_for_uploaded(page, 'preview.pdf', timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "22bc0cd7", + "metadata": {}, + "source": [ + "## 対象ストレージに preview.docx をアップロードする\n", + "\n", + "ストレージ名をクリックし、「アップロード」で `testdata/mfr-preview/preview.docx` を選択する。アップロードが完了し、一覧に `preview.docx` が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ed710d3", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await grdm.get_select_storage_title_locator(page, target_storage_name).click()\n", + " await grdm.upload_file(page, str(fixtures / 'preview.docx'))\n", + " await grdm.wait_for_uploaded(page, 'preview.docx', timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "9e24e9fb", + "metadata": {}, + "source": [ + "## 対象ストレージに preview.pptx をアップロードする\n", + "\n", + "ストレージ名をクリックし、「アップロード」で `testdata/mfr-preview/preview.pptx` を選択する。アップロードが完了し、一覧に `preview.pptx` が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c64f67fe", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await grdm.get_select_storage_title_locator(page, target_storage_name).click()\n", + " await grdm.upload_file(page, str(fixtures / 'preview.pptx'))\n", + " await grdm.wait_for_uploaded(page, 'preview.pptx', timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "12de2eb5", + "metadata": {}, + "source": [ + "## 対象ストレージに preview.csv をアップロードする\n", + "\n", + "ストレージ名をクリックし、「アップロード」で `testdata/mfr-preview/preview.csv` を選択する。アップロードが完了し、一覧に `preview.csv` が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6b5ed66", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await grdm.get_select_storage_title_locator(page, target_storage_name).click()\n", + " await grdm.upload_file(page, str(fixtures / 'preview.csv'))\n", + " await grdm.wait_for_uploaded(page, 'preview.csv', timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "5a82efa1", + "metadata": {}, + "source": [ + "## 対象ストレージに preview.xlsx をアップロードする\n", + "\n", + "ストレージ名をクリックし、「アップロード」で `testdata/mfr-preview/preview.xlsx` を選択する。アップロードが完了し、一覧に `preview.xlsx` が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0724bb6a", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await grdm.get_select_storage_title_locator(page, target_storage_name).click()\n", + " await grdm.upload_file(page, str(fixtures / 'preview.xlsx'))\n", + " await grdm.wait_for_uploaded(page, 'preview.xlsx', timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "479c280e", + "metadata": {}, + "source": [ + "## 対象ストレージに preview.webm をアップロードする\n", + "\n", + "ストレージ名をクリックし、「アップロード」で `testdata/mfr-preview/preview.webm` を選択する。アップロードが完了し、一覧に `preview.webm` が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4c24ed1", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await grdm.get_select_storage_title_locator(page, target_storage_name).click()\n", + " await grdm.upload_file(page, str(fixtures / 'preview.webm'))\n", + " await grdm.wait_for_uploaded(page, 'preview.webm', timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "21bbdd5f", + "metadata": {}, + "source": [ + "## 一覧から preview.txt を開く\n", + "\n", + "「MFR preview test」「日本語の表示確認:研究データ」「ASCII: ABC xyz 0123456789」の3行が表示されること。日本語が欠けたり文字化けしたりせず、改行が保たれていること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b0dff1a", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.txt', render_timeout)\n", + " await expect(preview.viewer(page).locator('pre')).to_have_text(\n", + " (fixtures / 'preview.txt').read_text(encoding='utf-8'), timeout=render_timeout\n", + " )\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "2400d4e1", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1e0fed9", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "a100200c", + "metadata": {}, + "source": [ + "## 一覧から preview.txt をもう一度開く\n", + "\n", + "「MFR preview test」「日本語の表示確認:研究データ」「ASCII: ABC xyz 0123456789」の3行が表示されること。日本語が欠けたり文字化けしたりせず、改行が保たれていること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c1adffc0", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.txt', render_timeout)\n", + " await expect(preview.viewer(page).locator('pre')).to_have_text(\n", + " (fixtures / 'preview.txt').read_text(encoding='utf-8'), timeout=render_timeout\n", + " )\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "b3310ae0", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "143862fb", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "a34d5448", + "metadata": {}, + "source": [ + "## 一覧から preview.png を開く\n", + "\n", + "左上に赤い長方形、右上に青い円、左下に緑の三角形、右下に「MFR 0123456789」が表示されること。欠けや縦横比の崩れがないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6333294a", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.png', render_timeout)\n", + " await preview.expect_image(page, render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "a306f53c", + "metadata": {}, + "source": [ + "## preview.png の画像をクリックし、ホイールを上に回して拡大する\n", + "\n", + "画像の中央をクリックして拡大表示を有効にし、画像上でマウスホイールを上に1回回す。図形と文字がさらに大きく表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f6bc2b5", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " global zoom_original_width\n", + " frame = preview.viewer(page)\n", + " await expect(frame.locator('.zoomImage')).to_have_count(1, timeout=render_timeout)\n", + " await frame.locator('#base-image').locator('..').click()\n", + " zoom = frame.locator('.zoomImage')\n", + " await expect(zoom).to_have_css('opacity', '1')\n", + " zoom_original_width = await zoom.evaluate('image => image.width')\n", + " await page.mouse.wheel(0, -100)\n", + " await preview.wait_image_width(page, zoom_original_width, larger=True, timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "f3fe1b46", + "metadata": {}, + "source": [ + "## preview.png の画像上でホイールを下に回して縮小する\n", + "\n", + "画像上でマウスホイールを下に1回回す。図形と文字が拡大前の大きさに戻ること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1c949be", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('.zoomImage').hover()\n", + " await page.mouse.wheel(0, 100)\n", + " await preview.wait_image_width(page, zoom_original_width, larger=False, timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "3992a0a1", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4585585c", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "bb1389e3", + "metadata": {}, + "source": [ + "## 一覧から preview.png をもう一度開く\n", + "\n", + "左上に赤い長方形、右上に青い円、左下に緑の三角形、右下に「MFR 0123456789」が表示されること。欠けや縦横比の崩れがないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c9fed2e", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.png', render_timeout)\n", + " await preview.expect_image(page, render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "23a32eb2", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf00dbd8", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "b6e3c822", + "metadata": {}, + "source": [ + "## 一覧から preview.jpg を開く\n", + "\n", + "左上に赤い長方形、右上に青い円、左下に緑の三角形、右下に「MFR 0123456789」が表示されること。欠けや縦横比の崩れがないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8512a859", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.jpg', render_timeout)\n", + " await preview.expect_image(page, render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "1867388b", + "metadata": {}, + "source": [ + "## preview.jpg の画像をクリックし、ホイールを上に回して拡大する\n", + "\n", + "画像の中央をクリックして拡大表示を有効にし、画像上でマウスホイールを上に1回回す。図形と文字がさらに大きく表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "da7675c2", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " global zoom_original_width\n", + " frame = preview.viewer(page)\n", + " await expect(frame.locator('.zoomImage')).to_have_count(1, timeout=render_timeout)\n", + " await frame.locator('#base-image').locator('..').click()\n", + " zoom = frame.locator('.zoomImage')\n", + " await expect(zoom).to_have_css('opacity', '1')\n", + " zoom_original_width = await zoom.evaluate('image => image.width')\n", + " await page.mouse.wheel(0, -100)\n", + " await preview.wait_image_width(page, zoom_original_width, larger=True, timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "f5385acc", + "metadata": {}, + "source": [ + "## preview.jpg の画像上でホイールを下に回して縮小する\n", + "\n", + "画像上でマウスホイールを下に1回回す。図形と文字が拡大前の大きさに戻ること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "70cd1629", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('.zoomImage').hover()\n", + " await page.mouse.wheel(0, 100)\n", + " await preview.wait_image_width(page, zoom_original_width, larger=False, timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "787591b4", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00fde82b", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "505f7f11", + "metadata": {}, + "source": [ + "## 一覧から preview.jpg をもう一度開く\n", + "\n", + "左上に赤い長方形、右上に青い円、左下に緑の三角形、右下に「MFR 0123456789」が表示されること。欠けや縦横比の崩れがないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b8e8fdb", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.jpg', render_timeout)\n", + " await preview.expect_image(page, render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "0eb2fdef", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "720735a7", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "6ab75b2a", + "metadata": {}, + "source": [ + "## 一覧から preview.pdf を開く\n", + "\n", + "全2ページのうち1ページ目が表示されること。「日本語プレビュー 1ページ目」「研究データ」「MFR PDF page 1」と、画像と同じ3色の図形・英数字が読めること。日本語が空白や四角になっていないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e8edde8d", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.pdf', render_timeout)\n", + " await preview.expect_pdf_page(page, 1, '研究データ', render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "3fc0bdb7", + "metadata": {}, + "source": [ + "## PDF の「次のページ」を押す\n", + "\n", + "ページ番号が2に変わり、「日本語プレビュー 2ページ目」「検索確認」「MFR PDF page 2」と図形が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "138216e6", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('#next').click()\n", + " await preview.expect_pdf_page(page, 2, '検索確認', render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "14af511e", + "metadata": {}, + "source": [ + "## PDF の「前のページ」を押す\n", + "\n", + "全2ページのうち1ページ目が表示されること。「日本語プレビュー 1ページ目」「研究データ」「MFR PDF page 1」と、画像と同じ3色の図形・英数字が読めること。日本語が空白や四角になっていないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0c290594", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('#previous').click()\n", + " await preview.expect_pdf_page(page, 1, '研究データ', render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "e93ccc10", + "metadata": {}, + "source": [ + "## PDF の検索欄で「検索確認」を検索する\n", + "\n", + "ツールバーの検索ボタンを押し、「検索確認」を入力して Enter を押す。2ページ目に移動し、一致した文字が強調表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6f1dc64", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " frame = preview.viewer(page)\n", + " await frame.locator('#viewFind').click()\n", + " await frame.locator('#findInput').fill('検索確認')\n", + " await frame.locator('#findInput').press('Enter')\n", + " await preview.expect_pdf_page(page, 2, '検索確認', render_timeout)\n", + " await expect(frame.locator('.textLayer .highlight.selected')).to_have_text('検索確認', timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "3f8639d8", + "metadata": {}, + "source": [ + "## PDF の「印刷」を選ぶ\n", + "\n", + "ツールバーの「印刷」を押す。画面幅が狭く印刷ボタンが隠れている場合は、右端の追加ツールボタン(≫)を開き、「印刷」を押す。印刷ダイアログに2ページが現れ、日本語と図形が含まれることを確認し、キャンセルする。\n", + "\n", + "コードは実際の印刷ボタンを押し、2ページ分の印刷用 canvas が作られ、印刷処理が終了することを確認する。\n", + "コードで使用するヘッドレスブラウザーには印刷ダイアログが出ないため、ダイアログ内のページ数・字形・配置は人が別途確認する。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3e907af0", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.observe_pdf_print(page)\n", + " frame = preview.viewer(page)\n", + " if await frame.locator('#print').is_visible():\n", + " await frame.locator('#print').click()\n", + " else:\n", + " await frame.locator('#secondaryToolbarToggle').click()\n", + " await frame.locator('#secondaryPrint').click()\n", + " await preview.expect_pdf_print(page, render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "7901d5ee", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e4275cb2", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "d37c0905", + "metadata": {}, + "source": [ + "## 一覧から preview.pdf をもう一度開く\n", + "\n", + "ページ番号欄に `1` を入力して Enter を押す。前回の表示位置にかかわらず、1ページ目を確認する。\n", + "\n", + "全2ページのうち1ページ目が表示されること。「日本語プレビュー 1ページ目」「研究データ」「MFR PDF page 1」と、画像と同じ3色の図形・英数字が読めること。日本語が空白や四角になっていないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d96d4cf", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.pdf', render_timeout)\n", + " await expect(preview.viewer(page).locator('#viewer .page canvas').first).to_be_visible(timeout=render_timeout)\n", + " await preview.viewer(page).locator('#pageNumber').fill('1')\n", + " await preview.viewer(page).locator('#pageNumber').press('Enter')\n", + " await preview.expect_pdf_page(page, 1, '研究データ', render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "55ec8dd4", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "234508cb", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "9bcf0191", + "metadata": {}, + "source": [ + "## 一覧から preview.docx を開き、変換後の1ページ目を確認する\n", + "\n", + "変換が完了すると PDF ビューアーに全2ページが表示されること。1ページ目に「MFR DOCX page 1」「日本語の表示確認 1ページ目」と3色の図形・英数字が表示され、欠けや文字化けがないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b7f0518", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.docx', render_timeout)\n", + " await preview.expect_pdf_page(page, 1, 'MFR DOCX page 1', render_timeout)\n", + " await expect(preview.viewer(page).locator('#pageContainer1 .textLayer')).to_contain_text('日本語の表示確認', timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "310e6e37", + "metadata": {}, + "source": [ + "## preview.docx の「次のページ」を押す\n", + "\n", + "2ページ目に「MFR DOCX page 2」「日本語の表示確認 2ページ目」と図形が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a98d98b", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('#next').click()\n", + " await preview.expect_pdf_page(page, 2, 'MFR DOCX page 2', render_timeout)\n", + " await expect(preview.viewer(page).locator('#pageContainer2 .textLayer')).to_contain_text('日本語の表示確認', timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "c0d76938", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d9faf8e5", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "3fa7d8f6", + "metadata": {}, + "source": [ + "## 一覧から preview.docx をもう一度開く\n", + "\n", + "ページ番号欄に `1` を入力して Enter を押す。前回の表示位置にかかわらず、1ページ目を確認する。\n", + "\n", + "変換が完了すると PDF ビューアーに全2ページが表示されること。1ページ目に「MFR DOCX page 1」「日本語の表示確認 1ページ目」と3色の図形・英数字が表示され、欠けや文字化けがないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "042be534", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.docx', render_timeout)\n", + " await expect(preview.viewer(page).locator('#viewer .page canvas').first).to_be_visible(timeout=render_timeout)\n", + " await preview.viewer(page).locator('#pageNumber').fill('1')\n", + " await preview.viewer(page).locator('#pageNumber').press('Enter')\n", + " await preview.expect_pdf_page(page, 1, 'MFR DOCX page 1', render_timeout)\n", + " await expect(preview.viewer(page).locator('#pageContainer1 .textLayer')).to_contain_text('日本語の表示確認', timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "422c2195", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98ed9770", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "3fdae9ee", + "metadata": {}, + "source": [ + "## 一覧から preview.pptx を開き、変換後の1ページ目を確認する\n", + "\n", + "変換が完了すると PDF ビューアーに全2ページが表示されること。1ページ目に「MFR PPTX page 1」「日本語の表示確認 1ページ目」と3色の図形・英数字が表示され、欠けや文字化けがないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38acab0e", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.pptx', render_timeout)\n", + " await preview.expect_pdf_page(page, 1, 'MFR PPTX page 1', render_timeout)\n", + " await expect(preview.viewer(page).locator('#pageContainer1 .textLayer')).to_contain_text('日本語の表示確認', timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "16f759e9", + "metadata": {}, + "source": [ + "## preview.pptx の「次のページ」を押す\n", + "\n", + "2ページ目に「MFR PPTX page 2」「日本語の表示確認 2ページ目」と図形が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "566c3867", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('#next').click()\n", + " await preview.expect_pdf_page(page, 2, 'MFR PPTX page 2', render_timeout)\n", + " await expect(preview.viewer(page).locator('#pageContainer2 .textLayer')).to_contain_text('日本語の表示確認', timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "62b8af59", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2330651c", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "200f12ee", + "metadata": {}, + "source": [ + "## 一覧から preview.pptx をもう一度開く\n", + "\n", + "ページ番号欄に `1` を入力して Enter を押す。前回の表示位置にかかわらず、1ページ目を確認する。\n", + "\n", + "変換が完了すると PDF ビューアーに全2ページが表示されること。1ページ目に「MFR PPTX page 1」「日本語の表示確認 1ページ目」と3色の図形・英数字が表示され、欠けや文字化けがないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8756b231", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.pptx', render_timeout)\n", + " await expect(preview.viewer(page).locator('#viewer .page canvas').first).to_be_visible(timeout=render_timeout)\n", + " await preview.viewer(page).locator('#pageNumber').fill('1')\n", + " await preview.viewer(page).locator('#pageNumber').press('Enter')\n", + " await preview.expect_pdf_page(page, 1, 'MFR PPTX page 1', render_timeout)\n", + " await expect(preview.viewer(page).locator('#pageContainer1 .textLayer')).to_contain_text('日本語の表示確認', timeout=render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "a02469ff", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "561c4ecc", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "3bcb1663", + "metadata": {}, + "source": [ + "## 一覧から preview.csv を開く\n", + "\n", + "見出しが「名称」「数量」「日付」、データが次の2行であること。日本語・負の数・日付が欠けずに表示されること。\n", + "\n", + "| 名称 | 数量 | 日付 |\n", + "| --- | --- | --- |\n", + "| 東京 | 123 | 2026-01-02 |\n", + "| 大阪 | -45 | 2026-03-04 |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "440dfd52", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.csv', render_timeout)\n", + " await preview.expect_table(page, [\n", + " ['東京', '123', '2026-01-02'], ['大阪', '-45', '2026-03-04'],\n", + " ], render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "b361226d", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cca74003", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "d80c6fe1", + "metadata": {}, + "source": [ + "## 一覧から preview.csv をもう一度開く\n", + "\n", + "見出しが「名称」「数量」「日付」、データが次の2行であること。日本語・負の数・日付が欠けずに表示されること。\n", + "\n", + "| 名称 | 数量 | 日付 |\n", + "| --- | --- | --- |\n", + "| 東京 | 123 | 2026-01-02 |\n", + "| 大阪 | -45 | 2026-03-04 |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "06f669a8", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.csv', render_timeout)\n", + " await preview.expect_table(page, [\n", + " ['東京', '123', '2026-01-02'], ['大阪', '-45', '2026-03-04'],\n", + " ], render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "b3892173", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38c295d1", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "1cdfe8bb", + "metadata": {}, + "source": [ + "## 一覧から preview.xlsx を開き、「測定値」を確認する\n", + "\n", + "見出しが「名称」「数量」「日付」、データが次の2行であること。日本語・負の数・日付が欠けずに表示されること。\n", + "\n", + "| 名称 | 数量 | 日付 |\n", + "| --- | --- | --- |\n", + "| 東京 | 123 | 2026-01-02 |\n", + "| 大阪 | -45 | 2026-03-04 |\n", + "\n", + "「測定値」「集計」の2つのシートが表示され、最初は「測定値」が開くこと。日付型のセルは `2026-01-02T00:00:00` のように時刻付きで表示される。Excel の内部シリアル値になっていないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b46f9b95", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.xlsx', render_timeout)\n", + " await expect(preview.viewer(page).locator('#tabular-tabs a[role=tab]')).to_have_text(['測定値', '集計'], timeout=render_timeout)\n", + " await preview.expect_table(page, [\n", + " ['東京', '123', '2026-01-02T00:00:00'],\n", + " ['大阪', '-45', '2026-03-04T00:00:00'],\n", + " ], render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "422887bc", + "metadata": {}, + "source": [ + "## XLSX の「集計」シートをクリックする\n", + "\n", + "表が切り替わり、1行だけ「合計」「78」「2026-03-05T00:00:00」が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d12aaca", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('#tabular-tabs').get_by_role('tab', name='集計', exact=True).click()\n", + " await preview.expect_table(page, [['合計', '78', '2026-03-05T00:00:00']], render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "bfe5f29e", + "metadata": {}, + "source": [ + "## XLSX の「測定値」シートに戻る\n", + "\n", + "見出しが「名称」「数量」「日付」、データが次の2行であること。日本語・負の数・日付が欠けずに表示されること。\n", + "\n", + "| 名称 | 数量 | 日付 |\n", + "| --- | --- | --- |\n", + "| 東京 | 123 | 2026-01-02 |\n", + "| 大阪 | -45 | 2026-03-04 |\n", + "\n", + "「測定値」「集計」の2つのシートが表示され、最初は「測定値」が開くこと。日付型のセルは `2026-01-02T00:00:00` のように時刻付きで表示される。Excel の内部シリアル値になっていないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9bc23cea", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('#tabular-tabs').get_by_role('tab', name='測定値', exact=True).click()\n", + " await expect(preview.viewer(page).locator('#tabular-tabs a[role=tab]')).to_have_text(['測定値', '集計'], timeout=render_timeout)\n", + " await preview.expect_table(page, [\n", + " ['東京', '123', '2026-01-02T00:00:00'],\n", + " ['大阪', '-45', '2026-03-04T00:00:00'],\n", + " ], render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "a5854a92", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f9f563d", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "7d3c31c4", + "metadata": {}, + "source": [ + "## 一覧から preview.xlsx をもう一度開く\n", + "\n", + "見出しが「名称」「数量」「日付」、データが次の2行であること。日本語・負の数・日付が欠けずに表示されること。\n", + "\n", + "| 名称 | 数量 | 日付 |\n", + "| --- | --- | --- |\n", + "| 東京 | 123 | 2026-01-02 |\n", + "| 大阪 | -45 | 2026-03-04 |\n", + "\n", + "「測定値」「集計」の2つのシートが表示され、最初は「測定値」が開くこと。日付型のセルは `2026-01-02T00:00:00` のように時刻付きで表示される。Excel の内部シリアル値になっていないこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f0d4036", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.xlsx', render_timeout)\n", + " await expect(preview.viewer(page).locator('#tabular-tabs a[role=tab]')).to_have_text(['測定値', '集計'], timeout=render_timeout)\n", + " await preview.expect_table(page, [\n", + " ['東京', '123', '2026-01-02T00:00:00'],\n", + " ['大阪', '-45', '2026-03-04T00:00:00'],\n", + " ], render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "ab86dabc", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a9dc8632", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "8eb6f15e", + "metadata": {}, + "source": [ + "## 一覧から preview.webm を開く\n", + "\n", + "動画プレーヤーと再生ボタンが表示され、停止した状態で開くこと。この動画は12秒・音声なしのカラーパターンである。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "528dc01e", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.webm', render_timeout)\n", + " await expect(preview.viewer(page).locator('video')).to_be_visible(timeout=render_timeout)\n", + " await expect(preview.viewer(page).locator('video')).to_have_js_property('paused', True)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "23e93b7d", + "metadata": {}, + "source": [ + "## 動画プレーヤーにフォーカスし、Space キーで再生する\n", + "\n", + "Tab キーで動画プレーヤーへフォーカスを移し、Space キーを押す。カラーパターンが動き、再生位置が進むこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84f109c7", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('video').press('Space')\n", + " await preview.wait_video(page, 'video => !video.paused && video.currentTime >= 1 && video.videoWidth === 320', render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "0426c1e3", + "metadata": {}, + "source": [ + "## Space キーで動画を一時停止する\n", + "\n", + "動画プレーヤーにフォーカスしたまま Space キーを押す。映像と再生位置が止まること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bedb5c3a", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('video').press('Space')\n", + " await expect(preview.viewer(page).locator('video')).to_have_js_property('paused', True)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "1977371a", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de528624", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "f3a6dde1", + "metadata": {}, + "source": [ + "## 一覧から preview.webm をもう一度開く\n", + "\n", + "動画プレーヤーと再生ボタンが表示され、停止した状態で開くこと。この動画は12秒・音声なしのカラーパターンである。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36518451", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.open_file(page, 'preview.webm', render_timeout)\n", + " await expect(preview.viewer(page).locator('video')).to_be_visible(timeout=render_timeout)\n", + " await expect(preview.viewer(page).locator('video')).to_have_js_property('paused', True)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "a93bae7a", + "metadata": {}, + "source": [ + "## 再表示した動画を Space キーで再生する\n", + "\n", + "再表示後もカラーパターンが動き、再生位置が進むこと。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61877718", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.viewer(page).locator('video').press('Space')\n", + " await preview.wait_video(page, 'video => !video.paused && video.currentTime >= 1 && video.videoWidth === 320', render_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "b781f48a", + "metadata": {}, + "source": [ + "## 上部の「ファイル」をクリックして一覧に戻る\n", + "\n", + "プレビューが閉じ、対象ストレージのファイル一覧が表示されること。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2eaab3d9", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " await preview.file_list(page, target_storage_name, transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "a4d70081", + "metadata": {}, + "source": [ + "## 目視確認を終えたらテスト用プロジェクトを片付ける\n", + "\n", + "`delete_project=True` の場合は、この手順で作成したプロジェクトの「設定」から「プロジェクトの削除」を選び、確認文字列を入力して削除する。プロジェクトを削除した画面が表示されること。\n", + "`False` の場合はプロジェクトを残す。残したプロジェクトは、印刷や描画の目視確認後に同じ操作で削除できる。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a32fb15", + "metadata": {}, + "outputs": [], + "source": [ + "async def _step(page):\n", + " if delete_project:\n", + " await grdm.delete_project(page, transition_timeout=transition_timeout)\n", + " await expect(page.locator('#projectNavFiles a')).to_have_count(0, timeout=transition_timeout)\n", + "\n", + "await run_pw(_step)" + ] + }, + { + "cell_type": "markdown", + "id": "c88d43d5", + "metadata": {}, + "source": [ + "## ブラウザーを閉じて証跡を保存する\n", + "\n", + "自動実行ではブラウザーを閉じ、`default_result_path` に動画・通信記録などを保存する。手動実施では、目視結果を記録してブラウザーを閉じる。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c6314f0", + "metadata": {}, + "outputs": [], + "source": [ + "await finish_pw_context()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c6352ca60865cf1aeff9164a734d969da88e0373 Mon Sep 17 00:00:00 2001 From: Taku Miyamoto <40813148+miyamoto83@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:38:44 +0900 Subject: [PATCH 2/6] Resolve the MFR and WaterButler images once in build-images and pass them to the E2E jobs as outputs instead of resolving them in every job --- .github/workflows/e2e-test.yml | 38 +++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index bcf5dff3..74c0d2da 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -108,7 +108,9 @@ jobs: build-images: runs-on: ubuntu-latest outputs: + wb_image: ${{ steps.wb_params.outputs.image }} wb_custom: ${{ steps.wb_params.outputs.branch != '' }} + mfr_image: ${{ steps.mfr_params.outputs.image }} steps: - name: Checkout test repository uses: actions/checkout@v4 @@ -139,10 +141,15 @@ jobs: printf '%s\n' "$PR_BODY" > /tmp/pr_body.txt echo "repository=$(grep -oP '^-\s*WB_REPOSITORY:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true)" >> $GITHUB_OUTPUT echo "branch=$(grep -oP '^-\s*WB_BRANCH:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true)" >> $GITHUB_OUTPUT + WB_IMAGE=$(grep -oP '^-\s*WB_IMAGE:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true) else echo "repository=${{ github.event.inputs.wb_repository }}" >> $GITHUB_OUTPUT echo "branch=${{ github.event.inputs.wb_branch }}" >> $GITHUB_OUTPUT + WB_IMAGE="${{ github.event.inputs.wb_image }}" fi + # The image is resolved here once for both trigger types and passed on as a job + # output, so every E2E job wires the same image the same way + echo "image=${WB_IMAGE:-niicloudoperation/rdm-waterbutler:latest}" >> $GITHUB_OUTPUT - name: Build custom WaterButler image if: steps.wb_params.outputs.branch != '' @@ -168,6 +175,19 @@ jobs: cd .. docker save -o prebuilt-images/rdm-waterbutler-custom.tar rdm-waterbutler:custom + - name: Parse MFR parameters + id: mfr_params + env: + PR_BODY: ${{ github.event.pull_request.body }} + run: | + if [[ "${{ github.event_name }}" == "pull_request" ]]; then + printf '%s\n' "$PR_BODY" > /tmp/pr_body.txt + MFR_IMAGE=$(grep -oP '^-\s*MFR_IMAGE:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true) + else + MFR_IMAGE="${{ github.event.inputs.mfr_image }}" + fi + echo "image=${MFR_IMAGE:-niicloudoperation/rdm-modular-file-renderer:latest}" >> $GITHUB_OUTPUT + - name: Upload prebuilt images uses: actions/upload-artifact@v4 with: @@ -1012,8 +1032,6 @@ jobs: OSF_OVERRIDE=$(grep -oP '^-\s*OSF_IMAGE:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' ' || true) EMBER_OVERRIDE=$(grep -oP '^-\s*EMBER_IMAGE:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' ' || true) CAS_OVERRIDE=$(grep -oP '^-\s*CAS_IMAGE:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' ' || true) - MFR_OVERRIDE=$(grep -oP '^-\s*MFR_IMAGE:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' ' || true) - WB_OVERRIDE=$(grep -oP '^-\s*WB_IMAGE:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' ' || true) EXCLUDE_NOTEBOOKS_OVERRIDE=$(grep -oP '^-\s*EXCLUDE_NOTEBOOKS:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d '\r' || true) # Extract TLJH parameters from PR body @@ -1038,12 +1056,6 @@ jobs: fi export EMBER_IMAGE="${EMBER_OVERRIDE:-niicloudoperation/rdm-ember-osf-web:latest}" export CAS_IMAGE="${CAS_OVERRIDE:-niicloudoperation/rdm-cas-overlay:latest}" - export MFR_IMAGE="${MFR_OVERRIDE:-niicloudoperation/rdm-modular-file-renderer:latest}" - if [[ -n "$WB_IMAGE" ]]; then - export WB_IMAGE - else - export WB_IMAGE="${WB_OVERRIDE:-niicloudoperation/rdm-waterbutler:latest}" - fi else # Use workflow dispatch inputs or defaults # If WIKI_ENABLED, OSF_IMAGE was already set to the wiki-built image; preserve it @@ -1054,13 +1066,11 @@ jobs: fi export EMBER_IMAGE="${{ github.event.inputs.ember_image || 'niicloudoperation/rdm-ember-osf-web:latest' }}" export CAS_IMAGE="${{ github.event.inputs.cas_image || 'niicloudoperation/rdm-cas-overlay:latest' }}" - export MFR_IMAGE="${{ github.event.inputs.mfr_image || 'niicloudoperation/rdm-modular-file-renderer:latest' }}" - if [[ -n "$WB_IMAGE" ]]; then - export WB_IMAGE - else - export WB_IMAGE="${{ github.event.inputs.wb_image || 'niicloudoperation/rdm-waterbutler:latest' }}" - fi fi + # MFR and WaterButler were resolved by build-images once for both trigger types; + # images built there were already set when loaded + export MFR_IMAGE="${MFR_IMAGE:-${{ needs.build-images.outputs.mfr_image }}}" + export WB_IMAGE="${WB_IMAGE:-${{ needs.build-images.outputs.wb_image }}}" source ${{ github.workspace }}/e2e-tests/.github/scripts/setup_rdm.sh create_docker_override From ffa0541d97f4f4acb612a841a93c4743fa441744 Mon Sep 17 00:00:00 2001 From: Taku Miyamoto <40813148+miyamoto83@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:38:44 +0900 Subject: [PATCH 3/6] Support WaterButler images that bundle their dependencies in the E2E setup, detecting how the image carries them and wiring the compose override by that layout --- .github/pull_request_template.md | 2 + .github/scripts/setup_rdm.sh | 70 +++++++++++++++++++++++++++++++- .github/workflows/e2e-test.yml | 38 ++++++++++++++++- 3 files changed, 107 insertions(+), 3 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index fae850b9..808ef962 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -15,5 +15,7 @@ - CAS_IMAGE: - MFR_IMAGE: - WB_IMAGE: +- WB_REPOSITORY: +- WB_BRANCH: - EXCLUDE_NOTEBOOKS: diff --git a/.github/scripts/setup_rdm.sh b/.github/scripts/setup_rdm.sh index 21115103..fdbe3dd1 100644 --- a/.github/scripts/setup_rdm.sh +++ b/.github/scripts/setup_rdm.sh @@ -225,6 +225,64 @@ BINDERHUB_EOF # Function to create docker-compose override with NII Cloud Operation images create_docker_override() { + # How the WaterButler image carries its Python dependencies, as detected from the image + # by the E2E workflow (WB_LAYOUT) together with the directory that holds the + # interpreter's library and site-packages (WB_LIBDIR, e.g. /usr/local/lib/python3.13): + # legacy - the image ships pip and the requirements volume is populated by running + # "invoke install", as the RDM-osf.io compose definition does for it + # bundled - the image has no pip and brings its dependencies installed, so the volume + # is populated by copying the installed library tree instead + # The volumes get the library directory in their names so that an environment upgraded + # from a legacy image gets fresh volumes: a volume that already holds the old + # site-packages and the old interpreter in /usr/local/bin would otherwise be mounted + # into the new image. + # The legacy directory is the one the RDM-osf.io docker-compose.yml mounts. + local legacy_wb_libdir='/usr/local/lib/python3.6' + + local wb_layout="${WB_LAYOUT:-legacy}" + local wb_libdir="${WB_LIBDIR:-}" + local wb_libname='' wb_voltag='' + local wb_requirements_override='' + local wb_volumes_override='' + local wb_volumes_declaration='' + + case "$wb_layout" in + legacy) + if [ -n "$wb_libdir" ] && [ "$wb_libdir" != "$legacy_wb_libdir" ]; then + echo "WaterButler image keeps its libraries in $wb_libdir, but the legacy compose definition mounts $legacy_wb_libdir" >&2 + return 1 + fi + ;; + bundled) + wb_libname=$(basename "$wb_libdir") + if ! printf '%s' "$wb_libname" | grep -Eq '^python3\.[0-9]+$'; then + echo "WB_LIBDIR must name the library directory of a WaterButler image with bundled dependencies (got '$wb_libdir')" >&2 + return 1 + fi + wb_voltag=${wb_libname#python} + wb_voltag=${wb_voltag//./_} + wb_requirements_override=" command: + - /bin/bash + - -c + - rm -Rf /${wb_libname}/* && + cp -Rf -p ${wb_libdir} / + volumes: + - wb_requirements_${wb_voltag}_vol:/${wb_libname} + - wb_requirements_${wb_voltag}_local_bin_vol:/usr/local/bin" + wb_volumes_override=" volumes: + - wb_requirements_${wb_voltag}_vol:${wb_libdir} + - wb_requirements_${wb_voltag}_local_bin_vol:/usr/local/bin" + wb_volumes_declaration=" wb_requirements_${wb_voltag}_vol: + external: false + wb_requirements_${wb_voltag}_local_bin_vol: + external: false" + ;; + *) + echo "Unsupported WaterButler dependency layout: $wb_layout" >&2 + return 1 + ;; + esac + # Use environment variables for images local osf_image="${OSF_IMAGE:-niicloudoperation/rdm-osf.io:latest}" local ember_image="${EMBER_IMAGE:-niicloudoperation/rdm-ember-osf-web:latest}" @@ -239,7 +297,7 @@ create_docker_override() { echo " Ember: $ember_image" echo " CAS: $cas_image" echo " MFR: $mfr_image" - echo " WaterButler: $wb_image" + echo " WaterButler: $wb_image ($wb_layout dependencies${wb_libdir:+, libraries in $wb_libdir})" echo " Elasticsearch: $elasticsearch_image" if [ -n "$y_websocket_url" ]; then echo " Y-WebSocket: $y_websocket_url" @@ -298,10 +356,13 @@ services: image: ${mfr_image} wb: image: ${wb_image} +${wb_volumes_override} wb_worker: image: ${wb_image} +${wb_volumes_override} wb_requirements: image: ${wb_image} +${wb_requirements_override} kaken_elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.14.3 environment: @@ -349,6 +410,13 @@ EOL "${PWD}/docker-compose.override.yml" \ "${script_dir}/../../../weko/nginx/keys/server.crt" fi + + # Top-level volume declarations go last: the steps above append further services + # to the override file, and they must stay under "services:". + if [ -n "$wb_volumes_declaration" ]; then + printf '\nvolumes:\n' >> docker-compose.override.yml + printf '%s\n' "$wb_volumes_declaration" >> docker-compose.override.yml + fi } # Function to run Django migrations diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 74c0d2da..617e1d9f 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -110,6 +110,8 @@ jobs: outputs: wb_image: ${{ steps.wb_params.outputs.image }} wb_custom: ${{ steps.wb_params.outputs.branch != '' }} + wb_layout: ${{ steps.wb_layout.outputs.layout }} + wb_libdir: ${{ steps.wb_layout.outputs.libdir }} mfr_image: ${{ steps.mfr_params.outputs.image }} steps: - name: Checkout test repository @@ -175,6 +177,36 @@ jobs: cd .. docker save -o prebuilt-images/rdm-waterbutler-custom.tar rdm-waterbutler:custom + - name: Detect WaterButler dependency layout + id: wb_layout + run: | + # The E2E jobs wire the image by two facts asked from the image itself, so the + # workflow stays valid when the published image moves to a new Python version: + # - the directory that holds the interpreter's library and site-packages, which + # is where the dependency volume is mounted + # - whether the image ships pip: then its dependencies are installed at startup + # with "invoke install" (legacy); otherwise it brings them installed (bundled) + if [ "${{ steps.wb_params.outputs.branch }}" != "" ]; then + IMAGE="rdm-waterbutler:custom" + else + IMAGE="${{ steps.wb_params.outputs.image }}" + docker pull "$IMAGE" + fi + PURELIB=$(docker run --rm --entrypoint python3 "$IMAGE" -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])') + if [ -z "$PURELIB" ]; then + echo "Could not detect the library directory of $IMAGE" >&2 + exit 1 + fi + LIBDIR=$(dirname "$PURELIB") + if docker run --rm --entrypoint python3 "$IMAGE" -m pip --version >/dev/null 2>&1; then + LAYOUT=legacy + else + LAYOUT=bundled + fi + echo "Detected $LAYOUT dependency layout in $IMAGE (libraries in $LIBDIR)" + echo "layout=$LAYOUT" >> $GITHUB_OUTPUT + echo "libdir=$LIBDIR" >> $GITHUB_OUTPUT + - name: Parse MFR parameters id: mfr_params env: @@ -1067,10 +1099,12 @@ jobs: export EMBER_IMAGE="${{ github.event.inputs.ember_image || 'niicloudoperation/rdm-ember-osf-web:latest' }}" export CAS_IMAGE="${{ github.event.inputs.cas_image || 'niicloudoperation/rdm-cas-overlay:latest' }}" fi - # MFR and WaterButler were resolved by build-images once for both trigger types; - # images built there were already set when loaded + # MFR and WaterButler were resolved by build-images, which also detected how each + # image carries its dependencies; images built there were already set when loaded export MFR_IMAGE="${MFR_IMAGE:-${{ needs.build-images.outputs.mfr_image }}}" export WB_IMAGE="${WB_IMAGE:-${{ needs.build-images.outputs.wb_image }}}" + export WB_LAYOUT="${{ needs.build-images.outputs.wb_layout }}" + export WB_LIBDIR="${{ needs.build-images.outputs.wb_libdir }}" source ${{ github.workspace }}/e2e-tests/.github/scripts/setup_rdm.sh create_docker_override From 8d44f8a0a221c1b6287159002ef25df1d50a89b2 Mon Sep 17 00:00:00 2001 From: Taku Miyamoto <40813148+miyamoto83@users.noreply.github.com> Date: Mon, 26 Oct 2026 20:35:03 +0900 Subject: [PATCH 4/6] Support MFR images that bundle their dependencies in the E2E setup, building them from a branch and rendering office documents through a Celery worker and unoserver --- .github/pull_request_template.md | 4 + .github/scripts/setup_rdm.sh | 131 +++++++++++++++++++++++++++++-- .github/workflows/e2e-test.yml | 100 +++++++++++++++++++++++ 3 files changed, 228 insertions(+), 7 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 808ef962..a2788614 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,6 +14,10 @@ - EMBER_IMAGE: - CAS_IMAGE: - MFR_IMAGE: +- MFR_REPOSITORY: +- MFR_BRANCH: +- UNOSERVER_IMAGE: + - WB_IMAGE: - WB_REPOSITORY: - WB_BRANCH: diff --git a/.github/scripts/setup_rdm.sh b/.github/scripts/setup_rdm.sh index fdbe3dd1..9057ebc4 100644 --- a/.github/scripts/setup_rdm.sh +++ b/.github/scripts/setup_rdm.sh @@ -225,9 +225,10 @@ BINDERHUB_EOF # Function to create docker-compose override with NII Cloud Operation images create_docker_override() { - # How the WaterButler image carries its Python dependencies, as detected from the image - # by the E2E workflow (WB_LAYOUT) together with the directory that holds the - # interpreter's library and site-packages (WB_LIBDIR, e.g. /usr/local/lib/python3.13): + # How the WaterButler and MFR images carry their Python dependencies, as detected from + # the images by the E2E workflow (WB_LAYOUT / MFR_LAYOUT) together with the directory + # that holds the interpreter's library and site-packages (WB_LIBDIR / MFR_LIBDIR, + # e.g. /usr/local/lib/python3.13): # legacy - the image ships pip and the requirements volume is populated by running # "invoke install", as the RDM-osf.io compose definition does for it # bundled - the image has no pip and brings its dependencies installed, so the volume @@ -236,8 +237,9 @@ create_docker_override() { # from a legacy image gets fresh volumes: a volume that already holds the old # site-packages and the old interpreter in /usr/local/bin would otherwise be mounted # into the new image. - # The legacy directory is the one the RDM-osf.io docker-compose.yml mounts. + # The legacy directories are the ones the RDM-osf.io docker-compose.yml mounts. local legacy_wb_libdir='/usr/local/lib/python3.6' + local legacy_mfr_libdir='/usr/local/lib/python3.5' local wb_layout="${WB_LAYOUT:-legacy}" local wb_libdir="${WB_LIBDIR:-}" @@ -283,6 +285,71 @@ create_docker_override() { ;; esac + # MFR is handled the same way. An MFR image with bundled dependencies renders office + # documents only through a Celery worker that hands the conversion to a LibreOffice + # server (unoserver), so both are added as services and the legacy "unoconv" listener + # is not used. The MFR server and its worker exchange files through /tmp, so the + # worker mounts the same volume as the server. + local mfr_layout="${MFR_LAYOUT:-legacy}" + local mfr_libdir="${MFR_LIBDIR:-}" + local mfr_libname='' mfr_voltag='' + local unoserver_image="${UNOSERVER_IMAGE:-}" + local mfr_requirements_override='' + local mfr_volumes_override='' + local mfr_depends_on_override='' + local mfr_volumes_declaration='' + local mfr_env_additions='' + + case "$mfr_layout" in + legacy) + if [ -n "$mfr_libdir" ] && [ "$mfr_libdir" != "$legacy_mfr_libdir" ]; then + echo "MFR image keeps its libraries in $mfr_libdir, but the legacy compose definition mounts $legacy_mfr_libdir" >&2 + return 1 + fi + ;; + bundled) + mfr_libname=$(basename "$mfr_libdir") + if ! printf '%s' "$mfr_libname" | grep -Eq '^python3\.[0-9]+$'; then + echo "MFR_LIBDIR must name the library directory of an MFR image with bundled dependencies (got '$mfr_libdir')" >&2 + return 1 + fi + if [ -z "$unoserver_image" ]; then + echo "UNOSERVER_IMAGE must be set for an MFR image with bundled dependencies" >&2 + return 1 + fi + mfr_voltag=${mfr_libname#python} + mfr_voltag=${mfr_voltag//./_} + mfr_requirements_override=" command: + - /bin/bash + - -c + - rm -Rf /${mfr_libname}/* && + cp -Rf -p ${mfr_libdir} / + volumes: + - mfr_requirements_${mfr_voltag}_vol:/${mfr_libname} + - mfr_requirements_${mfr_voltag}_local_bin_vol:/usr/local/bin" + mfr_volumes_override=" volumes: + - mfr_requirements_${mfr_voltag}_vol:${mfr_libdir} + - mfr_requirements_${mfr_voltag}_local_bin_vol:/usr/local/bin" + mfr_depends_on_override=' depends_on: + mfr_worker: + condition: service_healthy' + mfr_volumes_declaration=" mfr_requirements_${mfr_voltag}_vol: + external: false + mfr_requirements_${mfr_voltag}_local_bin_vol: + external: false" + mfr_env_additions=' +# Celery worker and LibreOffice conversion server for office document rendering +TASKS_CONFIG_BROKER_URL=amqp://guest:guest@rabbitmq:5672// +TASKS_CONFIG_WAIT_TIMEOUT=120 +UNOSERVER_EXTENSION_CONFIG_HOST=unoserver +UNOSERVER_EXTENSION_CONFIG_PORT=2003' + ;; + *) + echo "Unsupported MFR dependency layout: $mfr_layout" >&2 + return 1 + ;; + esac + # Use environment variables for images local osf_image="${OSF_IMAGE:-niicloudoperation/rdm-osf.io:latest}" local ember_image="${EMBER_IMAGE:-niicloudoperation/rdm-ember-osf-web:latest}" @@ -292,11 +359,48 @@ create_docker_override() { local elasticsearch_image="${ELASTICSEARCH_IMAGE:-elasticsearch:2}" local y_websocket_url="${Y_WEBSOCKET_URL:-}" + # Services that only exist for an MFR image with bundled dependencies. They are appended + # inside the "services:" block of the override, so the text starts at service indentation. + local mfr_worker_services='' + if [ "$mfr_layout" = "bundled" ]; then + mfr_worker_services=" mfr_worker: + image: ${mfr_image} + command: python3 -m invoke celery --hostname=mfr@%h --concurrency=2 + restart: unless-stopped + env_file: + - .docker-compose.mfr.env + volumes: + - mfr_requirements_${mfr_voltag}_vol:${mfr_libdir} + - mfr_requirements_${mfr_voltag}_local_bin_vol:/usr/local/bin + - wb_tmp_vol:/tmp + depends_on: + rabbitmq: + condition: service_started + unoserver: + condition: service_healthy + healthcheck: + test: [\"CMD-SHELL\", \"python3 -m celery -A mfr.tasks.app:app inspect ping --destination=mfr@\$\$HOSTNAME --timeout=5\"] + interval: 10s + timeout: 10s + retries: 12 + unoserver: + image: ${unoserver_image} + restart: unless-stopped + healthcheck: + test: [\"CMD\", \"python3\", \"-c\", \"from xmlrpc.client import ServerProxy; ServerProxy('http://127.0.0.1:2003').info()\"] + interval: 10s + timeout: 10s + retries: 12" + fi + echo "Creating docker-compose override with:" echo " OSF: $osf_image" echo " Ember: $ember_image" echo " CAS: $cas_image" - echo " MFR: $mfr_image" + echo " MFR: $mfr_image ($mfr_layout dependencies${mfr_libdir:+, libraries in $mfr_libdir})" + if [ -n "$unoserver_image" ]; then + echo " unoserver: $unoserver_image" + fi echo " WaterButler: $wb_image ($wb_layout dependencies${wb_libdir:+, libraries in $wb_libdir})" echo " Elasticsearch: $elasticsearch_image" if [ -n "$y_websocket_url" ]; then @@ -352,8 +456,12 @@ services: image: ${cas_image} mfr: image: ${mfr_image} +${mfr_volumes_override} +${mfr_depends_on_override} mfr_requirements: image: ${mfr_image} +${mfr_requirements_override} +${mfr_worker_services} wb: image: ${wb_image} ${wb_volumes_override} @@ -397,6 +505,10 @@ EOL echo "" >> .docker-compose.wb.env echo "SERVER_CONFIG_DOMAIN=http://192.168.168.167:7777" >> .docker-compose.wb.env + if [ -n "$mfr_env_additions" ]; then + printf '%s\n' "$mfr_env_additions" >> .docker-compose.mfr.env + fi + if [ "${MINIO_ENABLED:-false}" = "true" ]; then local script_dir script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -413,9 +525,14 @@ EOL # Top-level volume declarations go last: the steps above append further services # to the override file, and they must stay under "services:". - if [ -n "$wb_volumes_declaration" ]; then + if [ -n "$wb_volumes_declaration" ] || [ -n "$mfr_volumes_declaration" ]; then printf '\nvolumes:\n' >> docker-compose.override.yml - printf '%s\n' "$wb_volumes_declaration" >> docker-compose.override.yml + if [ -n "$wb_volumes_declaration" ]; then + printf '%s\n' "$wb_volumes_declaration" >> docker-compose.override.yml + fi + if [ -n "$mfr_volumes_declaration" ]; then + printf '%s\n' "$mfr_volumes_declaration" >> docker-compose.override.yml + fi fi } diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 617e1d9f..2c9800e9 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -39,6 +39,18 @@ on: description: 'Custom MFR image (default: niicloudoperation/rdm-modular-file-renderer:latest)' required: false default: '' + mfr_repository: + description: 'RDM-modular-file-renderer repository (default: RCOSDP/RDM-modular-file-renderer)' + required: false + default: '' + mfr_branch: + description: 'RDM-modular-file-renderer branch to build and test against' + required: false + default: '' + unoserver_image: + description: 'unoserver image for an MFR image that bundles its dependencies (default: built from the MFR sources; ignored when mfr_branch is given). How the MFR and WaterButler images carry their dependencies is detected from the images' + required: false + default: '' wb_image: description: 'Custom WaterButler image (default: niicloudoperation/rdm-waterbutler:latest)' required: false @@ -113,6 +125,11 @@ jobs: wb_layout: ${{ steps.wb_layout.outputs.layout }} wb_libdir: ${{ steps.wb_layout.outputs.libdir }} mfr_image: ${{ steps.mfr_params.outputs.image }} + mfr_custom: ${{ steps.mfr_params.outputs.branch != '' }} + mfr_layout: ${{ steps.mfr_layout.outputs.layout }} + mfr_libdir: ${{ steps.mfr_layout.outputs.libdir }} + unoserver_image: ${{ steps.mfr_params.outputs.unoserver_image }} + unoserver_custom: ${{ steps.unoserver_build.outcome == 'success' }} steps: - name: Checkout test repository uses: actions/checkout@v4 @@ -214,12 +231,81 @@ jobs: run: | if [[ "${{ github.event_name }}" == "pull_request" ]]; then printf '%s\n' "$PR_BODY" > /tmp/pr_body.txt + echo "repository=$(grep -oP '^-\s*MFR_REPOSITORY:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true)" >> $GITHUB_OUTPUT + echo "branch=$(grep -oP '^-\s*MFR_BRANCH:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true)" >> $GITHUB_OUTPUT + echo "unoserver_image=$(grep -oP '^-\s*UNOSERVER_IMAGE:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true)" >> $GITHUB_OUTPUT MFR_IMAGE=$(grep -oP '^-\s*MFR_IMAGE:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true) else + echo "repository=${{ github.event.inputs.mfr_repository }}" >> $GITHUB_OUTPUT + echo "branch=${{ github.event.inputs.mfr_branch }}" >> $GITHUB_OUTPUT + echo "unoserver_image=${{ github.event.inputs.unoserver_image }}" >> $GITHUB_OUTPUT MFR_IMAGE="${{ github.event.inputs.mfr_image }}" fi echo "image=${MFR_IMAGE:-niicloudoperation/rdm-modular-file-renderer:latest}" >> $GITHUB_OUTPUT + - name: Build custom MFR images + if: steps.mfr_params.outputs.branch != '' + run: | + MFR_REPO="${{ steps.mfr_params.outputs.repository || 'RCOSDP/RDM-modular-file-renderer' }}" + MFR_BRANCH="${{ steps.mfr_params.outputs.branch }}" + MFR_BASE_BRANCH="develop" + + echo "Building custom MFR images from ${MFR_REPO}@${MFR_BRANCH}" + + # Clone base branch + git clone --depth=50 -b "$MFR_BASE_BRANCH" "https://github.com/${MFR_REPO}.git" RDM-modular-file-renderer + cd RDM-modular-file-renderer + + # Merge custom branch + git fetch origin "$MFR_BRANCH" + git config user.name "github-actions[bot]" + git config user.email "RDM-e2e-test-nb@example.com" + git merge --no-ff FETCH_HEAD -m "Merge ${MFR_BRANCH} for E2E tests" + + # Build the MFR image and the LibreOffice conversion server it renders office documents with + docker build -t rdm-mfr:custom . + docker build -f Dockerfile.unoserver -t rdm-unoserver:custom . + cd .. + docker save -o prebuilt-images/rdm-mfr-custom.tar rdm-mfr:custom rdm-unoserver:custom + + - name: Detect MFR dependency layout + id: mfr_layout + run: | + if [ "${{ steps.mfr_params.outputs.branch }}" != "" ]; then + IMAGE="rdm-mfr:custom" + else + IMAGE="${{ steps.mfr_params.outputs.image }}" + docker pull "$IMAGE" + fi + PURELIB=$(docker run --rm --entrypoint python3 "$IMAGE" -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])') + if [ -z "$PURELIB" ]; then + echo "Could not detect the library directory of $IMAGE" >&2 + exit 1 + fi + LIBDIR=$(dirname "$PURELIB") + if docker run --rm --entrypoint python3 "$IMAGE" -m pip --version >/dev/null 2>&1; then + LAYOUT=legacy + else + LAYOUT=bundled + fi + echo "Detected $LAYOUT dependency layout in $IMAGE (libraries in $LIBDIR)" + echo "layout=$LAYOUT" >> $GITHUB_OUTPUT + echo "libdir=$LIBDIR" >> $GITHUB_OUTPUT + + - name: Build unoserver image for a published MFR image + id: unoserver_build + if: steps.mfr_layout.outputs.layout == 'bundled' && steps.mfr_params.outputs.branch == '' && steps.mfr_params.outputs.unoserver_image == '' + run: | + MFR_REPO="${{ steps.mfr_params.outputs.repository || 'RCOSDP/RDM-modular-file-renderer' }}" + + # An MFR image with bundled dependencies renders office documents through unoserver, and + # no published unoserver image exists yet, so it is built from the Dockerfile kept with + # the MFR sources + echo "Building unoserver image from ${MFR_REPO}@develop" + git clone --depth=1 -b develop "https://github.com/${MFR_REPO}.git" RDM-modular-file-renderer + docker build -f RDM-modular-file-renderer/Dockerfile.unoserver -t rdm-unoserver:custom RDM-modular-file-renderer + docker save -o prebuilt-images/rdm-unoserver-custom.tar rdm-unoserver:custom + - name: Upload prebuilt images uses: actions/upload-artifact@v4 with: @@ -776,6 +862,17 @@ jobs: docker load -i prebuilt-images/rdm-waterbutler-custom.tar echo "WB_IMAGE=rdm-waterbutler:custom" >> "$GITHUB_ENV" fi + + if [ "${{ needs.build-images.outputs.mfr_custom }}" = "true" ]; then + docker load -i prebuilt-images/rdm-mfr-custom.tar + echo "MFR_IMAGE=rdm-mfr:custom" >> "$GITHUB_ENV" + echo "UNOSERVER_IMAGE=rdm-unoserver:custom" >> "$GITHUB_ENV" + fi + + if [ "${{ needs.build-images.outputs.unoserver_custom }}" = "true" ]; then + docker load -i prebuilt-images/rdm-unoserver-custom.tar + echo "UNOSERVER_IMAGE=rdm-unoserver:custom" >> "$GITHUB_ENV" + fi rm -rf prebuilt-images - name: Install Docker Compose @@ -1103,8 +1200,11 @@ jobs: # image carries its dependencies; images built there were already set when loaded export MFR_IMAGE="${MFR_IMAGE:-${{ needs.build-images.outputs.mfr_image }}}" export WB_IMAGE="${WB_IMAGE:-${{ needs.build-images.outputs.wb_image }}}" + export MFR_LAYOUT="${{ needs.build-images.outputs.mfr_layout }}" + export MFR_LIBDIR="${{ needs.build-images.outputs.mfr_libdir }}" export WB_LAYOUT="${{ needs.build-images.outputs.wb_layout }}" export WB_LIBDIR="${{ needs.build-images.outputs.wb_libdir }}" + export UNOSERVER_IMAGE="${UNOSERVER_IMAGE:-${{ needs.build-images.outputs.unoserver_image }}}" source ${{ github.workspace }}/e2e-tests/.github/scripts/setup_rdm.sh create_docker_override From 693ea4bb22abd5ef95af6dc669785562e9654e4e Mon Sep 17 00:00:00 2001 From: Taku Miyamoto <40813148+miyamoto83@users.noreply.github.com> Date: Mon, 26 Oct 2026 20:35:03 +0900 Subject: [PATCH 5/6] Run the file preview E2E test in the User Tests job on both dependency layouts, starting the unoconv listener that legacy MFR images convert office documents with --- .github/scripts/setup_rdm.sh | 8 ++++++++ .github/workflows/e2e-test.yml | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/.github/scripts/setup_rdm.sh b/.github/scripts/setup_rdm.sh index 9057ebc4..8454eff8 100644 --- a/.github/scripts/setup_rdm.sh +++ b/.github/scripts/setup_rdm.sh @@ -89,6 +89,14 @@ start_rdm_services() { SERVICES="$SERVICES minio" fi + # An MFR image with legacy dependencies converts office documents through the unoconv + # listener defined in the RDM-osf.io compose file, so it is started where previews are + # tested. An image with bundled dependencies brings its own conversion services + # (mfr_worker, unoserver) through the override instead. + if [ "${MFR_PREVIEW_ENABLED:-false}" = "true" ] && [ "${MFR_LAYOUT:-legacy}" = "legacy" ]; then + SERVICES="$SERVICES unoconv" + fi + echo "Starting services: $SERVICES" # Use start_services function diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 2c9800e9..6317aefa 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -327,6 +327,7 @@ jobs: skip_admin: true skip_metadata: false skip_autofill: true + mfr_preview_enabled: true minio_enabled: false weko_enabled: false mibyo_db_enabled: false @@ -1245,6 +1246,8 @@ jobs: run: | source ${{ github.workspace }}/e2e-tests/.github/scripts/setup_rdm.sh export INCLUDE_ADMIN=${{ matrix.test-group.include_admin }} + export MFR_LAYOUT="${{ needs.build-images.outputs.mfr_layout }}" + export MFR_PREVIEW_ENABLED=${{ matrix.test-group.mfr_preview_enabled == true }} start_rdm_services - name: Register OAuth scopes @@ -1610,6 +1613,7 @@ jobs: skip_failed_test: true # Continue on failure transition_timeout: 60000 skip_preview_check: true + mfr_preview_enabled: ${{ matrix.test-group.mfr_preview_enabled == true }} skip_130mb_upload: ${{ matrix.test-group.skip_130mb_upload || false }} skip_default_storage: ${{ matrix.test-group.skip_default_storage || false }} skip_metadata: ${{ matrix.test-group.skip_metadata }} From ddb902054af1d4551fcec8cfbc6f9358e20625d4 Mon Sep 17 00:00:00 2001 From: Taku Miyamoto <40813148+miyamoto83@users.noreply.github.com> Date: Mon, 26 Oct 2026 20:35:04 +0900 Subject: [PATCH 6/6] Disable the MFR local-development URL rewrite in the E2E environment so previews fetch files from WaterButler with the browser session --- .github/scripts/setup_rdm.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/scripts/setup_rdm.sh b/.github/scripts/setup_rdm.sh index 8454eff8..250d8405 100644 --- a/.github/scripts/setup_rdm.sh +++ b/.github/scripts/setup_rdm.sh @@ -513,6 +513,17 @@ EOL echo "" >> .docker-compose.wb.env echo "SERVER_CONFIG_DOMAIN=http://192.168.168.167:7777" >> .docker-compose.wb.env + # The RDM-osf.io env file enables the MFR local-development rewrite, which points the + # file URLs embedded in rendered previews (PDF, video, ...) at localhost:7777 and drops + # the mode parameter. The E2E browser is logged in on 192.168.168.167, so those + # requests would reach WaterButler without the session cookie and fail with 401. + sed -i.bak 's/^EXTENSION_CONFIG_LOCAL_DEVELOPMENT=.*/EXTENSION_CONFIG_LOCAL_DEVELOPMENT=0/' .docker-compose.mfr.env + rm -f .docker-compose.mfr.env.bak + if ! grep -q '^EXTENSION_CONFIG_LOCAL_DEVELOPMENT=0$' .docker-compose.mfr.env; then + echo "EXTENSION_CONFIG_LOCAL_DEVELOPMENT could not be disabled in .docker-compose.mfr.env" >&2 + return 1 + fi + if [ -n "$mfr_env_additions" ]; then printf '%s\n' "$mfr_env_additions" >> .docker-compose.mfr.env fi