# Prüfskripte (Playwright)

Vier Skripte, die den Shop von außen prüfen. Sie brauchen Playwright und einen
Browser; im Entwicklungssystem liegt beides unter dem Scratchpad der Sitzung:

```bash
export NODE_PATH=/pfad/zu/node_modules
export PLAYWRIGHT_BROWSERS_PATH=/pfad/zu/browsers
node dev/qa/layout-audit.js
```

## layout-audit.js

Ruft 20 Seiten in vier Kombinationen auf (hell/dunkel, 1440 px/390 px) und meldet:

* **Querscrollen** (Seite breiter als das Fenster)
* **helle Flächen im Darkmode** (weiße Kästen, die nicht mitgedreht wurden)
* **kaum lesbaren Text** – Textfarbe zu nah an der Hintergrundfarbe; halbtransparente
  Flächen werden verrechnet, `color(srgb …)` wird gelesen, dekorative Elemente
  (`aria-hidden`) und bewusst weiße Flächen (PayPal-Hinweis, Bildvorschau) sind
  ausgenommen
* **fehlende Bilder**, **JavaScript-Fehler** und **HTTP-Fehler**

Ergebnis steht in `audit.txt` im Arbeitsverzeichnis. Nicht jeder Treffer ist ein
Fehler – gemessen wird grob, geprüft wird von Hand (Kontrastwerte am besten mit
einer gezielten Messung nachrechnen).

## link-check.js

Sammelt die internen Links von 17 Startseiten und prüft jeden Status. Findet
Verweise auf alte Shop-URLs und gelöschte Seiten.

## anrede-check.js

Sucht sichtbaren Text mit Sie-Anrede. Der Shop duzt; Shopwares Standardtexte
siezen, überschrieben werden sie in
`custom/plugins/RiccardoTheme/src/Resources/snippet/riccardo-theme.de.json`.
Die Legaltexte (AGB, Widerrufsbelehrung, Datenschutz) bleiben bewusst in der
Sie-Form – Treffer dort sind gewollt.

## buybox-check.js

Prüft die Buy-Box auf der Artikelseite:

```bash
node dev/qa/buybox-check.js [/artikel-pfad]
```

* **Reihenfolge** – Ausführung vor Preis, Preis vor Kaufzeile, Verfügbarkeit
  danach. Sie steht in genau einer Vorlage
  (`RiccardoTheme/.../component/buy-widget/buy-widget.html.twig`). Das Skript
  merkt, wenn sich wieder ein Plugin dazwischenhängt.
* **Nikotin-Pflichtangabe** – rechtlich gesetzt, kommt aber aus einem
  Plugin-Baustein, den das Theme einbindet. Fällt die Einbindung weg,
  verschwindet der Hinweis lautlos. Genau dafür ist diese Prüfung da.
* **Ein Kaufknopf** – vorher konkurrierten „In den Warenkorb", „Alter
  bestätigen" und „Im Abo bestellen" miteinander.
* **Umschalten Einmalkauf/Abo** ohne JavaScript – es darf immer genau ein
  Formular sichtbar sein.

Rückgabewert 1, wenn etwas abweicht – damit lässt sich das Skript auch
automatisch laufen lassen.
