v2: модульный монолит — очередь, персистентность, безопасность, SSE, тесты
Some checks failed
test / test (push) Failing after 24s
Some checks failed
test / test (push) Failing after 24s
Реализация целевого дизайна (docs/architecture/target-design.md): - src/: модульная структура (config, logger, errors, http, core: auth/history/jobs/engines/comfy/codex/images) - Очередь заданий: FIFO, кониурентность codex=1 / comfy-upscale=2, MAX_QUEUED_JOBS=5, JSONL-журнал и восстановление после рестарта (running → interrupted, upscale requeue) - Персистентные сессии (sha256-хеши токенов), scrypt-хеш пароля, rate-limit входа, Origin-проверка, magic-byte валидация аплоадов - Атомарная запись манифеста истории, каскадное удаление, URL с фактическим расширением + 302-алиас /image.jpg, миграция history/ → data/history - Даунскейл sharp до 1024px перед Codex + масштабирование области референса - SSE /api/events с фолбэком на polling, фронтенд переведён на ES-модули (public/js/) - Тесты node:test + supertest (27), CI workflow test.yml, Docker/деплой: том kadr-data - Документация: README, docs/architecture/
This commit is contained in:
82
test/config.test.js
Normal file
82
test/config.test.js
Normal file
@@ -0,0 +1,82 @@
|
||||
"use strict";
|
||||
|
||||
const { test, describe } = require("node:test");
|
||||
const assert = require("node:assert/strict");
|
||||
const { loadConfig } = require("../src/config");
|
||||
const { ConfigError } = require("../src/errors");
|
||||
|
||||
describe("config", () => {
|
||||
test("loads default configuration with generated password", () => {
|
||||
const config = loadConfig({});
|
||||
assert.equal(config.PORT, 3000);
|
||||
assert.equal(config.APP_USER, "admin");
|
||||
assert.equal(typeof config.APP_PASSWORD, "string");
|
||||
assert.ok(config.APP_PASSWORD.length > 8);
|
||||
assert.equal(config.isGeneratedPassword, true);
|
||||
assert.equal(config.LOG_LEVEL, "info");
|
||||
assert.equal(config.EDIT_MAX_DIMENSION, 1024);
|
||||
assert.equal(config.UPSCALE_MAX_DIMENSION, 2048);
|
||||
assert.equal(config.CODEX_CONCURRENCY, 1);
|
||||
assert.equal(config.UPSCALE_CONCURRENCY, 2);
|
||||
assert.equal(config.MAX_QUEUED_JOBS, 5);
|
||||
assert.equal(config.SSE_ENABLED, true);
|
||||
assert.equal(config.SESSION_PERSIST, true);
|
||||
});
|
||||
|
||||
test("applies environment variable overrides", () => {
|
||||
const env = {
|
||||
PORT: "8080",
|
||||
COMFY_URL: "http://10.0.0.5:8188",
|
||||
APP_USER: "customuser",
|
||||
APP_PASSWORD: "secretpassword123",
|
||||
LOG_LEVEL: "debug",
|
||||
EDIT_MAX_DIMENSION: "512",
|
||||
CODEX_CONCURRENCY: "2",
|
||||
UPSCALE_CONCURRENCY: "4",
|
||||
MAX_QUEUED_JOBS: "10",
|
||||
SSE_ENABLED: "false",
|
||||
SESSION_PERSIST: "0",
|
||||
TRUST_PROXY: "true",
|
||||
};
|
||||
|
||||
const config = loadConfig(env);
|
||||
assert.equal(config.PORT, 8080);
|
||||
assert.equal(config.COMFY_URL, "http://10.0.0.5:8188");
|
||||
assert.equal(config.APP_USER, "customuser");
|
||||
assert.equal(config.APP_PASSWORD, "secretpassword123");
|
||||
assert.equal(config.isGeneratedPassword, false);
|
||||
assert.equal(config.LOG_LEVEL, "debug");
|
||||
assert.equal(config.EDIT_MAX_DIMENSION, 512);
|
||||
assert.equal(config.CODEX_CONCURRENCY, 2);
|
||||
assert.equal(config.UPSCALE_CONCURRENCY, 4);
|
||||
assert.equal(config.MAX_QUEUED_JOBS, 10);
|
||||
assert.equal(config.SSE_ENABLED, false);
|
||||
assert.equal(config.SESSION_PERSIST, false);
|
||||
assert.equal(config.TRUST_PROXY, true);
|
||||
});
|
||||
|
||||
test("throws ConfigError on invalid values", () => {
|
||||
assert.throws(
|
||||
() => loadConfig({ PORT: "99999" }),
|
||||
(err) => err instanceof ConfigError && err.issues.length > 0
|
||||
);
|
||||
|
||||
assert.throws(
|
||||
() => loadConfig({ COMFY_URL: "not-a-url" }),
|
||||
(err) => err instanceof ConfigError
|
||||
);
|
||||
|
||||
assert.throws(
|
||||
() => loadConfig({ LOG_LEVEL: "invalid_level" }),
|
||||
(err) => err instanceof ConfigError
|
||||
);
|
||||
});
|
||||
|
||||
test("getSanitized() masks APP_PASSWORD", () => {
|
||||
const config = loadConfig({ APP_PASSWORD: "supersecretpass" });
|
||||
const sanitized = config.getSanitized();
|
||||
assert.equal(sanitized.APP_PASSWORD, undefined);
|
||||
assert.equal(sanitized.APP_PASSWORD_SET, true);
|
||||
assert.equal(sanitized.APP_USER, "admin");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user