chore: prisma.config.ts, Tests und Doku, Version 1.1.0
CI / pruefen (push) Has been cancelled

Prisma liest seine Einstellungen aus prisma.config.ts statt aus der
package.json; die Warnung vor Prisma 7 ist damit weg. Der dotenv-Aufruf
darin ist nicht optional: sobald die Datei existiert, laedt Prisma die .env
nicht mehr von selbst, und migrate deploy staende ohne DATABASE_URL da.

Vier neue Ende-zu-Ende-Tests: Reihenfolge und Mehrfachauswahl ueber die API,
Mehrfachauswahl in der Oberflaeche, der Aenderungsverlauf und das Manifest
samt Symbolen ohne Anmeldung. Damit sind es 21.

Der Test zum Ziehen von Aufgaben war gelegentlich rot, ohne dass etwas kaputt
war: das Neuladen brach den noch laufenden Speicheraufruf ab. Er wartet jetzt
auf die Antwort, statt auf eine feste Pause zu hoffen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-26 14:30:44 +02:00
co-authored by Claude Opus 5
parent 16e8d31277
commit fce0a90cc3
8 changed files with 306 additions and 22 deletions
+62 -1
View File
@@ -1,6 +1,10 @@
import { describe, expect, it } from "vitest";
import { NOTIFICATION_EVENTS } from "@/lib/notify/types";
import { notificationTargetCreateSchema } from "./validation";
import {
notificationTargetCreateSchema,
projectBulkSchema,
projectReorderSchema,
} from "./validation";
/**
* Dieser Test entstand aus einem Fehler: beim Ergaenzen eines neuen
@@ -70,3 +74,60 @@ describe("notificationTargetCreateSchema", () => {
}
});
});
describe("projectReorderSchema", () => {
it("nimmt Spalten mit Listen an", () => {
const parsed = projectReorderSchema.safeParse({
columns: { IDEA: ["a", "b"], DONE: [] },
});
expect(parsed.success).toBe(true);
});
it("weist unbekannte Spalten ab", () => {
expect(
projectReorderSchema.safeParse({ columns: { PHANTASIE: ["a"] } }).success,
).toBe(false);
});
it("weist einen leeren Aufruf ab, statt ihn wirkungslos durchzuwinken", () => {
expect(projectReorderSchema.safeParse({ columns: {} }).success).toBe(false);
});
});
describe("projectBulkSchema", () => {
const ids = ["a", "b"];
it("verlangt zu jeder Aktion die noetige Angabe", () => {
// Ohne diese Pruefungen kaeme die Aktion durch und taete nichts – der
// schlimmste Fall, weil niemand merkt, dass nichts passiert ist.
expect(projectBulkSchema.safeParse({ ids, action: "status" }).success).toBe(false);
expect(projectBulkSchema.safeParse({ ids, action: "tags" }).success).toBe(false);
expect(projectBulkSchema.safeParse({ ids, action: "tags", tags: [] }).success).toBe(false);
expect(projectBulkSchema.safeParse({ ids, action: "favorite" }).success).toBe(false);
});
it("laesst vollstaendige Aktionen durch", () => {
expect(
projectBulkSchema.safeParse({ ids, action: "status", status: "DONE" }).success,
).toBe(true);
expect(
projectBulkSchema.safeParse({ ids, action: "tags", tags: ["archiv"] }).success,
).toBe(true);
expect(
projectBulkSchema.safeParse({ ids, action: "favorite", favorite: false }).success,
).toBe(true);
// Loeschen braucht nichts ausser den IDs.
expect(projectBulkSchema.safeParse({ ids, action: "delete" }).success).toBe(true);
});
it("ergaenzt standardmaessig, statt zu entfernen", () => {
const parsed = projectBulkSchema.parse({ ids, action: "tags", tags: ["x"] });
expect(parsed.tagMode).toBe("add");
});
it("braucht mindestens eine ID und deckelt die Menge", () => {
expect(projectBulkSchema.safeParse({ ids: [], action: "delete" }).success).toBe(false);
const zuViele = Array.from({ length: 201 }, (_, index) => `id-${index}`);
expect(projectBulkSchema.safeParse({ ids: zuViele, action: "delete" }).success).toBe(false);
});
});