From def1e1b9fc790dddc99d6ff8c007df53cb5101b0 Mon Sep 17 00:00:00 2001 From: ypshim Date: Wed, 21 Oct 2026 18:17:27 +0900 Subject: [PATCH] test(ui): verify the template download button saves the file in Chrome MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/verify-template-download.cjs clicks 입력 템플릿 다운로드 and reports the saved file - result: 교각입력템플릿.xlsx (19,391 bytes), sheets 교각 · IP · 받침 - verify/template-download-2026-10-21.xlsx keeps the saved copy as evidence Co-Authored-By: Claude Haiku 5.5 --- scripts/verify-template-download.cjs | 43 +++++++++++++++++++++++ verify/template-download-2026-10-21.xlsx | Bin 0 -> 19391 bytes 2 files changed, 43 insertions(+) create mode 100644 scripts/verify-template-download.cjs create mode 100755 verify/template-download-2026-10-21.xlsx diff --git a/scripts/verify-template-download.cjs b/scripts/verify-template-download.cjs new file mode 100644 index 0000000..64cca01 --- /dev/null +++ b/scripts/verify-template-download.cjs @@ -0,0 +1,43 @@ +// Clicks the template download button in the import dialog through Chrome DevTools +// and reports the saved file. Run with Windows Node (same machine as Chrome): +// node verify-template-download.cjs "C:\\Users\\...\\Temp\\verify-downloads" +const fs = require('fs'); +const path = require('path'); +const DL_DIR = process.argv[2]; +const CDP = 'http://127.0.0.1:9444'; +const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); + +async function main() { + fs.mkdirSync(DL_DIR, { recursive: true }); + const page = (await (await fetch(`${CDP}/json`)).json()).find((t) => t.type === 'page'); + const ws = new WebSocket(page.webSocketDebuggerUrl); + await new Promise((res, rej) => { ws.onopen = res; ws.onerror = rej; }); + let seq = 0; + const waiting = new Map(); + ws.onmessage = (ev) => { + const m = JSON.parse(ev.data); + if (m.id && waiting.has(m.id)) { waiting.get(m.id)(m); waiting.delete(m.id); } + }; + const send = (method, params = {}) => new Promise((res) => { + const id = ++seq; waiting.set(id, res); ws.send(JSON.stringify({ id, method, params })); + }); + const evalJs = async (expression) => { + const r = await send('Runtime.evaluate', { expression, awaitPromise: true, returnByValue: true }); + if (r.result.exceptionDetails) throw new Error(JSON.stringify(r.result.exceptionDetails).slice(0, 300)); + return r.result.result.value; + }; + await send('Page.enable'); + await send('Runtime.enable'); + await send('Browser.setDownloadBehavior', { behavior: 'allow', downloadPath: DL_DIR, eventsEnabled: false }); + await send('Page.navigate', { url: 'http://127.0.0.1:5173/' }); + await sleep(4000); + await evalJs(`document.getElementById('open-import').click()`); + await sleep(500); + await evalJs(`document.getElementById('download-template').click()`); + await sleep(4000); + const files = fs.readdirSync(DL_DIR); + console.log('DOWNLOADED', JSON.stringify(files)); + for (const f of files) console.log('SIZE', f, fs.statSync(path.join(DL_DIR, f)).size); + ws.close(); +} +main().catch((e) => { console.error('FAILED', e); process.exit(1); }); diff --git a/verify/template-download-2026-10-21.xlsx b/verify/template-download-2026-10-21.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..4da98421984f3503d59433f87646998c0379a795 GIT binary patch literal 19391 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 J-#>{@zXj2$@}~d* literal 0 HcmV?d00001