Files
WP-LIT-MCP/tests/Unit/Admin/AdminNoticesTest.php
T
Jan-Niclas LoosenandClaude Fable 5.1 1b73f0652a fix: Admin-UX aus dem Review – Live-Gruppenfeedback, Protokollfilter, Divi-Hinweis, Rollen-Rückfrage
- Tools: „Ganze Gruppe“ und „Nur lesen“ wirken sofort auf die Zeilen
  (Option „wie Gruppe (…)“, gesperrte Selects mit Hinweis), der Server
  bleibt die Wahrheit; Markup trägt die nötigen data-Attribute.
- Protokoll: Filter in eigenem Block über der Tabelle (Core blendet
  .tablenav .actions auf Telefonen aus); „Protokoll leeren“ nur bei
  Einträgen, rechtsbündig, mit Gesamtzahl über ChangeLog::count().
- Divi: Beschreibung unter „Prüfung starten“, Button primär solange
  ungetestet ohne frischen Bericht.
- Zugriff: Rückfrage vor dem Speichern ohne Rolle oder ohne eigene Rolle.
- Verbindung: HTTPS-Hinweis nicht doppelt neben der Statusliste.
- Mobil: breitere Einstellungs-Spalte im Tools-Reiter.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 16:39:44 +02:00

110 lines
4.2 KiB
PHP

<?php
declare(strict_types=1);
namespace LIT\MCP\Tests\Unit\Admin;
use Brain\Monkey\Functions;
use LIT\MCP\Admin\AdminNotices;
use LIT\MCP\Admin\ConnectionStatus;
use LIT\MCP\Tests\Unit\TestCase;
use Mockery;
final class AdminNoticesTest extends TestCase
{
protected function setUp(): void
{
parent::setUp();
Functions\stubTranslationFunctions();
}
/**
* The array shape WPMedia\MCP\OAuth\Auth\Discovery\HealthCheck::build_result()
* stores in its transient for a genuine (not early-return) check — see
* vendor/wp-media/mcp-oauth/inc/Auth/Discovery/HealthCheck.php. Its 'critical'
* internal classification (the acme-challenge fingerprint) is itself reported
* here as 'recommended' (never 'critical') by that class's own downgrade.
*
* @return array<string, mixed>
*/
private function realDiscoveryResult(string $status): array
{
return [
'label' => 'MCP OAuth discovery documents',
'status' => $status,
'badge' => ['label' => 'Configuration', 'color' => 'blue'],
'description' => '<p>The following .well-known discovery document(s) did not respond as expected: '
. 'oauth-protected-resource.</p>',
'actions' => '<p>Check your error/access logs for the requests to these paths…</p>',
'test' => 'wpmedia_mcp_oauth_wellknown_discovery',
];
}
private function status(bool $oauth, ?array $discovery, bool $https, bool $permalinksPretty = true): ConnectionStatus
{
$status = Mockery::mock(ConnectionStatus::class);
$status->allows('oauthEnabled')->andReturn($oauth);
$status->allows('discovery')->with(false)->andReturn($discovery);
$status->allows('https')->andReturn($https);
$status->allows('permalinksPretty')->andReturn($permalinksPretty);
return $status;
}
public function testWarnsAboutDisabledOAuth(): void
{
$messages = (new AdminNotices($this->status(false, null, true)))->messages(false);
self::assertCount(1, $messages);
self::assertStringContainsString('OAuth-Server ist deaktiviert', $messages[0]);
}
public function testWarnsWhenTheCachedDiscoveryStatusIsCriticalOrRecommended(): void
{
foreach (['critical', 'recommended'] as $status) {
$messages = (new AdminNotices($this->status(true, $this->realDiscoveryResult($status), true)))
->messages(false);
self::assertCount(1, $messages, "status={$status}");
self::assertStringContainsString('/.well-known/', $messages[0]);
}
}
public function testGoodCachedDiscoveryNeverWarns(): void
{
$notices = new AdminNotices($this->status(true, $this->realDiscoveryResult('good'), true));
self::assertSame([], $notices->messages(false));
}
public function testDoesNotAddASeparateDiscoveryWarningWhenOAuthIsDisabled(): void
{
// HealthCheck::run_self_check()'s 'disabled' early return always reports status
// 'good' and (like the permalink one below) is never persisted to its transient —
// but we guard on the live oauthEnabled() state too rather than relying on that
// vendor implementation detail. A stale 'critical' result cached from before OAuth
// was disabled must not add a second, redundant notice.
$notices = new AdminNotices($this->status(false, $this->realDiscoveryResult('critical'), true));
$messages = $notices->messages(false);
self::assertCount(1, $messages);
self::assertStringContainsString('OAuth-Server ist deaktiviert', $messages[0]);
}
public function testDoesNotWarnAboutDiscoveryWithoutPrettyPermalinks(): void
{
$notices = new AdminNotices($this->status(true, $this->realDiscoveryResult('recommended'), true, false));
self::assertSame([], $notices->messages(false));
}
public function testHttpsHintOnlyOnTheSettingsPage(): void
{
$notices = new AdminNotices($this->status(true, null, false));
self::assertSame([], $notices->messages(false));
self::assertCount(1, $notices->messages(true));
self::assertSame([], $notices->messages(true, true), 'not where the status list already says it');
}
}