mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-07-14 16:36:07 +00:00
85 lines
2.7 KiB
JavaScript
Executable File
85 lines
2.7 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
import { env } from "node:process";
|
|
import {
|
|
bodyText,
|
|
createBrowser,
|
|
ensureEvidence,
|
|
evidencePaths,
|
|
loadEnvFiles,
|
|
resetAndAuthLocalUser,
|
|
safeScreenshot,
|
|
setBrowserToken,
|
|
verifyBrowserToken,
|
|
writeResult,
|
|
} from "./lib/langbot-e2e.mjs";
|
|
|
|
const caseId = "refresh-local-login";
|
|
const paths = evidencePaths(caseId);
|
|
await loadEnvFiles();
|
|
await ensureEvidence(paths);
|
|
|
|
const result = {
|
|
source: "automation",
|
|
case_id: caseId,
|
|
status: "fail",
|
|
reason: "",
|
|
user: env.LANGBOT_E2E_LOGIN_USER || "",
|
|
frontend_url: env.LANGBOT_FRONTEND_URL || "",
|
|
backend_url: env.LANGBOT_BACKEND_URL || "",
|
|
backend_token_check: null,
|
|
browser_token_check: null,
|
|
evidence: {
|
|
console_log: paths.consoleLog,
|
|
network_log: paths.networkLog,
|
|
screenshot: paths.screenshot,
|
|
automation_result_json: paths.automationResultJson,
|
|
result_json: paths.resultJson,
|
|
},
|
|
evidence_collected: ["ui", "screenshot", "console", "api_diagnostic"],
|
|
};
|
|
|
|
let browser;
|
|
|
|
try {
|
|
const backendUrl = env.LANGBOT_BACKEND_URL;
|
|
const frontendUrl = env.LANGBOT_FRONTEND_URL;
|
|
const user = env.LANGBOT_E2E_LOGIN_USER;
|
|
const password = env.LANGBOT_E2E_LOGIN_PASSWORD || "LangBotE2ELocalPass!2026";
|
|
if (!backendUrl) throw new Error("LANGBOT_BACKEND_URL is not configured.");
|
|
if (!frontendUrl) throw new Error("LANGBOT_FRONTEND_URL is not configured.");
|
|
if (!user) throw new Error("LANGBOT_E2E_LOGIN_USER is required.");
|
|
|
|
const auth = await resetAndAuthLocalUser({ backendUrl, user, password });
|
|
result.backend_token_check = auth.check;
|
|
|
|
browser = await createBrowser(paths);
|
|
const { page } = browser;
|
|
await setBrowserToken(page, frontendUrl, auth.token);
|
|
const browserCheck = await verifyBrowserToken(page, backendUrl);
|
|
result.browser_token_check = browserCheck;
|
|
if (!browserCheck.authenticated) {
|
|
throw new Error(browserCheck.reason || "Browser token check failed.");
|
|
}
|
|
|
|
await page.goto(`${frontendUrl.replace(/\/$/, "")}/home/monitoring`, { waitUntil: "domcontentloaded" });
|
|
await page.waitForLoadState("networkidle", { timeout: 10_000 }).catch(() => {});
|
|
const text = await bodyText(page);
|
|
if (!text.includes("Dashboard") && !text.includes("Pipelines") && !text.includes("流水线")) {
|
|
throw new Error("Token was written, but authenticated navigation was not visible.");
|
|
}
|
|
|
|
result.status = "pass";
|
|
result.reason = "Browser profile localStorage token refreshed.";
|
|
} catch (error) {
|
|
result.status = "fail";
|
|
result.reason = error.message;
|
|
} finally {
|
|
if (browser?.page) await safeScreenshot(browser.page, paths.screenshot);
|
|
if (browser) await browser.close().catch(() => {});
|
|
await writeResult(paths, result);
|
|
console.log(JSON.stringify(result, null, 2));
|
|
}
|
|
|
|
process.exit(result.status === "pass" ? 0 : 1);
|