Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline (Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/* packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
208 lines
7.1 KiB
TypeScript
208 lines
7.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { loadEnv } from "./env.js";
|
|
|
|
const base = {
|
|
DATABASE_URL: "postgres://rakazo:rakazo@127.0.0.1:5433/rakazo",
|
|
NODE_ENV: "test",
|
|
};
|
|
|
|
describe("loadEnv", () => {
|
|
it("defaults the product path to Pi, Docker, and Graphile Worker", () => {
|
|
const env = loadEnv(base);
|
|
expect(env.agentRuntime).toBe("pi");
|
|
expect(env.sandboxProvider).toBe("docker");
|
|
expect(env.wakeupDriver).toBe("graphile");
|
|
expect(env.apiHost).toBe("127.0.0.1");
|
|
expect(env.nodeEnv).toBe("test");
|
|
});
|
|
|
|
it("defaults Pi JSONL session recording to off", () => {
|
|
expect(loadEnv(base).piSessionRecording).toBe(false);
|
|
expect(loadEnv({ ...base, PI_SESSION_RECORDING: "false" }).piSessionRecording).toBe(false);
|
|
expect(loadEnv({ ...base, PI_SESSION_RECORDING: "1" }).piSessionRecording).toBe(false);
|
|
expect(loadEnv({ ...base, PI_SESSION_RECORDING: "true" }).piSessionRecording).toBe(true);
|
|
});
|
|
|
|
it("keeps explicit emulator settings for pnpm test", () => {
|
|
const env = loadEnv({
|
|
...base,
|
|
AGENT_RUNTIME: "scripted",
|
|
SANDBOX_PROVIDER: "fake",
|
|
WAKEUP_DRIVER: "memory",
|
|
});
|
|
expect(env.agentRuntime).toBe("scripted");
|
|
expect(env.sandboxProvider).toBe("fake");
|
|
expect(env.wakeupDriver).toBe("memory");
|
|
});
|
|
|
|
it("loads an optional integrations catalog mirror", () => {
|
|
expect(loadEnv(base).integrationsCatalogUrl).toBeUndefined();
|
|
expect(
|
|
loadEnv({ ...base, INTEGRATIONS_CATALOG_URL: " https://catalog.example.test/feed " })
|
|
.integrationsCatalogUrl,
|
|
).toBe("https://catalog.example.test/feed");
|
|
});
|
|
|
|
it("falls back to none when a remote provider key is missing", () => {
|
|
expect(
|
|
loadEnv({
|
|
...base,
|
|
SANDBOX_PROVIDER: "e2b",
|
|
}).sandboxProvider,
|
|
).toBe("none");
|
|
expect(
|
|
loadEnv({
|
|
...base,
|
|
SANDBOX_PROVIDER: "none",
|
|
}).sandboxProvider,
|
|
).toBe("none");
|
|
expect(
|
|
loadEnv({
|
|
...base,
|
|
SANDBOX_PROVIDER: "",
|
|
}).sandboxProvider,
|
|
).toBe("none");
|
|
});
|
|
|
|
it("loads provider-specific Daytona configuration", () => {
|
|
const env = loadEnv({
|
|
...base,
|
|
SANDBOX_PROVIDER: "daytona",
|
|
DAYTONA_API_KEY: "test-daytona-key",
|
|
DAYTONA_API_URL: "https://daytona.test/api",
|
|
DAYTONA_TARGET: "test-target",
|
|
});
|
|
expect(env).toMatchObject({
|
|
sandboxProvider: "daytona",
|
|
daytonaApiKey: "test-daytona-key",
|
|
daytonaApiUrl: "https://daytona.test/api",
|
|
daytonaTarget: "test-target",
|
|
});
|
|
});
|
|
|
|
it("loads provider-specific Box configuration", () => {
|
|
const env = loadEnv({
|
|
...base,
|
|
SANDBOX_PROVIDER: "box",
|
|
BOX_API_KEY: "test-box-key",
|
|
BOX_API_URL: "https://box.test/api/v1",
|
|
});
|
|
expect(env).toMatchObject({
|
|
sandboxProvider: "box",
|
|
boxApiKey: "test-box-key",
|
|
boxApiUrl: "https://box.test/api/v1",
|
|
});
|
|
});
|
|
|
|
it("throws when production omits secrets", () => {
|
|
expect(() =>
|
|
loadEnv({
|
|
DATABASE_URL: base.DATABASE_URL,
|
|
NODE_ENV: "production",
|
|
}),
|
|
).toThrow(/BETTER_AUTH_SECRET/);
|
|
});
|
|
|
|
it("throws when production uses placeholder secrets", () => {
|
|
expect(() =>
|
|
loadEnv({
|
|
DATABASE_URL: base.DATABASE_URL,
|
|
NODE_ENV: "production",
|
|
BETTER_AUTH_SECRET: "dev-secret-change-me-please-32chars",
|
|
ENCRYPTION_KEY: "real-encryption-key-value",
|
|
SANDBOX_SUPERVISOR_TOKEN: "real-supervisor-token-with-enough-length",
|
|
SCREEN_PROXY_SECRET: "real-screen-proxy-secret-with-enough-length",
|
|
}),
|
|
).toThrow(/BETTER_AUTH_SECRET/);
|
|
});
|
|
|
|
it("loads real secrets in production", () => {
|
|
const env = loadEnv({
|
|
DATABASE_URL: base.DATABASE_URL,
|
|
NODE_ENV: "production",
|
|
BETTER_AUTH_SECRET: "prod-auth-secret-with-enough-length",
|
|
ENCRYPTION_KEY: "prod-encryption-key-with-enough-length",
|
|
SCREEN_PROXY_SECRET: "prod-screen-proxy-secret-with-enough-length",
|
|
SANDBOX_PROVIDER: "e2b",
|
|
API_HOST: "0.0.0.0",
|
|
});
|
|
expect(env.authSecret).toBe("prod-auth-secret-with-enough-length");
|
|
expect(env.encryptionKey).toBe("prod-encryption-key-with-enough-length");
|
|
expect(env.sandboxSupervisorToken).toBeUndefined();
|
|
expect(env.screenProxySecret).toBe("prod-screen-proxy-secret-with-enough-length");
|
|
expect(env.apiHost).toBe("0.0.0.0");
|
|
});
|
|
|
|
it("falls back to none in production when Docker has no supervisor token", () => {
|
|
const env = loadEnv({
|
|
DATABASE_URL: base.DATABASE_URL,
|
|
NODE_ENV: "production",
|
|
BETTER_AUTH_SECRET: "prod-auth-secret-with-enough-length",
|
|
ENCRYPTION_KEY: "prod-encryption-key-with-enough-length",
|
|
SCREEN_PROXY_SECRET: "prod-screen-proxy-secret-with-enough-length",
|
|
SANDBOX_PROVIDER: "docker",
|
|
});
|
|
expect(env.sandboxProvider).toBe("none");
|
|
expect(env.sandboxSupervisorToken).toBeUndefined();
|
|
});
|
|
|
|
it("requires a dedicated supervisor token when Docker stays selected", () => {
|
|
expect(() =>
|
|
loadEnv({
|
|
DATABASE_URL: base.DATABASE_URL,
|
|
NODE_ENV: "production",
|
|
BETTER_AUTH_SECRET: "prod-auth-secret-with-enough-length",
|
|
ENCRYPTION_KEY: "prod-encryption-key-with-enough-length",
|
|
SCREEN_PROXY_SECRET: "prod-screen-proxy-secret-with-enough-length",
|
|
SANDBOX_PROVIDER: "docker",
|
|
SANDBOX_SUPERVISOR_TOKEN: "too-short",
|
|
}),
|
|
).toThrow(/SANDBOX_SUPERVISOR_TOKEN/);
|
|
});
|
|
|
|
it("exposes a deployed git revision when GIT_SHA is set", () => {
|
|
expect(loadEnv(base).gitSha).toBeUndefined();
|
|
expect(loadEnv({ ...base, GIT_SHA: " 3c6e209 " }).gitSha).toBe("3c6e209");
|
|
expect(loadEnv({ ...base, RAKAZO_GIT_SHA: "abc1234" }).gitSha).toBe("abc1234");
|
|
});
|
|
|
|
it("loads optional updater sidecar wiring without requiring the token at boot", () => {
|
|
expect(loadEnv(base).updaterUrl).toBeUndefined();
|
|
expect(loadEnv(base).updaterToken).toBeUndefined();
|
|
const env = loadEnv({
|
|
...base,
|
|
RAKAZO_UPDATER_URL: " http://updater:7092 ",
|
|
RAKAZO_UPDATER_TOKEN: " fake-review-updater-token-000000000000 ",
|
|
});
|
|
expect(env.updaterUrl).toBe("http://updater:7092");
|
|
expect(env.updaterToken).toBe("fake-review-updater-token-000000000000");
|
|
});
|
|
|
|
it("loads SMTP configuration and keeps the email emulator out of production", () => {
|
|
expect(
|
|
loadEnv({
|
|
...base,
|
|
SMTP_URL: " smtps://user:secret@smtp.example.test:465 ",
|
|
EMAIL_FROM: " Rakazo <no-reply@example.test> ",
|
|
EMAIL_EMULATOR: "true",
|
|
}),
|
|
).toMatchObject({
|
|
smtpUrl: "smtps://user:secret@smtp.example.test:465",
|
|
emailFrom: "Rakazo <no-reply@example.test>",
|
|
emailEmulator: true,
|
|
});
|
|
expect(
|
|
loadEnv({
|
|
...base,
|
|
NODE_ENV: "production",
|
|
BETTER_AUTH_SECRET: "prod-auth-secret-with-enough-length",
|
|
ENCRYPTION_KEY: "prod-encryption-key-with-enough-length",
|
|
SCREEN_PROXY_SECRET: "prod-screen-proxy-secret-with-enough-length",
|
|
SANDBOX_PROVIDER: "none",
|
|
EMAIL_EMULATOR: "true",
|
|
}).emailEmulator,
|
|
).toBe(false);
|
|
expect(loadEnv({ ...base, NODE_ENV: "development" }).nodeEnv).toBe("development");
|
|
});
|
|
});
|