Files
sternboard/server/test/columns.test.ts
Millaguie f11ea58c2c
CI/CD Pipeline / test (push) Successful in 26s
CI/CD Pipeline / build-and-push (push) Successful in 44s
Sternboard: free retro board, no signup (initial)
Servidor Fastify + Socket.IO + Drizzle/Postgres; front Vite+React (EN/ES, tema claro/oscuro).
Tableros por columnas con plantillas, notas privadas/públicas, agrupación, votos
configurables (multivoto), timer compartido con alarma, fases, action items,
export Markdown/JSON e import, autodestrucción, gestión de columnas.
Imagen única (front servido por el servidor) y CI que la construye y publica.
2026-06-16 10:27:33 +02:00

73 lines
3.0 KiB
TypeScript

import { describe, it, expect, beforeAll, afterAll } from "vitest";
import { startTestServer, createBoard, join, type TestServer } from "./helpers.js";
let server: TestServer;
beforeAll(async () => {
server = await startTestServer();
});
afterAll(async () => {
await server.close();
});
describe("Columnas y color", () => {
it("recolorear cambia el color de TODAS mis notas", async () => {
const board = await createBoard(server.url);
const alice = await join(server.url, board.boardId, "alice", "Alice");
const colId = alice.last!.columns[0].id;
alice.emit("note:add", { columnId: colId, text: "a", color: "#ffe08a" });
alice.emit("note:add", { columnId: colId, text: "b", color: "#ffe08a" });
await alice.waitFor((s) => s.notes.length === 2);
alice.emit("note:recolorMine", { color: "#b9ddf5" });
const recolored = await alice.waitFor((s) => s.notes.every((n) => n.color === "#b9ddf5"));
expect(recolored.notes.map((n) => n.color)).toEqual(["#b9ddf5", "#b9ddf5"]);
alice.close();
});
it("añadir, renombrar, reordenar y eliminar columnas (moderador)", async () => {
const board = await createBoard(server.url); // mad-sad-glad => 3 columnas
const alice = await join(server.url, board.boardId, "alice", "Alice");
const tok = board.moderatorToken;
// añadir
alice.emit("column:add", { title: "Extra", moderatorToken: tok });
let st = await alice.waitFor((s) => s.columns.length === 4);
const extra = st.columns.find((c) => c.title === "Extra")!;
expect(extra).toBeTruthy();
// renombrar
alice.emit("column:rename", { columnId: extra.id, title: "Renombrada", moderatorToken: tok });
st = await alice.waitFor((s) => s.columns.some((c) => c.id === extra.id && c.title === "Renombrada"));
expect(st.columns.find((c) => c.id === extra.id)!.title).toBe("Renombrada");
// reordenar: poner la última primera
const ids = st.columns.map((c) => c.id);
const reordered = [ids[ids.length - 1], ...ids.slice(0, -1)];
alice.emit("column:reorder", { orderedIds: reordered, moderatorToken: tok });
st = await alice.waitFor((s) => s.columns[0].id === reordered[0]);
expect(st.columns.map((c) => c.id)).toEqual(reordered);
// eliminar
alice.emit("column:delete", { columnId: extra.id, moderatorToken: tok });
st = await alice.waitFor((s) => s.columns.length === 3);
expect(st.columns.some((c) => c.id === extra.id)).toBe(false);
alice.close();
});
it("la fase se comparte (board:phase)", async () => {
const board = await createBoard(server.url);
const alice = await join(server.url, board.boardId, "alice", "Alice");
const bob = await join(server.url, board.boardId, "bob", "Bob");
expect(alice.last!.phase).toBe("writing");
alice.emit("board:phase", { phase: "voting", moderatorToken: board.moderatorToken });
const bobState = await bob.waitFor((s) => s.phase === "voting");
expect(bobState.phase).toBe("voting");
alice.close();
bob.close();
});
});