79 lines
2.8 KiB
JavaScript
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);
|
|
});
|