Files
30-birthday/test/server.test.js
T
feedc0de bfac12a5bb
Publish and deploy birthday invitation / Check JavaScript (push) Successful in 4s
Publish and deploy birthday invitation / Build and push (push) Successful in 1m5s
Publish and deploy birthday invitation / Deploy to Kubernetes (push) Successful in 1m12s
Allow admins to manage guest RSVPs
2026-10-14 21:19:04 +02:00

79 lines
2.8 KiB
JavaScript

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);
});