Quelltext des aktuellen Standes
<?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');
});
};