La vista que reescribe el store
TypeScript · Vistas ordenadas en el store de tareas de una app de listas de tareas · APIs y contratos · dificultad 2/3 · ~8 min
Un compañero de equipo le pidió al asistente de IA: "Nuestro store de tareas guarda un solo array de tareas y la UI deriva vistas a partir de él: por prioridad, las más nuevas primero, solo tareas abiertas. Escribe los helpers de las vistas. Deben devolver arrays nuevos y no tocar nunca el array del store, porque varios componentes lo leen al mismo tiempo."
El código llegó con un docstring claro en cada helper y con tests en verde. El contrato que prometen los docstrings:
sortByPrioritydevuelve un array nuevo, con lo más urgente primero; las prioridades iguales mantienen su orden relativo.newestFirstdevuelve un array nuevo ordenado porcreatedAt, lo más nuevo primero.openByPrioritydevuelve las tareas abiertas, con lo más urgente primero.takedevuelve las primerasntareas de una vista.- Ninguno de los helpers modifica
tasks.
Uno de los tests visibles incluso comprueba que la entrada queda intacta. Revisa los helpers frente al contrato completo, no solo el orden.
Repara el código hasta que pasen las pruebas ocultas.
code.ts
Pruebas visibles (pasan con el código tal como está)
import { describe, it, expect } from "@debunk/harness";
import { sortByPriority, newestFirst, openByPriority, type Task } from "./code";
const task = (id: string, priority: number, createdAt: number, done = false): Task => ({
id,
title: `Task ${id}`,
priority,
createdAt,
done,
});
describe("task views", () => {
it("sortByPriority puts the most urgent task first", () => {
const view = sortByPriority([task("a", 2, 1), task("b", 5, 2), task("c", 3, 3)]);
expect(view.map((t) => t.id)).toEqual(["b", "c", "a"]);
});
it("newestFirst orders by creation time, newest first", () => {
const view = newestFirst([task("a", 1, 100), task("b", 1, 300), task("c", 1, 200)]);
expect(view.map((t) => t.id)).toEqual(["b", "c", "a"]);
});
it("openByPriority leaves the original list untouched", () => {
const tasks = [task("a", 1, 1), task("b", 5, 2, true), task("c", 3, 3)];
const view = openByPriority(tasks);
expect(view.map((t) => t.id)).toEqual(["c", "a"]);
expect(tasks.map((t) => t.id)).toEqual(["a", "b", "c"]);
});
});