isFile()) { continue; } $path = $file->getPathname(); $relative = substr($path, strlen(PLUGIN_ROOT) + 1); if (str_starts_with($relative, '.git/') || str_starts_with($relative, 'tests/')) { continue; } $content = file_get_contents($path) ?: ''; if (preg_match('/placeholder|TODO|FIXME|not implemented|pending_exim_validation|stub/i', $content)) { $bad[] = $relative; } } assert_same([], $bad); }); test('backend script protects custom exim config with rollback and exact section insertion checks', function (): void { $script = file_get_contents(PLUGIN_ROOT . '/scripts/backend.sh') ?: ''; assert_contains('backup_custom_conf()', $script); assert_contains('restore_custom_conf()', $script); assert_contains("trap 'restore_custom_conf' EXIT", $script); assert_contains('ROLLBACK_REBUILD=1', $script); assert_contains('if ! awk -v section="$section" -v snippet="$snippet"', $script); assert_contains('if (inserted != 1)', $script); }); test('lifecycle scripts install cron sync and remove exim integration on uninstall', function (): void { $install = file_get_contents(PLUGIN_ROOT . '/scripts/install.sh') ?: ''; $update = file_get_contents(PLUGIN_ROOT . '/scripts/update.sh') ?: ''; $uninstall = file_get_contents(PLUGIN_ROOT . '/scripts/uninstall.sh') ?: ''; assert_contains('/etc/cron.d/global-autoresponder', $install); assert_contains('sync_directadmin_vacations.php', $install); assert_contains('/etc/cron.d/global-autoresponder', $update); assert_contains('sync_directadmin_vacations.php', $update); assert_contains('backend.sh" da', $uninstall); });