oxedyne/daimond/dev/shot_adminrail.mjs
2.6 KiB, 1 run
created by r2519314175:135, which is this file's identity for as long as the history lasts, whatever it is later renamed to
download · who wrote it · its history
| 1 | // shot_adminrail.mjs — the rail's split into a pinned Status strip and an |
| 2 | // on-demand Admin drawer. Drives: rest → cog opens Admin (menu) → close → |
| 3 | // Models status row opens Admin (Models) → Esc closes. |
| 4 | import { open, shot } from './harness.mjs'; |
| 5 | |
| 6 | const s = await open({ name: 'adminrail-shot', signIn: true, connect: true }); |
| 7 | const { page } = s; |
| 8 | const pause = (ms) => page.waitForTimeout(ms); |
| 9 | const openState = () => page.$eval('#admin', el => el.classList.contains('admin-open')); |
| 10 | |
| 11 | await pause(400); |
| 12 | const r0 = await openState(); |
| 13 | await shot(s, 'adminrail-rest'); // drawer closed, Status strip only |
| 14 | |
| 15 | // The cog opens the Admin drawer on its menu. |
| 16 | await page.click('#settings-btn', { force: true }); |
| 17 | await pause(350); |
| 18 | const r1 = await openState(); |
| 19 | const title1 = await page.$eval('#admin-drawer-title', el => el.textContent); |
| 20 | await shot(s, 'adminrail-cog-open'); |
| 21 | |
| 22 | // Close it with the drawer's ×. |
| 23 | await page.click('#admin-close', { force: true }); |
| 24 | await pause(350); |
| 25 | const r2 = await openState(); |
| 26 | |
| 27 | // A Status row (Models) opens the drawer straight to that section. |
| 28 | await page.click('#astat-model', { force: true }); |
| 29 | await pause(400); |
| 30 | const r3 = await openState(); |
| 31 | const title3 = await page.$eval('#admin-drawer-title', el => el.textContent); |
| 32 | const modelsShown = await page.$eval('#admin-models', el => el.style.display !== 'none'); |
| 33 | await shot(s, 'adminrail-models-open'); |
| 34 | |
| 35 | // Esc closes it. |
| 36 | await page.keyboard.press('Escape'); |
| 37 | await pause(350); |
| 38 | const r4 = await openState(); |
| 39 | |
| 40 | // A click outside the rail also closes it (open, then click the stage). |
| 41 | await page.click('#settings-btn', { force: true }); |
| 42 | await pause(300); |
| 43 | const r5open = await openState(); |
| 44 | await page.mouse.click(760, 400); // somewhere on the stage |
| 45 | await pause(300); |
| 46 | const r6 = await openState(); |
| 47 | |
| 48 | console.log(JSON.stringify({ |
| 49 | rest_closed: r0 === false, |
| 50 | cog_opens: r1 === true, |
| 51 | cog_title_admin: title1.trim() === 'Admin', |
| 52 | x_closes: r2 === false, |
| 53 | models_row_opens: r3 === true && modelsShown, |
| 54 | models_title: title3.trim() === 'Models', |
| 55 | esc_closes: r4 === false, |
| 56 | clickaway_opens: r5open === true, |
| 57 | clickaway_closes: r6 === false, |
| 58 | }, null, 2)); |
| 59 | |
| 60 | const realErrs = s.errs.filter(e => !/502|Bad Gateway|\/api\b/.test(e)); |
| 61 | const ok = r0 === false && r1 === true && title1.trim() === 'Admin' && r2 === false |
| 62 | && r3 === true && modelsShown && title3.trim() === 'Models' && r4 === false |
| 63 | && r5open === true && r6 === false && realErrs.length === 0; |
| 64 | console.log(ok ? '\n✅ PASS' : '\n❌ FAIL'); |
| 65 | if (realErrs.length) console.log('ERRORS:', realErrs); |
| 66 | await s.close(); |
| 67 | process.exit(ok ? 0 : 1); |