From 059fe05e14a84e62f6247a14ab7dcc79cc7ec4bb Mon Sep 17 00:00:00 2001 From: Paco Date: Sat, 25 Apr 2026 19:52:13 +0200 Subject: [PATCH] feat: add configurable user creation flow script --- scripts/create_user_drmoralestorres.mjs | 117 ++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 scripts/create_user_drmoralestorres.mjs diff --git a/scripts/create_user_drmoralestorres.mjs b/scripts/create_user_drmoralestorres.mjs new file mode 100644 index 0000000..7013c99 --- /dev/null +++ b/scripts/create_user_drmoralestorres.mjs @@ -0,0 +1,117 @@ +import path from "node:path" +import { BrowserManager } from "../dist/browser/manager.js" + +const browser = new BrowserManager(path.resolve("./artifacts")) +const out = {} + +const sleep = (ms) => new Promise((r) => setTimeout(r, ms)) + +const appBaseUrl = process.env.APP_BASE_URL ?? "https://app.drmoralestorres.com" +const loginEmail = process.env.LOGIN_EMAIL +const loginPassword = process.env.LOGIN_PASSWORD +const newUserName = process.env.NEW_USER_NAME ?? "Nuevo Usuario" +const newUserEmail = process.env.NEW_USER_EMAIL +const newUserPassword = process.env.NEW_USER_PASSWORD +const newUserRoleValue = process.env.NEW_USER_ROLE_VALUE ?? "1" + +if (!loginEmail || !loginPassword || !newUserEmail || !newUserPassword) { + throw new Error( + "Missing required env vars: LOGIN_EMAIL, LOGIN_PASSWORD, NEW_USER_EMAIL, NEW_USER_PASSWORD", + ) +} + +const run = async () => { + out.open = await browser.open({ + headless: false, + width: 1366, + height: 900, + browserKind: "testing", + persistentProfile: true, + userDataDir: "/home/pancho/.chromium-perfil-google", + startUrl: `${appBaseUrl}/usuarios/altas`, + recordVideo: false, + }) + + out.start = await browser.observe().catch((e) => ({ error: e.message })) + const currentUrl = browser.getState().currentUrl || "" + + if (currentUrl.includes("/login")) { + const emailExists = await browser + .query({ selector: "input[type='email'], input[name='email'], #email", mode: "exists" }) + .catch(() => ({ result: false })) + if (emailExists.result === true) { + out.typeUser = await browser.type( + "input[type='email'], input[name='email'], #email", + loginEmail, + true, + 12000, + ) + out.typePass = await browser.type( + "input[type='password'], input[name='password'], #password", + loginPassword, + true, + 12000, + ) + out.submit = await browser.click( + "button[type='submit'], button[name='login'], button#login, input[type='submit']", + 12000, + ) + await browser.waitFor({ for: "timeout", value: "2200" }) + await browser.navigate(`${appBaseUrl}/usuarios/altas`, "domcontentloaded") + } + } + + out.afterLogin = await browser.observe() + + out.formObserve = await browser.observe() + + out.name = await browser.type("#nombre", newUserName, true, 12000) + out.email = await browser.type("#email", newUserEmail, true, 12000) + out.pass = await browser.type("#password", newUserPassword, true, 12000) + + out.role = await browser.select("#rol_id", newUserRoleValue, 12000).catch(async () => { + const role = await browser.evaluate( + `() => { + const s = document.querySelector("#rol_id") + if (!s) return { ok: false } + const opts = Array.from(s.options || []) + const idx = opts.findIndex((o) => + (o.textContent || "").toLowerCase().includes("administrador") || + (o.value || "").toLowerCase().includes("admin") + ) + if (idx < 0) return { ok: false, reason: "admin_option_not_found" } + s.selectedIndex = idx + s.dispatchEvent(new Event("change", { bubbles: true })) + return { ok: true, option: opts[idx].textContent, value: opts[idx].value } + }`, + {}, + ) + return role.result + }) + + out.preSaveSnapshot = await browser.snapshot({ label: "usuarios-alta-before-save", fullPage: true }) + out.saveBtn = await browser.click("button.btn-primary, button[type='submit']", 12000) + + await sleep(2800) + out.afterSave = await browser.observe().catch((e) => ({ error: e.message })) + out.postSaveSnapshot = await browser.snapshot({ label: "usuarios-alta-after-save", fullPage: true }) + out.close = await browser.close() + + console.log(JSON.stringify(out, null, 2)) +} + +run().catch(async (err) => { + console.error("CREATE_USER_ERROR", err instanceof Error ? err.stack ?? err.message : String(err)) + try { + const snap = await browser.snapshot({ label: "usuarios-alta-error", fullPage: true }) + console.error("ERROR_SNAPSHOT", snap.filePath) + } catch { + // ignore + } + try { + await browser.close() + } catch { + // ignore + } + process.exit(1) +})