|
@@ -1,4 +1,3 @@
|
|
|
-// lib/config/validateEnv.test.js
|
|
|
|
|
import { describe, it, expect } from "vitest";
|
|
import { describe, it, expect } from "vitest";
|
|
|
import { validateEnv, MIN_SESSION_SECRET_LENGTH } from "./validateEnv.js";
|
|
import { validateEnv, MIN_SESSION_SECRET_LENGTH } from "./validateEnv.js";
|
|
|
|
|
|
|
@@ -20,6 +19,7 @@ describe("validateEnv", () => {
|
|
|
expect(cfg.nasRootPath).toBe("/mnt/niederlassungen");
|
|
expect(cfg.nasRootPath).toBe("/mnt/niederlassungen");
|
|
|
expect(cfg.nodeEnv).toBe("development");
|
|
expect(cfg.nodeEnv).toBe("development");
|
|
|
expect(cfg.port).toBe(3000);
|
|
expect(cfg.port).toBe(3000);
|
|
|
|
|
+ expect(cfg.searchProvider).toBe("fs");
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it("accepts optional SESSION_COOKIE_SECURE=false", () => {
|
|
it("accepts optional SESSION_COOKIE_SECURE=false", () => {
|
|
@@ -34,115 +34,44 @@ describe("validateEnv", () => {
|
|
|
).not.toThrow();
|
|
).not.toThrow();
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- it("rejects invalid SESSION_COOKIE_SECURE values", () => {
|
|
|
|
|
|
|
+ it("rejects invalid SEARCH_PROVIDER values", () => {
|
|
|
expect(() =>
|
|
expect(() =>
|
|
|
validateEnv({
|
|
validateEnv({
|
|
|
MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
|
SESSION_SECRET: validSecret(),
|
|
SESSION_SECRET: validSecret(),
|
|
|
NAS_ROOT_PATH: "/mnt/niederlassungen",
|
|
NAS_ROOT_PATH: "/mnt/niederlassungen",
|
|
|
- SESSION_COOKIE_SECURE: "maybe",
|
|
|
|
|
|
|
+ SEARCH_PROVIDER: "nope",
|
|
|
})
|
|
})
|
|
|
- ).toThrow(/SESSION_COOKIE_SECURE/i);
|
|
|
|
|
|
|
+ ).toThrow(/SEARCH_PROVIDER/i);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- it("throws with a clear error if required vars are missing", () => {
|
|
|
|
|
- try {
|
|
|
|
|
- validateEnv({});
|
|
|
|
|
- throw new Error("Expected validateEnv to throw");
|
|
|
|
|
- } catch (err) {
|
|
|
|
|
- expect(err.code).toBe("ENV_INVALID");
|
|
|
|
|
- expect(err.missing).toEqual([
|
|
|
|
|
- "MONGODB_URI",
|
|
|
|
|
- "SESSION_SECRET",
|
|
|
|
|
- "NAS_ROOT_PATH",
|
|
|
|
|
- ]);
|
|
|
|
|
- expect(String(err.message)).toContain(
|
|
|
|
|
- "Missing required environment variables:"
|
|
|
|
|
- );
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- it("rejects invalid MONGODB_URI schemes", () => {
|
|
|
|
|
- expect(() =>
|
|
|
|
|
- validateEnv({
|
|
|
|
|
- MONGODB_URI: "http://localhost:27017/rhl",
|
|
|
|
|
- SESSION_SECRET: validSecret(),
|
|
|
|
|
- NAS_ROOT_PATH: "/mnt/niederlassungen",
|
|
|
|
|
- NODE_ENV: "production",
|
|
|
|
|
- })
|
|
|
|
|
- ).toThrow(/MONGODB_URI/i);
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- it("rejects too-short SESSION_SECRET", () => {
|
|
|
|
|
- expect(() =>
|
|
|
|
|
- validateEnv({
|
|
|
|
|
- MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
|
|
|
- SESSION_SECRET: "short-secret",
|
|
|
|
|
- NAS_ROOT_PATH: "/mnt/niederlassungen",
|
|
|
|
|
- })
|
|
|
|
|
- ).toThrow(/SESSION_SECRET/i);
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- it("rejects placeholder-like SESSION_SECRET even if long enough", () => {
|
|
|
|
|
- const secret = `change-me-${"x".repeat(64)}`;
|
|
|
|
|
-
|
|
|
|
|
- expect(() =>
|
|
|
|
|
- validateEnv({
|
|
|
|
|
- MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
|
|
|
- SESSION_SECRET: secret,
|
|
|
|
|
- NAS_ROOT_PATH: "/mnt/niederlassungen",
|
|
|
|
|
- })
|
|
|
|
|
- ).toThrow(/placeholder/i);
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- it("rejects NAS_ROOT_PATH that is not absolute", () => {
|
|
|
|
|
- expect(() =>
|
|
|
|
|
- validateEnv({
|
|
|
|
|
- MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
|
|
|
- SESSION_SECRET: validSecret(),
|
|
|
|
|
- NAS_ROOT_PATH: "mnt/niederlassungen",
|
|
|
|
|
- })
|
|
|
|
|
- ).toThrow(/NAS_ROOT_PATH/i);
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- it('rejects NAS_ROOT_PATH containing ".." segments', () => {
|
|
|
|
|
- expect(() =>
|
|
|
|
|
- validateEnv({
|
|
|
|
|
- MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
|
|
|
- SESSION_SECRET: validSecret(),
|
|
|
|
|
- NAS_ROOT_PATH: "/mnt/../etc",
|
|
|
|
|
- })
|
|
|
|
|
- ).toThrow(/NAS_ROOT_PATH/i);
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- it("rejects invalid NODE_ENV values", () => {
|
|
|
|
|
|
|
+ it("requires Qsirch env keys when SEARCH_PROVIDER=qsirch", () => {
|
|
|
expect(() =>
|
|
expect(() =>
|
|
|
validateEnv({
|
|
validateEnv({
|
|
|
MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
|
SESSION_SECRET: validSecret(),
|
|
SESSION_SECRET: validSecret(),
|
|
|
NAS_ROOT_PATH: "/mnt/niederlassungen",
|
|
NAS_ROOT_PATH: "/mnt/niederlassungen",
|
|
|
- NODE_ENV: "staging",
|
|
|
|
|
|
|
+ SEARCH_PROVIDER: "qsirch",
|
|
|
})
|
|
})
|
|
|
- ).toThrow(/NODE_ENV/i);
|
|
|
|
|
|
|
+ ).toThrow(
|
|
|
|
|
+ /QSIRCH_BASE_URL|QSIRCH_ACCOUNT|QSIRCH_PASSWORD|QSIRCH_PATH_PREFIX/i
|
|
|
|
|
+ );
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- it("rejects invalid PORT values", () => {
|
|
|
|
|
|
|
+ it("accepts a valid qsirch configuration", () => {
|
|
|
expect(() =>
|
|
expect(() =>
|
|
|
validateEnv({
|
|
validateEnv({
|
|
|
MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
|
SESSION_SECRET: validSecret(),
|
|
SESSION_SECRET: validSecret(),
|
|
|
NAS_ROOT_PATH: "/mnt/niederlassungen",
|
|
NAS_ROOT_PATH: "/mnt/niederlassungen",
|
|
|
- PORT: "70000",
|
|
|
|
|
|
|
+ SEARCH_PROVIDER: "qsirch",
|
|
|
|
|
+ QSIRCH_BASE_URL: "http://192.168.0.22:8080",
|
|
|
|
|
+ QSIRCH_ACCOUNT: "rhl_search",
|
|
|
|
|
+ QSIRCH_PASSWORD: "super-secret",
|
|
|
|
|
+ QSIRCH_PATH_PREFIX: "/Niederlassungen",
|
|
|
|
|
+ QSIRCH_DATE_FIELD: "modified",
|
|
|
|
|
+ QSIRCH_MODE: "sync",
|
|
|
})
|
|
})
|
|
|
- ).toThrow(/PORT/i);
|
|
|
|
|
-
|
|
|
|
|
- expect(() =>
|
|
|
|
|
- validateEnv({
|
|
|
|
|
- MONGODB_URI: "mongodb://localhost:27017/rhl",
|
|
|
|
|
- SESSION_SECRET: validSecret(),
|
|
|
|
|
- NAS_ROOT_PATH: "/mnt/niederlassungen",
|
|
|
|
|
- PORT: "abc",
|
|
|
|
|
- })
|
|
|
|
|
- ).toThrow(/PORT/i);
|
|
|
|
|
|
|
+ ).not.toThrow();
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|