import test from "node:test"; import assert from "node:assert/strict"; import { withApp } from "./helpers.js"; async function entryIds(api) { const found = await api("/api/entries?q=&status=all&perPage=50"); const byTitle = {}; for (const it of found.json.data.items) byTitle[it.title] = it.id; return byTitle; } test("related projects are bidirectional and manageable", async () => { await withApp(async ({ api, loginAdmin }) => { const ids = await entryIds(api); const cookie = await loginAdmin(); const added = await api(`/api/admin/entries/${ids["ripgrep"]}/relations`, { method: "POST", body: { relatedId: ids["fzf"] }, cookie, }); assert.equal(added.status, 201); // 反向可见 const back = await api(`/api/admin/relations?excludeId=${ids["fzf"]}`, { cookie }); assert.ok(back.json.data.every((e) => e.id !== ids["fzf"])); // 重复关联不报错 const again = await api(`/api/admin/entries/${ids["ripgrep"]}/relations`, { method: "POST", body: { relatedId: ids["fzf"] }, cookie, }); assert.equal(again.status, 200); assert.equal(again.json.data.created, false); // 关联自己被拒绝 const self = await api(`/api/admin/entries/${ids["fzf"]}/relations`, { method: "POST", body: { relatedId: ids["fzf"] }, cookie, }); assert.equal(self.status, 400); await api(`/api/admin/entries/${ids["ripgrep"]}/relations/${ids["fzf"]}`, { method: "DELETE", cookie, }); const after = await api(`/api/admin/relations`, { cookie }); void after; }); }); test("detail page shows related projects", async () => { await withApp(async ({ base, api, loginAdmin }) => { const ids = await entryIds(api); const cookie = await loginAdmin(); await api(`/api/admin/entries/${ids["ripgrep"]}/relations`, { method: "POST", body: { relatedId: ids["fzf"] }, cookie, }); const res = await fetch(`${base}/entries/ripgrep`); const html = await res.text(); assert.equal(res.status, 200); assert.ok(html.includes("相关项目"), "详情页有相关项目区块"); assert.ok(html.includes("fzf"), "相关项目里出现 fzf"); }); }); test("relations endpoints require admin", async () => { await withApp(async ({ api }) => { const res = await api("/api/admin/relations"); assert.equal(res.status, 401); }); });