Quelltext des aktuellen Standes
<?php
declare(strict_types=1);
/**
* Deckt ab, dass im Backend gespeicherte Einstellungen auch ankommen.
*
* Die Einstellungsseite schreibt nach `config/runtime.php`; `public/index.php`
* übernimmt daraus in `$config`. Fehlt ein Schlüssel bei der Übernahme, wird er
* gespeichert, im Formular wieder angezeigt (das liest die Datei direkt) – und
* bleibt trotzdem wirkungslos. Der Fehler ist im Betrieb kaum zu erkennen,
* deshalb wird die Deckung hier festgehalten.
*/
return static function (): void {
$wurzel = dirname(__DIR__);
/** Schlüssel unterhalb von app., die die Einstellungsseite schreibt. */
$geschrieben = static function () use ($wurzel): array {
$src = (string)file_get_contents($wurzel . '/src/Controllers/Admin/SettingsController.php');
preg_match_all('/\$config\[\'app\'\]\[\'([a-z_]+)\'\]\s*=/', $src, $m);
$keys = array_values(array_unique($m[1]));
sort($keys);
return $keys;
};
/** Schlüssel, die index.php aus runtime.php übernimmt (Listen + Einzelfälle). */
$uebernommen = static function () use ($wurzel): array {
$src = (string)file_get_contents($wurzel . '/public/index.php');
$keys = [];
if (preg_match_all('/\$backendApp(?:Strings|Flags)\s*=\s*\[(.*?)\];/s', $src, $listen)) {
foreach ($listen[1] as $block) {
preg_match_all('/\'([a-z_]+)\'/', $block, $k);
$keys = array_merge($keys, $k[1]);
}
}
preg_match_all('/runtimeConfig\[\'app\'\]\[\'([a-z_]+)\'\]/', $src, $einzeln);
$keys = array_values(array_unique(array_merge($keys, $einzeln[1])));
sort($keys);
return $keys;
};
test('Jede gespeicherte App-Einstellung wird auch übernommen', function () use ($geschrieben, $uebernommen) {
$fehlend = array_values(array_diff($geschrieben(), $uebernommen()));
assertSame(
[],
$fehlend,
'Ohne Wirkung gespeichert: ' . implode(', ', $fehlend)
);
});
test('Die Einstellungsseite schreibt überhaupt Schlüssel', function () use ($geschrieben) {
// Sichert die Aussagekraft des Tests: Greift der Ausdruck ins Leere,
// wäre die Prüfung oben trivial erfüllt.
assertTrue(count($geschrieben()) >= 10, 'Nur ' . count($geschrieben()) . ' Schlüssel gefunden');
});
test('Die Übernahme steht in Listen statt in Einzelfällen', function () use ($wurzel) {
// Gesammelte Listen sind der Grund, warum ein neuer Schlüssel nicht mehr
// vergessen wird; zerfielen sie wieder in Einzelabfragen, wäre die
// Deckung oben zwar erfüllt, die Fußangel aber zurück.
$src = (string)file_get_contents($wurzel . '/public/index.php');
assertTrue(str_contains($src, '$backendAppStrings'), 'Liste der Zeichenketten fehlt');
assertTrue(str_contains($src, '$backendAppFlags'), 'Liste der Schalter fehlt');
});
};