const assert = require("node:assert/strict"); const fs = require("node:fs"); const os = require("node:os"); const path = require("node:path"); const { after, before, test } = require("node:test"); const testDirectory = fs.mkdtempSync(path.join(os.tmpdir(), "birthday-rsvp-test-")); process.env.ADMIN_KEY = "test-admin-key"; process.env.DATABASE_FILE = path.join(testDirectory, "invites.db"); process.env.ORIGIN = "http://127.0.0.1"; const { createInvites, getInvite } = require("../database"); const { server } = require("../server"); const token = "admin-rsvp-test-token"; let baseUrl; before(async () => { createInvites([{ token, guestName: "Test Guest" }]); await new Promise((resolve, reject) => { server.once("error", reject); server.listen(0, "127.0.0.1", resolve); }); baseUrl = `http://127.0.0.1:${server.address().port}`; }); after(async () => { await new Promise(resolve => server.close(resolve)); fs.rmSync(testDirectory, { recursive: true, force: true }); }); async function patchRsvp(payload, authenticated = true, inviteToken = token) { const headers = { "Content-Type": "application/json" }; if (authenticated) headers.Authorization = "Bearer test-admin-key"; const response = await fetch(`${baseUrl}/api/admin/invites/${inviteToken}/rsvp`, { method: "PATCH", headers, body: JSON.stringify(payload) }); return { response, body: await response.json() }; } test("an admin can set and update an RSVP on behalf of a guest", async () => { const unauthorized = await patchRsvp({ answer: "alone" }, false); assert.equal(unauthorized.response.status, 401); assert.equal(getInvite(token).answer, null); const missingCompanion = await patchRsvp({ answer: "with_someone" }); assert.equal(missingCompanion.response.status, 400); assert.equal(getInvite(token).answer, null); const saved = await patchRsvp({ answer: "with_someone", companionName: " Companion Guest " }); assert.equal(saved.response.status, 200); assert.equal(saved.body.invite.answer, "with_someone"); assert.equal(saved.body.invite.companionName, "Companion Guest"); assert.ok(saved.body.invite.lastSavedAt); const dashboardResponse = await fetch(`${baseUrl}/api/admin/invites`, { headers: { Authorization: "Bearer test-admin-key" } }); const dashboard = await dashboardResponse.json(); assert.equal(dashboardResponse.status, 200); assert.deepEqual(dashboard.summary, { total: 1, opened: 0, responded: 1, attending: 2, notComing: 0 }); const changed = await patchRsvp({ answer: "alone", companionName: "Ignored Guest" }); assert.equal(changed.response.status, 200); assert.equal(changed.body.invite.answer, "alone"); assert.equal(changed.body.invite.companionName, ""); const missingInvite = await patchRsvp({ answer: "not_coming" }, true, "missing-token"); assert.equal(missingInvite.response.status, 404); });