ok " or " FAIL ". * * Usage (inside DDEV): wp eval-file wp-content/plugins/WP-LIT-MCP/tests/Integration/admin-render.php * * No strict_types: wp eval-file runs this through eval(). */ defined('WP_CLI') && WP_CLI || exit; require_once ABSPATH . 'wp-admin/includes/admin.php'; $lit_admins = get_users(['role' => 'administrator', 'number' => 1]); wp_set_current_user($lit_admins[0]->ID); set_current_screen('settings_page_lit-mcp'); // wp eval-file runs without an HTTP request: WP_List_Table (used by the "Protokoll" tab) // reads $_SERVER['HTTP_HOST']/['REQUEST_URI'] directly (no isset() guard in WordPress core), // so a CLI run needs both set to render it, exactly as a real admin request would have them. $_SERVER['HTTP_HOST'] = (string) wp_parse_url(home_url(), PHP_URL_HOST); $lit_page = \LIT\MCP\Plugin::settingsPage(); if ($lit_page === null) { echo "FAIL settings page not built\n"; exit(1); } foreach ($lit_page->tabSlugs() as $lit_slug) { $_GET['tab'] = $lit_slug; $_SERVER['REQUEST_URI'] = '/wp-admin/options-general.php?page=lit-mcp&tab=' . rawurlencode($lit_slug); ob_start(); try { $lit_page->render(); $lit_html = (string) ob_get_clean(); } catch (\Throwable $e) { ob_end_clean(); echo $lit_slug . ' FAIL ' . $e->getMessage() . "\n"; continue; } $lit_ok = str_contains($lit_html, 'nav-tab-active') && preg_match('/class="wrap[ "]/', $lit_html) === 1; echo $lit_slug . ($lit_ok ? ' ok ' : ' FAIL ') . strlen($lit_html) . "\n"; }