100 lines
2.8 KiB
TypeScript
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");
|
|
});
|
|
});
|