mirror of
https://github.com/aliasvault/aliasvault.git
synced 2026-07-31 09:17:11 -04:00
90 lines
2.7 KiB
JavaScript
Executable File
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)]);
|