Files
community-rule/tests/unit/env.test.ts
T
2026-05-22 15:50:33 -06:00

100 lines
2.8 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it } from "vitest";
import {
getDatabaseUrl,
getSmtpUrl,
isDatabaseConfigured,
} from "../../lib/server/env";
const ENV_KEYS = [
"CLOUDRON_POSTGRESQL_URL",
"CLOUDRON_MAIL_SMTP_SERVER",
"CLOUDRON_MAIL_SMTP_PORT",
"CLOUDRON_MAIL_SMTP_USERNAME",
"CLOUDRON_MAIL_SMTP_PASSWORD",
] as const;
const ORIGINAL_ENV = Object.fromEntries(
ENV_KEYS.map((key) => [key, process.env[key]]),
) as Record<(typeof ENV_KEYS)[number], string | undefined>;
function clearEnv(): void {
for (const key of ENV_KEYS) {
delete process.env[key];
}
}
function restoreEnv(): void {
for (const key of ENV_KEYS) {
const originalValue = ORIGINAL_ENV[key];
if (originalValue === undefined) {
delete process.env[key];
continue;
}
process.env[key] = originalValue;
}
}
beforeEach(() => {
clearEnv();
});
afterEach(() => {
restoreEnv();
});
describe("getDatabaseUrl / isDatabaseConfigured", () => {
it("returns the URL when CLOUDRON_POSTGRESQL_URL is set", () => {
process.env.CLOUDRON_POSTGRESQL_URL =
"postgresql://user:pass@localhost:5432/db";
expect(getDatabaseUrl()).toBe(
"postgresql://user:pass@localhost:5432/db",
);
expect(isDatabaseConfigured()).toBe(true);
});
it("returns undefined when unset", () => {
expect(getDatabaseUrl()).toBeUndefined();
expect(isDatabaseConfigured()).toBe(false);
});
it("treats whitespace-only as unset", () => {
process.env.CLOUDRON_POSTGRESQL_URL = " ";
expect(getDatabaseUrl()).toBeUndefined();
expect(isDatabaseConfigured()).toBe(false);
});
});
describe("getSmtpUrl", () => {
it("returns undefined when server or port is missing", () => {
process.env.CLOUDRON_MAIL_SMTP_SERVER = "localhost";
expect(getSmtpUrl()).toBeUndefined();
clearEnv();
process.env.CLOUDRON_MAIL_SMTP_PORT = "1025";
expect(getSmtpUrl()).toBeUndefined();
});
it("builds a no-auth URL for Mailhog-style local SMTP", () => {
process.env.CLOUDRON_MAIL_SMTP_SERVER = "localhost";
process.env.CLOUDRON_MAIL_SMTP_PORT = "1025";
expect(getSmtpUrl()).toBe("smtp://localhost:1025");
});
it("builds an authenticated URL with encoded credentials", () => {
process.env.CLOUDRON_MAIL_SMTP_SERVER = "smtp.example.com";
process.env.CLOUDRON_MAIL_SMTP_PORT = "587";
process.env.CLOUDRON_MAIL_SMTP_USERNAME = "user@domain";
process.env.CLOUDRON_MAIL_SMTP_PASSWORD = "p@ss:word";
expect(getSmtpUrl()).toBe(
"smtp://user%40domain:p%40ss%3Aword@smtp.example.com:587",
);
});
it("includes auth when only username is set", () => {
process.env.CLOUDRON_MAIL_SMTP_SERVER = "smtp.example.com";
process.env.CLOUDRON_MAIL_SMTP_PORT = "25";
process.env.CLOUDRON_MAIL_SMTP_USERNAME = "apikey";
expect(getSmtpUrl()).toBe("smtp://apikey:@smtp.example.com:25");
});
});