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
groupsist reserviert â immer`groups`.information_schema.CHECK_CONSTRAINTShat keine SpalteTABLE_NAME; die Klausel steht mit Backslash vor den AnfĂŒhrungszeichen.- Trigger brauchen bei aktivem Binlog
SET_USER_ID(oderlog_bin_trust_function_creators=1), sonst Fehler 1419. json_extractliefert JSON (mit AnfĂŒhrungszeichen, normalisiert) âjson_unquote.router.phpist nur der Webserver der Suiten (php -S), keine Betriebsart.