ken_nogi/NodeSrv/apps/org-master-sync/test/siteConfigStore.test.js
Kenichiro NOGI ce58cb4be4 初回コミット: dev配下(NodeSrv/Pleasanter等)をGitea管理下に統合
GitHub(nextgroup2706/ken_nogi)は今後使わず自社Gitea運用に切替え。
NodeSrvは旧リポジトリの履歴を破棄しファイルのみ統合(Dokploy用サービスアカウントは
別途mygit-admin/NodeSrv.gitに履歴あり)。notepmエクスポート(12GB)とPleasanter
インストーラzip(208MB)はサイズが大きいため.gitignoreで除外。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 15:37:06 +09:00

68 lines
3.3 KiB
JavaScript

const { test } = require("node:test");
const assert = require("node:assert");
const fs = require("fs");
const path = require("path");
const os = require("os");
const { saveSiteSnapshot, findSiteDir, ensureSiteDir, sanitize } = require("../src/lib/siteConfigStore");
function makeTempDir() {
return fs.mkdtempSync(path.join(os.tmpdir(), "org-master-sync-siteconfig-test-"));
}
test("sanitize strips path-unsafe characters and falls back to \"untitled\" when empty", () => {
assert.strictEqual(sanitize("社員・組織マスタ管理テーブル"), "社員・組織マスタ管理テーブル");
assert.strictEqual(sanitize("a/b\\c:d*e?f\"g<h>i|j"), "a_b_c_d_e_f_g_h_i_j");
assert.strictEqual(sanitize(""), "untitled");
assert.strictEqual(sanitize(undefined), "untitled");
});
test("saveSiteSnapshot creates configs/site-{siteId}_{title}/sitesettings/ with both latest and a timestamped history file", () => {
const baseDir = makeTempDir();
const now = new Date("2026-08-08T09:00:00.000Z");
saveSiteSnapshot(1, { Title: "社員・組織マスタ管理テーブル" }, { now, baseDir });
const siteDir = path.join(baseDir, "site-1_社員・組織マスタ管理テーブル");
const settingsDir = path.join(siteDir, "sitesettings");
assert.ok(fs.existsSync(settingsDir));
const latestPath = path.join(settingsDir, "site-1_latest.json");
assert.ok(fs.existsSync(latestPath));
assert.deepStrictEqual(JSON.parse(fs.readFileSync(latestPath, "utf8")), { Title: "社員・組織マスタ管理テーブル" });
const historyFiles = fs.readdirSync(settingsDir).filter((f) => f !== "site-1_latest.json");
assert.strictEqual(historyFiles.length, 1);
assert.ok(historyFiles[0].startsWith("site-1_2026-08-08T09-00-00"));
});
test("saveSiteSnapshot reuses the existing site-{siteId}_* folder on subsequent calls even if the title changes", () => {
const baseDir = makeTempDir();
saveSiteSnapshot(1, { Title: "旧タイトル" }, { now: new Date("2026-08-08T09:00:00.000Z"), baseDir });
saveSiteSnapshot(1, { Title: "新タイトル" }, { now: new Date("2026-08-08T10:00:00.000Z"), baseDir });
const dirs = fs.readdirSync(baseDir);
assert.strictEqual(dirs.length, 1); // 新しいタイトルのフォルダを別途作らない
assert.strictEqual(dirs[0], "site-1_旧タイトル");
const settingsDir = path.join(baseDir, "site-1_旧タイトル", "sitesettings");
assert.strictEqual(fs.readdirSync(settingsDir).length, 3); // latest.json + history 2件
const latest = JSON.parse(fs.readFileSync(path.join(settingsDir, "site-1_latest.json"), "utf8"));
assert.deepStrictEqual(latest, { Title: "新タイトル" }); // latest.jsonの中身は最新で上書き
});
test("findSiteDir locates a folder by its site- prefix regardless of the title suffix", () => {
const baseDir = makeTempDir();
fs.mkdirSync(path.join(baseDir, "site-42_何かのタイトル"), { recursive: true });
assert.strictEqual(findSiteDir(baseDir, 42), path.join(baseDir, "site-42_何かのタイトル"));
assert.strictEqual(findSiteDir(baseDir, 999), null);
});
test("ensureSiteDir creates a new site-{siteId}_{title} folder when none exists yet", () => {
const baseDir = makeTempDir();
const dir = ensureSiteDir(baseDir, 7, "新規サイト");
assert.strictEqual(dir, path.join(baseDir, "site-7_新規サイト"));
assert.ok(fs.existsSync(dir));
});