bravo-forever/tests/test_table.js

86 lines
4.2 KiB
JavaScript

const assert = require("node:assert/strict");
const fs = require("node:fs");
const path = require("node:path");
const test = require("node:test");
const vm = require("node:vm");
const source = fs.readFileSync(path.join(__dirname, "../static/app.js"), "utf8");
test("category columns sort excluded choices as lowest and pending submissions last", () => {
const context = vm.createContext({
document: { querySelector: () => ({}) },
fetch: () => new Promise(() => {}),
});
vm.runInContext(source, context);
context.people = [
{ userId: 1, loginUsername: "Third", displayName: "Third", preferences: { class: { ranking: ["Mage", "Warrior", "Paladin"] } } },
{ userId: 2, loginUsername: "First", displayName: "First", preferences: { class: { ranking: ["Paladin", "Mage", "Warrior"] } } },
{ userId: 3, loginUsername: "Pending", displayName: "Pending", preferences: {} },
{ userId: 4, loginUsername: "Second", displayName: "Second", preferences: { class: { ranking: ["Mage", "Paladin", "Warrior"] } } },
{ userId: 5, loginUsername: "Excluded", displayName: "Excluded", preferences: { class: { ranking: ["Mage", "Warrior"] } } },
];
const names = vm.runInContext(
"state.sort = { key: 'category:Paladin', direction: 1 }; sortPeople(people, 'class').map(person => person.displayName)",
context,
);
assert.deepEqual(Array.from(names), ["First", "Second", "Third", "Excluded", "Pending"]);
const reversed = vm.runInContext(
"state.sort = { key: 'category:Paladin', direction: -1 }; sortPeople(people, 'class').map(person => person.displayName)",
context,
);
assert.deepEqual(Array.from(reversed), ["Excluded", "Third", "Second", "First", "Pending"]);
const rankColumn = vm.runInContext(
"state.sort = { key: 'rank2', direction: 1 }; sortPeople(people, 'class').map(person => person.displayName)",
context,
);
assert.deepEqual(Array.from(rankColumn), ["Third", "First", "Second", "Excluded", "Pending"]);
assert.equal(vm.runInContext("ordinal(1)", context), "1st");
assert.equal(vm.runInContext("ordinal(12)", context), "12th");
});
test("group tables leave excluded categories and empty rank positions blank", () => {
const app = {
innerHTML: "",
querySelector: () => ({ addEventListener() {} }),
querySelectorAll: () => [],
};
const context = vm.createContext({
document: { querySelector: () => app },
fetch: () => new Promise(() => {}),
});
vm.runInContext(source, context);
vm.runInContext(`
state.data = {
user: { userId: 1, loginUsername: "Aly", displayName: "Aly" },
properties: [{ id: "class", name: "Class", categories: ["Paladin", "Mage", "Warrior"] }],
preferences: { class: { ranking: ["Mage"] } },
people: [{ userId: 1, loginUsername: "Aly", displayName: "Aly", preferences: { class: { ranking: ["Mage"], updatedAt: "2026-10-01T00:00:00Z" } } }],
};
state.groupMode = "category";
renderGroup();
`, context);
assert.equal((app.innerHTML.match(/aria-label="No preference"><\/td>/g) || []).length, 2);
assert.doesNotMatch(app.innerHTML, />0th</);
vm.runInContext('state.groupMode = "rank"; renderGroup();', context);
assert.equal((app.innerHTML.match(/aria-label="No ranked choice"><\/td>/g) || []).length, 2);
});
test("content columns sort Yes, Maybe, No and leave unanswered people last", () => {
const context = vm.createContext({
document: { querySelector: () => ({}) },
fetch: () => new Promise(() => {}),
});
vm.runInContext(source, context);
context.people = [
{ userId: 1, loginUsername: "Noah", displayName: "Noah", preferences: { content: { choices: { "Group Questing": "No" } } } },
{ userId: 2, loginUsername: "Yara", displayName: "Yara", preferences: { content: { choices: { "Group Questing": "Yes" } } } },
{ userId: 3, loginUsername: "Missing", displayName: "Missing", preferences: {} },
{ userId: 4, loginUsername: "Mira", displayName: "Mira", preferences: { content: { choices: { "Group Questing": "Maybe" } } } },
];
const names = vm.runInContext(
"state.sort = { key: 'category:Group Questing', direction: 1 }; sortPeople(people, 'content').map(person => person.displayName)",
context,
);
assert.deepEqual(Array.from(names), ["Yara", "Mira", "Noah", "Missing"]);
});