Tests

Alle Suiten laufen gegen eine echte MySQL-8-Datenbank. SQLite gibt es nicht mehr. Jede Suite legt fĂŒr sich eine frische Datenbank
tgt_<pid>_<zufall> an und löscht sie am Ende (tests/lib/mysql.sh).

Server fĂŒr lokale LĂ€ufe

docker run -d --name tlsgate-mysql-test --tmpfs /var/lib/mysql:rw,size=512m \
  -e MYSQL_ROOT_PASSWORD=tgtest-root -p 127.0.0.1:33306:3306 mysql:8.0 \
  --character-set-server=utf8mb4 --collation-server=utf8mb4_0900_ai_ci

Der erste Start zieht das Image (mysql:8.0, rund 1,1 GB; Multi-Arch, lÀuft auch auf Apple Silicon) und initialisiert die Datenbank.
Erst starten, wenn der Server per TCP antwortet. Das offizielle Image startet zur Initialisierung einen Zwischen-Server ohne Netzwerk;
ein Ping ĂŒber den Socket meldet sich dann schon, die Suiten (TCP, Port 33306) bekommen aber noch „connection refused“:

until docker exec tlsgate-mysql-test mysqladmin -h127.0.0.1 --protocol=tcp -uroot -ptgtest-root ping --silent 2>/dev/null; do sleep 2; done

Die Standardwerte der Suiten passen dazu. Anderer Server: TGTEST_DB_HOST, TGTEST_DB_PORT, TGTEST_DB_USER, TGTEST_DB_PASS
(der Benutzer braucht CREATE/DROP DATABASE und alle Rechte auf tgt_*). Der Test-Server ist Wegwerf-Infrastruktur: ein
Admin-Benutzer, tmpfs, nur auf Loopback.

AufrÀumen: docker rm -f tlsgate-mysql-test (Daten liegen im tmpfs und sind damit weg), das Image mit docker rmi mysql:8.0.

Lauf

tests/run_all.sh            # alle Suiten, eine Zeile je Suite, Exit 1 bei rotem Test
bash tests/test_katalog.sh  # eine Suite

Benötigt: PHP ≄ 8.1 mit pdo_mysql, sodium, openssl, mbstring; curl; jq; fĂŒr test_outbox python3 und openssl.

Suiten

Suite PrĂŒft
test_migrate Migrator auf MySQL 8: frische DB, Upgrade aus dem letzten Stand ohne Versionsangabe (Migrationen 2–7), Schema == frisch, Abbruch bei alten CHECK-Regeln, Append-only
test_seed Beispielbestand (bin/seed_cli.php), Katalog unverÀndert, kein Mock-Modus
test_katalog Katalog, Kategorien, Freigaben, Buchungen (CLI und Web)
test_roles ein Szenario je Rolle (readonly, user, group_admin, admin) in zufaellig benannten Gruppen beider Arten (eigen, reseller): Matrix Seite → Mindestrolle/Methode/Gruppenart gegen den Code, Zugriffe 200/403, POST mit CSRF, Rollenwechsel in der Sitzung, lock/disable, Audit
test_auth, test_mfa Login, TOTP, Sperren, Struktur „nur public/ ist Webroot“
test_credentials, test_credentials_ui SOAP-ZugÀnge je Mandant (CLI und Web), kein Klartext in DB/Audit/Ausgaben
test_secrets, test_guard WurzelschlĂŒssel/KDF, wer darf die CLI ausfĂŒhren
test_outbox, test_view, test_qr, test_totp_rfc6238, test_login_instance Deploy-ZIP, View-Hilfen, QR, TOTP, Instanzname
test_sql_portable statisch: kein SQLite-/Fremddialekt, groups immer in Backticks

Eigenheiten von MySQL 8, die die Suiten abdecken

  • groups ist reserviert → immer `groups`.
  • information_schema.CHECK_CONSTRAINTS hat keine Spalte TABLE_NAME; die Klausel steht mit Backslash vor den AnfĂŒhrungszeichen.
  • Trigger brauchen bei aktivem Binlog SET_USER_ID (oder log_bin_trust_function_creators=1), sonst Fehler 1419.
  • json_extract liefert JSON (mit AnfĂŒhrungszeichen, normalisiert) → json_unquote.
  • router.php ist nur der Webserver der Suiten (php -S), keine Betriebsart.