renderDashboard(); self::assertStringContainsString( 'notice-error', $output ); self::assertStringContainsString( 'The selected file is not valid JSON.', $output ); } public function test_it_renders_import_success_notices(): void { $_GET['wpcs_imported'] = '1'; $output = $this->renderDashboard(); self::assertStringContainsString( 'notice-success', $output ); self::assertStringContainsString( 'The package JSON file was validated successfully.', $output ); } public function test_it_renders_settings_form_with_nonce_and_escaped_pair_values(): void { $settings = Settings::fromArray( array( 'sync_pairs' => array( array( 'name' => 'Staging', 'source_url' => 'https://example.test', 'destination_url' => 'https://staging.example.test', 'username' => 'codex', ), ), ) ); $output = $this->renderDashboard( $settings ); self::assertStringContainsString( 'action="https://example.test/wp-admin/admin-post.php"', $output ); self::assertStringContainsString( 'name="action" value="wpcs_save_settings"', $output ); self::assertStringContainsString( 'name="wpcs_settings_nonce"', $output ); self::assertStringContainsString( 'Staging', $output ); self::assertStringNotContainsString( 'Staging', $output ); self::assertStringContainsString( 'name="wpcs_settings[sync_pairs][0][application_password]"', $output ); self::assertStringContainsString( 'name="wpcs_settings[sync_pairs][0][url_mappings][0][source]"', $output ); } private function renderDashboard( ?Settings $settings = null ): string { $settings = $settings ?? Settings::fromArray( array() ); ob_start(); include WPCS_PLUGIN_DIR . 'templates/admin/dashboard.php'; return (string) ob_get_clean(); } }