config.test.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import assert from "node:assert/strict";
  2. import test from "node:test";
  3. import { DEFAULT_APP_SERVER_URL, loadConfig } from "../src/config.js";
  4. test("configuration defaults to the localhost App Server", () => {
  5. assert.equal(loadConfig({}).url, DEFAULT_APP_SERVER_URL);
  6. assert.equal(loadConfig({}).authorizationHeader, null);
  7. });
  8. test("configuration accepts secure remote endpoints and token indirection", () => {
  9. const secret = "do-not-print-this-token";
  10. const config = loadConfig({
  11. CODEX_APP_SERVER_URL: "wss://codex.example.test:4500",
  12. CODEX_APP_SERVER_TOKEN_ENV: "PRIVATE_CODEX_TOKEN",
  13. PRIVATE_CODEX_TOKEN: secret,
  14. });
  15. assert.equal(config.authorizationHeader, `Bearer ${secret}`);
  16. assert.equal(config.tokenEnvironmentVariable, "PRIVATE_CODEX_TOKEN");
  17. assert.equal(JSON.stringify({ url: config.url, tokenEnvironmentVariable: config.tokenEnvironmentVariable }).includes(secret), false);
  18. });
  19. test("configuration rejects malformed and insecure endpoints", () => {
  20. for (const value of ["not a url", "https://localhost:4500", "ws://remote.example.test:4500", "ws://user:pass@localhost:4500"]) {
  21. assert.throws(() => loadConfig({ CODEX_APP_SERVER_URL: value }), /WebSocket|ws:\/\/|credentials/);
  22. }
  23. });
  24. test("configuration errors never include token values", () => {
  25. const secret = "super-secret-value";
  26. let message = "";
  27. try {
  28. loadConfig({
  29. CODEX_APP_SERVER_URL: "invalid",
  30. CODEX_APP_SERVER_TOKEN_ENV: "TOKEN",
  31. TOKEN: secret,
  32. });
  33. } catch (error) {
  34. message = error instanceof Error ? error.message : String(error);
  35. }
  36. assert.equal(message.includes(secret), false);
  37. assert.throws(
  38. () => loadConfig({ CODEX_APP_SERVER_TOKEN_ENV: "MISSING_TOKEN" }),
  39. /MISSING_TOKEN/,
  40. );
  41. });