OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

RuntimeSettingsReachTest.php

3 KB
<?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');
    });
};