OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

ProfileDialogsTest.php

4 KB
<?php

declare(strict_types=1);

/**
 * Die beiden Dialoge im Benutzermenü – Benachrichtigungen und Signatur.
 *
 * Beide zeigen dasselbe Formular wie ihre Seite; das Formular liegt einmal als
 * Partial vor. Fällt eine der Verbindungen auseinander, erzeugt das keinen
 * Fehler beim Ausliefern, sondern einen Dialog, der leer bleibt.
 */
return static function (): void {

    $wurzel  = dirname(__DIR__);
    $layout  = (string)file_get_contents($wurzel . '/templates/layouts/main.php');
    $ctrl    = (string)file_get_contents($wurzel . '/src/Controllers/ProfileController.php');

    test('Beide Dialoge haben Auslöser, Hülle und Quelle', function () use ($layout) {
        foreach ([
            ['notifyPrefsTrigger', 'notifyPrefsModal', 'notifyPrefsBody', '/profile/notifications'],
            ['sigPrefsTrigger',    'sigPrefsModal',    'sigPrefsBody',    '/profile/signature'],
        ] as [$ausloeser, $dialog, $koerper, $quelle]) {
            assertTrue(str_contains($layout, 'id="' . $ausloeser . '"'), "Auslöser {$ausloeser} fehlt");
            assertTrue(str_contains($layout, 'id="' . $dialog . '"'), "Dialog {$dialog} fehlt");
            assertTrue(str_contains($layout, 'id="' . $koerper . '"'), "Inhaltsbereich {$koerper} fehlt");
            assertTrue(
                str_contains($layout, "'" . $ausloeser . "', '" . $dialog . "', '" . $koerper . "', '" . $quelle . "'"),
                "Der Dialog {$dialog} wird nicht mit seiner Quelle verbunden"
            );
        }
    });

    test('Ein Öffner für beide statt zweier Kopien', function () use ($layout) {
        assertSame(
            1,
            substr_count($layout, 'function dialogAusMenue('),
            'Der Öffner ist mehrfach vorhanden'
        );
        assertSame(
            2,
            substr_count($layout, 'dialogAusMenue(\''),
            'Nicht genau zwei Dialoge nutzen den Öffner'
        );
    });

    test('Der Server liefert beide Formulare auch als Fragment', function () use ($ctrl) {
        assertSame(
            2,
            substr_count($ctrl, "getString('fragment') === '1'"),
            'Nicht beide Seiten kennen den Fragment-Modus'
        );
        foreach (['profile-notifications-form', 'profile-signature-form'] as $partial) {
            assertTrue(str_contains($ctrl, $partial), "Das Partial {$partial} wird nicht ausgeliefert");
        }
    });

    test('Nach dem Speichern geht es dorthin zurück, wo der Dialog stand', function () use ($ctrl) {
        assertSame(
            2,
            substr_count($ctrl, 'safeLocalReturn('),
            'Nicht beide Speicher-Wege achten auf den Rückweg'
        );
    });

    test('Das Formular gibt es einmal, nicht je Ort erneut', function () use ($wurzel) {
        // Seite und Dialog binden dasselbe Partial ein.
        foreach ([
            'notifications' => 'profile-notifications-form',
            'signature'     => 'profile-signature-form',
        ] as $seite => $partial) {
            $vorlage = (string)file_get_contents($wurzel . '/templates/profile/' . $seite . '.php');
            assertTrue(
                str_contains($vorlage, "partial('" . $partial . "'"),
                "Die Seite {$seite} baut das Formular selbst statt es einzubinden"
            );
            assertTrue(
                str_contains($vorlage, '<form') === false,
                "Die Seite {$seite} führt noch ein eigenes Formular"
            );
        }
    });

    test('Der Signatur-Editor wird an beiden Orten gleich aufgesetzt', function () use ($wurzel, $layout) {
        $skript = (string)file_get_contents($wurzel . '/public/assets/js/profile-signature.js');
        assertTrue(
            str_contains($skript, 'OpenNIT.initSignatureEditor = function (wurzel)'),
            'Der Aufbau nimmt keinen Wurzelknoten entgegen'
        );

        // Der Dialog laedt Stil und Skript erst beim Oeffnen nach.
        assertTrue(str_contains($layout, 'initSignatureEditor(koerper)'), 'Der Dialog setzt den Editor nicht auf');
        assertTrue(str_contains($layout, 'wysiwyg.js'), 'Der Editor wird im Dialog nicht nachgeladen');

        $seite = (string)file_get_contents($wurzel . '/templates/profile/signature.php');
        assertTrue(str_contains($seite, 'initSignatureEditor(document)'), 'Die Seite setzt den Editor nicht auf');
    });
};