feat(vorlagen): Editor, Liste und Versionsgeschichte (#24)
This commit was merged in pull request #24.
This commit is contained in:
+48
-1
@@ -143,16 +143,31 @@ describe("Rechtepruefung an den Einstiegspunkten", () => {
|
||||
it("beginnt jede Server Action mit einer Rechtepruefung", () => {
|
||||
// Strukturell geprueft, weil eine vergessene Pruefung sonst erst auffiele,
|
||||
// wenn jemand sie ausnutzt. Die Rechtematrix selbst deckt tests/rollen.test.ts ab.
|
||||
//
|
||||
// Anerkannt wird auch ein Helfer **in derselben Datei**, der seinerseits
|
||||
// `rechtErforderlich` ruft: seit #010 fangen die Vorlagen-Aktionen den
|
||||
// RechteFehler ab und geben eine Meldung zurueck, statt die Seite
|
||||
// auszuhaengen — im Editor waere sonst jede ungespeicherte Arbeit verloren.
|
||||
// Die Pruefung findet trotzdem statt, nur eine Ebene tiefer.
|
||||
const befunde: string[] = [];
|
||||
|
||||
for (const name of readdirSync(verzeichnis).filter((n) => n.endsWith(".ts"))) {
|
||||
const quelle = readFileSync(join(verzeichnis, name), "utf8");
|
||||
expect(quelle.startsWith('"use server";'), `${name} fehlt "use server"`).toBe(true);
|
||||
|
||||
// Helfer, die selbst pruefen – Name und Rumpf aus derselben Datei.
|
||||
const helfer = [...quelle.matchAll(/(?:async )?function (\w+)\(([\s\S]*?)\n\}/g)]
|
||||
.filter((treffer) => treffer[2]?.includes("rechtErforderlich("))
|
||||
.map((treffer) => treffer[1])
|
||||
.filter((funktion): funktion is string => funktion !== undefined);
|
||||
|
||||
for (const treffer of quelle.matchAll(/export async function (\w+)\(([\s\S]*?)\n\}/g)) {
|
||||
const [, funktion, rumpf] = treffer;
|
||||
if (!funktion || OEFFENTLICHE_AKTIONEN.has(funktion)) continue;
|
||||
if (!rumpf?.includes("rechtErforderlich(")) {
|
||||
const prueft =
|
||||
rumpf?.includes("rechtErforderlich(") === true ||
|
||||
helfer.some((helfername) => rumpf?.includes(`${helfername}(`) === true);
|
||||
if (!prueft) {
|
||||
befunde.push(`${name}: ${funktion} prueft kein Recht`);
|
||||
}
|
||||
}
|
||||
@@ -161,6 +176,38 @@ describe("Rechtepruefung an den Einstiegspunkten", () => {
|
||||
expect(befunde).toEqual([]);
|
||||
});
|
||||
|
||||
it("erkennt eine Aktion ohne jede Pruefung", () => {
|
||||
// Der Test oben ist nachsichtiger geworden; dieser hier zeigt, dass er
|
||||
// trotzdem noch anschlaegt. Geprueft wird die Regel, nicht die Datei.
|
||||
const quelle = [
|
||||
'"use server";',
|
||||
"async function mitPruefung() {",
|
||||
' await rechtErforderlich("vorlagenBearbeiten");',
|
||||
"}",
|
||||
"",
|
||||
"export async function gut() {",
|
||||
" await mitPruefung();",
|
||||
"}",
|
||||
"",
|
||||
"export async function schlecht() {",
|
||||
" return 42;",
|
||||
"}",
|
||||
].join("\n");
|
||||
|
||||
const helfer = [...quelle.matchAll(/(?:async )?function (\w+)\(([\s\S]*?)\n\}/g)]
|
||||
.filter((treffer) => treffer[2]?.includes("rechtErforderlich("))
|
||||
.map((treffer) => treffer[1]);
|
||||
const ohnePruefung = [...quelle.matchAll(/export async function (\w+)\(([\s\S]*?)\n\}/g)]
|
||||
.filter(
|
||||
([, , rumpf]) =>
|
||||
rumpf?.includes("rechtErforderlich(") !== true &&
|
||||
!helfer.some((name) => rumpf?.includes(`${name}(`) === true),
|
||||
)
|
||||
.map(([, funktion]) => funktion);
|
||||
|
||||
expect(ohnePruefung).toEqual(["schlecht"]);
|
||||
});
|
||||
|
||||
it("findet ueberhaupt Aktionen, sonst prueft der Test oben nichts", () => {
|
||||
const aktionen = readdirSync(verzeichnis)
|
||||
.filter((n) => n.endsWith(".ts"))
|
||||
|
||||
Reference in New Issue
Block a user