feat: add configurable user creation flow script
This commit is contained in:
parent
8a087240b9
commit
059fe05e14
1 changed files with 117 additions and 0 deletions
117
scripts/create_user_drmoralestorres.mjs
Normal file
117
scripts/create_user_drmoralestorres.mjs
Normal file
|
|
@ -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)
|
||||||
|
})
|
||||||
Loading…
Add table
Reference in a new issue