LibreChat/e2e
Danny Avila 4952281b22 test: opt-in e2e for uploads reaching the stateful code sandbox
Covers the one leg the credential-free mock suite cannot fake: a file
attached through the UI's Code Environment target must land in the live
Code API, get delivered into the sandbox, and stay readable across turns.

- fake-model: E2E_EXEC_UPLOADED:/E2E_EXEC_PERSIST: markers emit real
  bash_tool calls through the production tool pipeline (the sandbox
  surface stateful agents register; execute_code stays host-wired and
  never appears in the tool registry), plus an env-gated dump of each
  run's advertised tools for future spec authoring
- spec: attach uploads a CSV to the Code API, turn 1 reads it back from
  /mnt/data and drops a proof file no upload contained, turn 2 (sent
  without an attachment) reads both — only possible when the run reuses
  the same stateful runtime session
- e2e config: agents capabilities gain stateful_code_sessions, and the
  mock profile pins CHECK_BALANCE=false so a developer's local .env can
  never fail every send with zero-balance users
- skips unless LIBRECHAT_CODE_BASEURL is provided (kept out of CI)
2026-07-21 10:03:45 -04:00
..
config test: opt-in e2e for uploads reaching the stateful code sandbox 2026-07-21 10:03:45 -04:00
fixtures/deployment-skills/e2e-deployment-skill 🗂️ feat: Add Deployment Skill Directory (#13523) 2026-06-05 10:24:28 -04:00
recordings 🎭 feat: Add Credential-Free Playwright Smoke Suite with a Local Mock LLM (#13472) 2026-06-02 16:36:39 -04:00
setup test: opt-in e2e for uploads reaching the stateful code sandbox 2026-07-21 10:03:45 -04:00
specs test: opt-in e2e for uploads reaching the stateful code sandbox 2026-07-21 10:03:45 -04:00
config.local.example.ts
jestSetup.js v0.8.7 (#13907) 2026-06-24 14:49:32 -04:00
playwright.config.a11y.ts ⚖️ feat: Add Violation Scores (#8304) 2025-07-07 17:08:40 -04:00
playwright.config.local.ts 🛟 test: Restore Playwright Smoke E2E (#13020) 2026-05-14 09:49:26 -04:00
playwright.config.mock.ts test: opt-in e2e for uploads reaching the stateful code sandbox 2026-07-21 10:03:45 -04:00
playwright.config.real.ts 📊 feat: Real-Time Context Window & Token Usage Tracking (#13670) 2026-06-13 19:38:28 -04:00
playwright.config.ts 🎭 feat: Add Credential-Free Playwright Smoke Suite with a Local Mock LLM (#13472) 2026-06-02 16:36:39 -04:00
README.md 🎭 test: Run Mock E2E Suite Through createRun With In-Process Fake Model (#13508) 2026-06-04 08:33:28 -04:00
types.ts

LibreChat e2e

The mock e2e profile is the safest default for generated tests. It starts LibreChat with e2e/config/librechat.e2e.yaml, injects an in-process fake LLM (via LIBRECHAT_TEST_RUN_HOOK), creates an authenticated e2e user, and avoids real provider credentials.

Recording Tests

Use Playwright codegen when you want to turn an exploratory browser session into a draft test:

npm run e2e:record

That command builds the app, starts the LibreChat test server (with an in-process fake LLM) when needed, writes e2e/storageState.json, and opens Playwright codegen at /c/new. The npm script uses http://localhost:3333 so it does not collide with a normal dev server on 3080. Raw recordings are written to e2e/recordings/ and ignored by git.

For a real local LibreChat config instead of the mock profile:

npm run e2e:record:local

Useful direct options:

node e2e/setup/record.js --url=http://localhost:3080/c/new
node e2e/setup/record.js --profile=local --no-output
node e2e/setup/record.js --auth-only
node e2e/setup/record.js --output=e2e/recordings/settings-draft.spec.ts

LLM-Assisted Loop

  1. Start npm run e2e:record.
  2. Let the LLM use Computer Use to operate the headed Playwright browser.
  3. Stop codegen after the workflow is captured.
  4. Move the useful parts from e2e/recordings/ into a committed spec under e2e/specs/mock/.
  5. Replace brittle generated selectors with role, label, text, or data-testid locators.
  6. Add assertions that prove the behavior, not just the clicked path.
  7. Run the finished spec with npm run e2e:mock -- <spec name>.

Generated recordings are a draft, not the final test. The committed version should use the shared helpers in e2e/specs/mock/helpers.ts where possible, wait on network or visible UI state instead of fixed sleeps, and keep test data deterministic.