Migrate env variables to Cloudron
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
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");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user