diff --git a/DeskHub-Webseite/tests/plugin_tagesbericht.php b/DeskHub-Webseite/tests/plugin_tagesbericht.php index 361bafdb..08e9387f 100644 --- a/DeskHub-Webseite/tests/plugin_tagesbericht.php +++ b/DeskHub-Webseite/tests/plugin_tagesbericht.php @@ -35,7 +35,8 @@ $state = &plugin_state(); $state['booted'] = false; plugins_boot(); $check(isset(plugin_state()['loaded']['tagesbericht']), 'Plugin wird geladen'); -$check(count(plugin_menu_items(['id' => 1, 'role' => 'admin'])) === 1, 'Menüpunkt für die Einstellungen ist registriert'); +$check(count(plugin_menu_items(['id' => 1, 'role' => 'admin'])) === 2, 'Admin sieht die Einstellungen und „Mein Tagesbericht“'); +$check(count(plugin_menu_items(['id' => 2, 'role' => 'agent', 'permissions' => []])) === 1, 'normaler Mitarbeiter sieht nur „Mein Tagesbericht“'); // ── Daten: zwei Abteilungen, ein Agent sieht nur seine ──────────────────────── $now = '2026-10-15 10:00:00'; @@ -87,6 +88,62 @@ $marker = plugin_setting('tagesbericht', 'last_sent'); plugin_set_setting('tagesbericht', 'last_sent', '2026-10-12'); $check(tagesbericht_tick($pdo, strtotime('2026-10-12 15:00:00')) === 0, 'am selben Tag nicht noch einmal'); +// ── Weniger Mails: Rhythmus, Handlungsbedarf, persönliche Wahl ──────────────── +$cfg0 = tagesbericht_config(); +$check($cfg0['rhythm'] === 'workdays' && $cfg0['only_action'] === true, 'Standard: Werktage und nur bei Handlungsbedarf'); +plugin_set_setting('tagesbericht', 'workdays', '0'); +$check(tagesbericht_config()['rhythm'] === 'daily', 'ältere Einstellung „nicht nur Werktage“ wird zu „täglich“'); +plugin_set_setting('tagesbericht', 'workdays', '1'); +plugin_set_setting('tagesbericht', 'rhythm', 'weekly'); +plugin_set_setting('tagesbericht', 'weekday', '3'); // Mittwoch +plugin_set_setting('tagesbericht', 'last_sent', ''); +tagesbericht_tick($pdo, strtotime('2026-10-12 09:30:00')); // Montag +$check(plugin_setting('tagesbericht', 'last_sent', '') === '', 'wöchentlich (Mittwoch): am Montag wird nicht gesendet'); +tagesbericht_tick($pdo, strtotime('2026-10-14 09:30:00')); // Mittwoch +$check(plugin_setting('tagesbericht', 'last_sent', '') === '2026-10-14', 'wöchentlich (Mittwoch): am Mittwoch wird gesendet'); +plugin_set_setting('tagesbericht', 'rhythm', 'bloedsinn'); +$check(tagesbericht_config()['rhythm'] === 'workdays', 'ungültiger Rhythmus fällt auf Werktage zurück'); +plugin_set_setting('tagesbericht', 'rhythm', 'workdays'); + +$cfgW = tagesbericht_config(); +$quiet = ['open' => 4, 'unassigned' => 0, 'overdue' => 0, 'created' => 1, 'resolved' => 0, 'mine' => 2]; +$busy = ['open' => 4, 'unassigned' => 1, 'overdue' => 0, 'created' => 0, 'resolved' => 0, 'mine' => 0]; +$late = ['open' => 4, 'unassigned' => 0, 'overdue' => 2, 'created' => 0, 'resolved' => 0, 'mine' => 0]; +$none = ['open' => 0, 'unassigned' => 0, 'overdue' => 0, 'created' => 0, 'resolved' => 0, 'mine' => 0]; +$check(!tagesbericht_should_send($cfgW, 'default', $quiet), 'nichts Dringendes: kein Bericht („nur bei Handlungsbedarf“)'); +$check(tagesbericht_should_send($cfgW, 'default', $busy) && tagesbericht_should_send($cfgW, 'default', $late), 'unzugewiesene oder überfällige Tickets: Bericht'); +$check(!tagesbericht_should_send($cfgW, 'default', $none), 'gar nichts da: kein Bericht'); +$check(!tagesbericht_should_send($cfgW, 'urgent', $busy) && tagesbericht_should_send($cfgW, 'urgent', $late), 'persönlich „nur Überfälliges“: nur bei überfälligen Tickets'); +$cfgAll = ['only_action' => false] + $cfgW; +$check(tagesbericht_should_send($cfgAll, 'default', $quiet), 'ohne „nur bei Handlungsbedarf“ kommt der Bericht auch bei normalen offenen Tickets'); +$check(tagesbericht_should_send($cfgW, 'default', $quiet, true), 'Testbericht ignoriert „nur bei Handlungsbedarf“'); +$check(!tagesbericht_should_send($cfgW, 'default', $none, true), 'Testbericht ohne jeden Inhalt wird auch nicht gesendet'); + +$monday = strtotime('2026-10-12 08:00:00'); $tuesday = strtotime('2026-10-13 08:00:00'); +$check(!tagesbericht_pref_allows_today('off', $cfgW, $monday), 'persönlich „gar nicht“: nie'); +$check(tagesbericht_pref_allows_today('weekly', $cfgW, $monday) && !tagesbericht_pref_allows_today('weekly', $cfgW, $tuesday), 'persönlich „wöchentlich“: nur montags'); +$check(tagesbericht_pref_allows_today('default', $cfgW, $tuesday), 'Standard: laut Einstellung des Administrators'); +$check(tagesbericht_pref($eva) === 'default', 'ohne Wahl gilt der Standard'); +$check(tagesbericht_set_pref($eva, 'off') && tagesbericht_pref($eva) === 'off', 'persönliche Wahl speichern'); +$check(!tagesbericht_set_pref($eva, 'unfug') && tagesbericht_pref($eva) === 'off', 'ungültige Wahl wird abgewiesen'); +$check(tagesbericht_set_pref($eva, 'default') && tagesbericht_pref($eva) === 'default', 'zurück auf Standard'); +$check(str_contains(tagesbericht_html($evaRow, $de), 'page=persoenlich'), 'Die Mail verweist auf die persönliche Einstellung'); + +// ── Seiten werden ohne Fehler angezeigt ─────────────────────────────────────── +$_SERVER['REQUEST_METHOD'] = 'GET'; +$render = function (string $file, array $staffRow) use ($pdo): string { + $staff = $staffRow; + ob_start(); + try { include $file; } finally { $out = (string) ob_get_clean(); } + return $out; +}; +$pageDir = $pluginDir . '/tagesbericht/pages/'; +$out = $render($pageDir . 'persoenlich.php', $evaRow); +$check(str_contains($out, 'Mein Tagesbericht') && str_contains($out, 'name="pref"') && substr_count($out, 'type="radio"') === 4, 'Seite „Mein Tagesbericht“ zeigt die vier Auswahlmöglichkeiten'); +$check(str_contains($out, 'checked') && str_contains($out, 'Wie eingestellt'), 'die aktuelle Wahl ist vorgewählt'); +$out = $render($pageDir . 'einstellungen.php', $admin); +$check(str_contains($out, 'name="rhythm"') && str_contains($out, 'name="only_action"') && str_contains($out, 'Mein Tagesbericht'), 'Einstellungsseite zeigt Rhythmus, Handlungsbedarf und den Hinweis auf die persönliche Wahl'); + foreach (scandir($pluginDir) ?: [] as $entry) { if ($entry === '.' || $entry === '..') continue; is_dir($pluginDir . '/' . $entry) ? plugin_rmdir($pluginDir . '/' . $entry) : @unlink($pluginDir . '/' . $entry); diff --git a/DeskHub-Webseite/tests/plugin_website_i18n.php b/DeskHub-Webseite/tests/plugin_website_i18n.php new file mode 100644 index 00000000..a5298f6f --- /dev/null +++ b/DeskHub-Webseite/tests/plugin_website_i18n.php @@ -0,0 +1,79 @@ +, Sprachwahl über Cookie und Adresse, und dass die Verwaltung vollständig übersetzt ist. + */ + +putenv('PLUGIN_SITE_CONFIG=' . sys_get_temp_dir() . '/gibtesnicht.php'); +putenv('PLUGIN_SITE_STORAGE=' . sys_get_temp_dir() . '/deskhub-site-i18n-' . bin2hex(random_bytes(3))); +require_once __DIR__ . '/fixtures/paths.php'; +$siteDir = website_dir_or_skip('plugin_website_i18n'); +require_once $siteDir . '/inc/i18n.php'; + +$failures = []; +$check = function (bool $ok, string $what) use (&$failures): void { + if (!$ok) $failures[] = $what; +}; +$tr = fn(string $html) => site_translate_html($html, 'en'); + +// Einfache Texte, Leerraum bleibt erhalten +$check($tr("
Übersicht & mehr
') === 'Übersicht & mehr
', 'Unbekannter Text bleibt deutsch'); +$check($tr('') === '', 'Knopf wird übersetzt'); +// Attribute +$check($tr('') === '', 'placeholder und title werden übersetzt, value nicht'); +$check($tr('') === '', 'data-confirm wird übersetzt'); +// Muster +$check($tr('2 veröffentlicht') === '2 published', 'Muster mit Zahl'); +$check($tr('0 Downloads') === '0 downloads', 'Muster {#} Downloads'); +$check($tr('aktuell 1.3.0') === 'current 1.3.0', 'Muster mit wechselndem Teil'); +$check($tr('ZIP-Datei mit plugin.json bzw. Theme-CSS
ZIP file with plugin.json or theme CSS
werden übersetzt, bleibt');
+$check($tr('PaketePakete
') === 'PaketePakete
', ', und