Files
aliasvault/apps/browser-extension/scripts/run-e2e.mjs
2026-06-14 15:13:41 +02:00

90 lines
2.7 KiB
JavaScript
Executable File

#!/usr/bin/env node
// Build the Chrome extension for E2E testing and run the Playwright suite
// against it.
//
// Resolves the local dev API URL from `dev.env` (or ALIASVAULT_API_URL / the
// default) and exposes it to Playwright as ALIASVAULT_API_URL. The fixtures use
// it to point the extension at that API instance at runtime and to create the
// test user, so everything targets the same API.
//
// Usage:
// node scripts/run-e2e.mjs [extra playwright args]
import { spawnSync } from "node:child_process";
import { readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import path from "node:path";
import { argv, env, exit, platform } from "node:process";
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
const extensionDir = path.resolve(scriptDir, "..");
const repoRoot = path.resolve(extensionDir, "..", "..");
const devEnvPath = path.join(repoRoot, "dev.env");
// Default port layout, kept in sync with scripts/dev.sh.
const DEFAULT_BASE_PORT = 5100;
const DEFAULT_PORT_STRIDE = 10;
/**
* Resolve the API URL the test extension should default to.
* @returns {string}
*/
function resolveApiUrl() {
if (env.ALIASVAULT_API_URL) {
return env.ALIASVAULT_API_URL;
}
try {
const devEnv = {};
for (const line of readFileSync(devEnvPath, "utf8").split("\n")) {
const match = line.match(/^\s*([A-Z_]+)\s*=\s*(.*?)\s*$/);
if (match) {
devEnv[match[1]] = match[2];
}
}
const base = Number(devEnv.AV_BASE_PORT ?? DEFAULT_BASE_PORT);
const stride = Number(devEnv.AV_PORT_STRIDE ?? DEFAULT_PORT_STRIDE);
const instance = Number(devEnv.AV_INSTANCE ?? 0);
if ([base, stride, instance].every(Number.isInteger)) {
return `http://localhost:${base + instance * stride}`;
}
} catch {
// No readable dev.env — fall through to the default below.
}
return `http://localhost:${DEFAULT_BASE_PORT}`;
}
const apiUrl = resolveApiUrl();
console.log(`[e2e] Using API URL: ${apiUrl}`);
// Expose the URL to the Playwright fixtures (global setup + per-test setup),
// which configure the extension to talk to this API instance and create the
// test user against it.
const childEnv = {
...env,
ALIASVAULT_API_URL: apiUrl,
};
/**
* Run a command with inherited stdio, exiting on failure.
* @param {string} command
* @param {string[]} commandArgs
*/
function run(command, commandArgs) {
const result = spawnSync(command, commandArgs, {
cwd: extensionDir,
env: childEnv,
stdio: "inherit",
shell: platform === "win32",
});
if (result.status !== 0) {
exit(result.status ?? 1);
}
}
run("npm", ["run", "build:chrome"]);
run("npx", ["playwright", "test", ...argv.slice(2)]);