diff --git a/tests/common/empty.env b/tests/common/empty.env new file mode 100644 index 00000000..99dbd0b0 --- /dev/null +++ b/tests/common/empty.env @@ -0,0 +1,24 @@ +# Intentionally empty config file for test-server startup. +# +# Used as `--config tests/common/empty.env` by the Playwright +# webServer scripts (`tests/e2e/start-server*.sh`). Two properties +# it gives us that a bare `cargo run` doesn't: +# +# 1. Loading an empty file overrides nothing, so every var +# Playwright places in the child process env (SERVER_PORT, +# STORAGE_PATH, RUST_LOG, OPAQUE_MODE, DPOP_MODE, whatever +# per-suite overrides land here) reaches the server intact. +# +# 2. Passing `--config ` in main.rs takes the +# `Some(path)` branch and skips the fallback +# `dotenvy::dotenv()` probe of `$CWD/.env`. Without this a +# developer's local `.env` (typical: +# `OXICLOUD_METRICS_LISTEN=127.0.0.1:9090`) leaks into the +# test server via CWD auto-load and clashes with whatever +# the dev is already running. +# +# Hurl API tests use `tests/common/server.env` for --config +# instead — they source it in shell first, so file-wins doesn't +# matter there. Only Playwright needs the empty-file trick +# because it applies per-suite env overrides that would otherwise +# be clobbered by server.env's shared values. diff --git a/tests/e2e/playwright.coverage.config.ts b/tests/e2e/playwright.coverage.config.ts index 269b4d00..51ea26ab 100644 --- a/tests/e2e/playwright.coverage.config.ts +++ b/tests/e2e/playwright.coverage.config.ts @@ -94,6 +94,13 @@ export default defineConfig({ // so they can sign proofs in-browser. Once landed, this // override goes and Playwright runs production-shape. OXICLOUD_DPOP_MODE: 'opportunistic', + // Explicitly clear OXICLOUD_METRICS_LISTEN so a developer's + // `.env` value (typical: `127.0.0.1:9090`) doesn't leak in via + // the parent-process env Playwright merges here — the test + // server would collide with the developer's own running + // instance on that port and main.rs would hard-fail. Empty + // string is the config-parser's "disabled" sentinel. + OXICLOUD_METRICS_LISTEN: '', }, }, }); diff --git a/tests/e2e/start-server-spa.sh b/tests/e2e/start-server-spa.sh index 15a6b3a7..ba48af4b 100644 --- a/tests/e2e/start-server-spa.sh +++ b/tests/e2e/start-server-spa.sh @@ -36,5 +36,15 @@ mark "spawning test database…" bash "$REPO_ROOT/tests/common/spawn-db.sh" mark "database ready; starting server…" -# Replace the shell with the server process so Playwright's PID tracking works. -exec "$@" +# Point `--config` at an INTENTIONALLY EMPTY file: blocks the +# CWD `.env` fallback in main.rs (so developer envs don't leak +# in) while overriding nothing (so every Playwright-set env var, +# including per-suite DPOP/OPAQUE/plugin overrides, reaches the +# server intact). See tests/common/empty.env and +# tests/e2e/start-server.sh for the full rationale. +CONFIG_PATH="$REPO_ROOT/tests/common/empty.env" +if [[ "${1:-}" == "cargo" ]]; then + exec "$@" -- --config "$CONFIG_PATH" +else + exec "$@" --config "$CONFIG_PATH" +fi diff --git a/tests/e2e/start-server.sh b/tests/e2e/start-server.sh index 638db09d..19904ed4 100755 --- a/tests/e2e/start-server.sh +++ b/tests/e2e/start-server.sh @@ -36,5 +36,30 @@ mark "spawning test database…" bash "$REPO_ROOT/tests/common/spawn-db.sh" mark "database ready; starting server…" -# Replace the shell with the server process so Playwright's PID tracking works. -exec "$@" +# Point `--config` at an INTENTIONALLY EMPTY file. Two reasons: +# +# 1. Blocks the fallback `dotenvy::dotenv()` probe of `$CWD/.env` +# in main.rs — otherwise a developer's local `.env` +# (typical: `OXICLOUD_METRICS_LISTEN=127.0.0.1:9090`) leaks +# into the test server via CWD auto-load and clashes with +# anything the dev is already running. +# +# 2. An empty file has nothing to override — so every var +# Playwright loaded into `webServer.env` from server.env AND +# every per-suite override on top (SERVER_PORT, STORAGE_PATH, +# RUST_LOG, OPAQUE_MODE, DPOP_MODE, …) reaches the server +# intact. We can't use `--config server.env` here because +# `dotenvy::from_filename_override` would clobber Playwright's +# per-suite overrides for the keys it shares with the file. +# +# See tests/common/empty.env for the header explaining this. +CONFIG_PATH="$REPO_ROOT/tests/common/empty.env" + +# `cargo run` needs `--` to separate cargo's own flags from the +# binary's — a direct-binary invocation takes them raw. First arg +# tells us which we're in. +if [[ "${1:-}" == "cargo" ]]; then + exec "$@" -- --config "$CONFIG_PATH" +else + exec "$@" --config "$CONFIG_PATH" +fi