151 lines
4.8 KiB
TypeScript
151 lines
4.8 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
||
import {
|
||
EINGEBAUTE_PLATZHALTER,
|
||
QUELLEN_TEXT,
|
||
istEingebaut,
|
||
unbekanntePlatzhalter,
|
||
unbenutzteVariablen,
|
||
} from "@/lib/platzhalter";
|
||
import { platzhalterDerStruktur, VariableSchema, type Struktur } from "@/lib/vorlagen-format";
|
||
|
||
/**
|
||
* Die eingebauten Platzhalter (#010).
|
||
*
|
||
* Die Liste ist Daten, und Daten koennen still falsch sein: ein Schluessel mit
|
||
* Bindestrich wuerde im Lauf nie ersetzt, weil `platzhalterFinden` ihn nicht als
|
||
* Platzhalter erkennt. Deshalb wird die Liste hier gegen genau dieselbe Regel
|
||
* geprueft, die auch fuer Variablen gilt.
|
||
*/
|
||
|
||
describe("Liste der eingebauten Platzhalter", () => {
|
||
it("haelt sich an die Schluesselregel der Variablen", () => {
|
||
const schluesselRegel = VariableSchema.shape.schluessel;
|
||
for (const platzhalter of EINGEBAUTE_PLATZHALTER) {
|
||
const ergebnis = schluesselRegel.safeParse(platzhalter.schluessel);
|
||
expect(ergebnis.success, `${platzhalter.schluessel}: ${ergebnis.error?.message}`).toBe(true);
|
||
}
|
||
});
|
||
|
||
it("nennt jeden Schluessel nur einmal", () => {
|
||
const schluessel = EINGEBAUTE_PLATZHALTER.map((p) => p.schluessel);
|
||
expect(new Set(schluessel).size).toBe(schluessel.length);
|
||
});
|
||
|
||
it("erklaert jeden Platzhalter und ordnet ihn einer benannten Quelle zu", () => {
|
||
for (const platzhalter of EINGEBAUTE_PLATZHALTER) {
|
||
expect(platzhalter.erklaerung.trim().length, platzhalter.schluessel).toBeGreaterThan(0);
|
||
expect(QUELLEN_TEXT[platzhalter.quelle], platzhalter.schluessel).toBeTruthy();
|
||
}
|
||
});
|
||
|
||
it("enthaelt die im Auftrag genannten Platzhalter", () => {
|
||
// Namentlich, damit das Verschwinden eines einzelnen auffaellt – eine
|
||
// Vorlage, die ihn benutzt, bekaeme sonst plötzlich eine Warnung.
|
||
for (const schluessel of [
|
||
"hostname",
|
||
"seriennummer",
|
||
"inventarnummer",
|
||
"ticket",
|
||
"datum",
|
||
"techniker",
|
||
"kunde",
|
||
"kundenkuerzel",
|
||
"mitarbeiter",
|
||
"benutzer",
|
||
"vorname",
|
||
"nachname",
|
||
"upn",
|
||
"sam",
|
||
"mail",
|
||
"abteilung",
|
||
"titel",
|
||
"vorgesetzter",
|
||
"vorgesetzter_sam",
|
||
"dn",
|
||
"ou",
|
||
"gruppen",
|
||
"generiertes_passwort",
|
||
]) {
|
||
expect(istEingebaut(schluessel), schluessel).toBe(true);
|
||
}
|
||
});
|
||
|
||
it("kennzeichnet die Platzhalter, die nur im Modus Dienstleistung gefuellt sind", () => {
|
||
const nurDienstleistung = EINGEBAUTE_PLATZHALTER.filter((p) => p.nurDienstleistung).map(
|
||
(p) => p.schluessel,
|
||
);
|
||
expect(nurDienstleistung.sort()).toEqual(["kunde", "kundenkuerzel"]);
|
||
});
|
||
});
|
||
|
||
describe("Unbekannte Platzhalter", () => {
|
||
it("meldet, was weder eingebaut noch als Variable definiert ist", () => {
|
||
expect(unbekanntePlatzhalter(["hostname", "os_version", "tipfehler"], ["os_version"])).toEqual([
|
||
"tipfehler",
|
||
]);
|
||
});
|
||
|
||
it("meldet nichts, wenn alles bekannt ist", () => {
|
||
expect(unbekanntePlatzhalter(["hostname", "generiertes_passwort"], [])).toEqual([]);
|
||
});
|
||
|
||
it("findet einen Tippfehler in einem echten Aufbau", () => {
|
||
// Der praktische Fall: „{{hostnmae}}" im Befehl. Ohne Warnung merkt es erst
|
||
// der Techniker, wenn der Befehl den Platzhalter im Klartext enthaelt.
|
||
const struktur: Struktur = {
|
||
variablen: [
|
||
{
|
||
schluessel: "os_version",
|
||
beschriftung: "Betriebssystem",
|
||
typ: "TEXT",
|
||
optionen: [],
|
||
pflicht: false,
|
||
},
|
||
],
|
||
abschnitte: [
|
||
{
|
||
titel: "Installation",
|
||
schritte: [
|
||
{
|
||
titel: "Rechner umbenennen",
|
||
typ: "BEFEHL",
|
||
pflicht: true,
|
||
konfig: {
|
||
shell: "powershell",
|
||
befehl: 'Rename-Computer -NewName "{{hostnmae}}" # soll {{hostname}} sein',
|
||
},
|
||
},
|
||
{
|
||
titel: "{{os_version}} installieren",
|
||
hilfetext: "Danach {{ datum }} im Ticket vermerken.",
|
||
typ: "HAKEN",
|
||
pflicht: true,
|
||
konfig: {},
|
||
},
|
||
],
|
||
},
|
||
],
|
||
};
|
||
const verwendet = platzhalterDerStruktur(struktur);
|
||
expect(verwendet).toContain("hostnmae");
|
||
expect(
|
||
unbekanntePlatzhalter(
|
||
verwendet,
|
||
struktur.variablen.map((v) => v.schluessel),
|
||
),
|
||
).toEqual(["hostnmae"]);
|
||
});
|
||
});
|
||
|
||
describe("Unbenutzte Variablen", () => {
|
||
it("meldet eine Variable, die nirgends vorkommt", () => {
|
||
// Eine definierte Variable, die kein Schritt benutzt, fragt den Techniker
|
||
// beim Start nach etwas, das nie irgendwo auftaucht.
|
||
expect(unbenutzteVariablen(["hostname"], ["os_version", "join_typ"])).toEqual(["os_version", "join_typ"]);
|
||
});
|
||
|
||
it("meldet nichts, wenn jede Variable benutzt wird", () => {
|
||
expect(unbenutzteVariablen(["os_version"], ["os_version"])).toEqual([]);
|
||
});
|
||
});
|