51 lines
2.8 KiB
TypeScript
51 lines
2.8 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
||
import { admissionDenialMessage, DEFAULT_ADMISSION_MESSAGES, parseAdmissionMessages, renderAdmissionMessage } from "./admission-settings";
|
||
|
||
describe("admission message settings", () => {
|
||
it("normalizes independently configured denial templates with allowed variables", () => {
|
||
const formData = validMessages();
|
||
formData.set("registrationMessage", " Register {player} before joining {group}. ");
|
||
formData.set("scheduledAccessDeniedMessage", "{player}, {group} may join from {next_start} to {next_end}.");
|
||
|
||
expect(parseAdmissionMessages(formData)).toEqual({
|
||
registrationMessage: "Register {player} before joining {group}.",
|
||
groupAccessDeniedMessage: "{player} cannot access the server with {group}.",
|
||
vpnDeniedMessage: "VPN access for {player} in {group} requires an exception.",
|
||
scheduledAccessDeniedMessage: "{player}, {group} may join from {next_start} to {next_end}.",
|
||
});
|
||
});
|
||
|
||
it("selects the configured message for each admission denial reason", () => {
|
||
expect(admissionDenialMessage("not_registered", DEFAULT_ADMISSION_MESSAGES)).toBe(DEFAULT_ADMISSION_MESSAGES.registrationMessage);
|
||
expect(admissionDenialMessage("group_access_disabled", DEFAULT_ADMISSION_MESSAGES)).toBe(DEFAULT_ADMISSION_MESSAGES.groupAccessDeniedMessage);
|
||
expect(admissionDenialMessage("schedule_disallowed", DEFAULT_ADMISSION_MESSAGES)).toBe(DEFAULT_ADMISSION_MESSAGES.scheduledAccessDeniedMessage);
|
||
expect(admissionDenialMessage("anonymized_network_disallowed", DEFAULT_ADMISSION_MESSAGES)).toBe(DEFAULT_ADMISSION_MESSAGES.vpnDeniedMessage);
|
||
});
|
||
|
||
it("renders static variables without evaluating expressions", () => {
|
||
expect(renderAdmissionMessage("{player} uses {group}; next: {next_start}–{next_end}.", {
|
||
player: "AlexMC",
|
||
group: "Friday friends",
|
||
next_start: "2026-08-07 20:00 UTC",
|
||
next_end: "2026-08-07 23:59 UTC",
|
||
})).toBe("AlexMC uses Friday friends; next: 2026-08-07 20:00 UTC–2026-08-07 23:59 UTC.");
|
||
});
|
||
|
||
it("rejects missing, short, overlong, control-character, or unsupported-variable messages", () => {
|
||
for (const invalid of ["short", "a".repeat(501), "Denied\nInjected", "Denied for {next_start}.", "Denied for {unknown}."] as const) {
|
||
const formData = validMessages();
|
||
formData.set("vpnDeniedMessage", invalid);
|
||
expect(parseAdmissionMessages(formData)).toBeNull();
|
||
}
|
||
});
|
||
});
|
||
|
||
function validMessages() {
|
||
const formData = new FormData();
|
||
formData.set("registrationMessage", "Register {player} before joining {group}.");
|
||
formData.set("groupAccessDeniedMessage", "{player} cannot access the server with {group}.");
|
||
formData.set("vpnDeniedMessage", "VPN access for {player} in {group} requires an exception.");
|
||
formData.set("scheduledAccessDeniedMessage", "{group} may join from {next_start} to {next_end}.");
|
||
return formData;
|
||
}
|