Files
WP-LIT-MCP/tests/Unit/Admin/ConnectionTabTest.php
Jan-Niclas LoosenandClaude Sonnet 5.5 96fa58188b feat(admin): Einstellungsseite überarbeitet, auch für das Handy
Verbindung: Probleme vor der Anleitung. Tools: Suche, Filter, Alle ein-/ausklappen, Zurücksetzen je Gruppe.
Divi-Reiter in Klartext mit Statussymbolen. Rollenhinweise, Hilfe-Tab, Reiter als Raster und Karten auf dem Handy,
Kontrast, Tippflächen, einheitliche Du-Anrede. Bestätigungen über data-lit-mcp-confirm statt Inline-onclick.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 16:36:16 +01:00

106 lines
4.7 KiB
PHP

<?php
declare(strict_types=1);
namespace LIT\MCP\Tests\Unit\Admin;
use Brain\Monkey\Functions;
use LIT\MCP\Admin\ConnectionStatus;
use LIT\MCP\Admin\ConnectionTab;
use LIT\MCP\Tests\Unit\TestCase;
use Mockery;
final class ConnectionTabTest extends TestCase
{
/** @param list<array{label: string, ok: ?bool, message: string}> $checks */
private function render(array $checks): string
{
Functions\stubEscapeFunctions();
Functions\stubTranslationFunctions();
Functions\when('rest_url')->justReturn('https://kunde.de/wp-json/mcp/mcp-oauth-server');
Functions\when('admin_url')->alias(static fn (string $path = ''): string => 'https://kunde.de/wp-admin/' . $path);
Functions\when('add_query_arg')->alias(static fn (array $args, string $url): string => $url . '?' . http_build_query($args));
$status = Mockery::mock(ConnectionStatus::class);
$status->allows('checks')->with(true)->andReturn($checks);
ob_start();
(new ConnectionTab($status))->render();
return (string) ob_get_clean();
}
public function testExplainsTheConnectionAsAnOrderedSequenceLinkingToTheAccessTab(): void
{
$html = $this->render([]);
self::assertStringContainsString('So verbindest du einen KI-Assistenten', $html);
self::assertSame(3, substr_count($html, '<li>'));
self::assertStringContainsString('<ol', $html);
self::assertStringContainsString('MCP-Server (Connector)', $html);
self::assertStringNotContainsString('claude', strtolower($html));
self::assertStringContainsString('href="https://kunde.de/wp-admin/options-general.php?page=lit-mcp&tab=zugriff"', $html);
}
public function testServerUrlIsReadonlyWithACopyButton(): void
{
$html = $this->render([]);
self::assertMatchesRegularExpression(
'#<input[^>]+id="lit-mcp-url"[^>]+readonly[^>]+value="https://kunde.de/wp-json/mcp/mcp-oauth-server"#',
$html
);
self::assertStringContainsString('<label for="lit-mcp-url"', $html);
self::assertStringContainsString(
'<button type="button" class="button lit-mcp-copy hide-if-no-js" data-clipboard-target="#lit-mcp-url">URL kopieren</button>',
$html
);
self::assertStringContainsString('<span class="success hidden" aria-hidden="true">Kopiert!</span>', $html);
}
public function testStatusIsASiteHealthStyleListWithIconsPerState(): void
{
$html = $this->render([
['label' => 'HTTPS', 'ok' => true, 'message' => 'aktiv'],
['label' => 'Discovery', 'ok' => null, 'message' => 'noch nicht geprüft'],
['label' => 'OAuth <b>', 'ok' => false, 'message' => 'deaktiviert'],
]);
self::assertStringNotContainsString('<table', $html);
self::assertStringContainsString('<ul class="lit-mcp-status">', $html);
self::assertMatchesRegularExpression('#dashicons-yes-alt[^<]*"[^>]*></span>.*?HTTPS#s', $html);
self::assertMatchesRegularExpression('#dashicons-warning[^<]*"[^>]*></span>.*?Discovery#s', $html);
self::assertMatchesRegularExpression('#dashicons-dismiss[^<]*"[^>]*></span>.*?OAuth &lt;b&gt;#s', $html);
self::assertStringContainsString('<span class="screen-reader-text">In Ordnung:</span>', $html);
self::assertStringContainsString('<span class="screen-reader-text">Problem:</span>', $html);
self::assertStringContainsString('href="https://kunde.de/wp-admin/site-health.php"', $html);
}
public function testAFailedCheckShowsAboveTheStepsNotOnlyInTheList(): void
{
$html = $this->render([
['label' => 'HTTPS', 'ok' => false, 'message' => 'Die Website läuft ohne HTTPS.'],
['label' => 'Discovery', 'ok' => null, 'message' => 'noch nicht geprüft'],
]);
self::assertStringContainsString('<div class="notice notice-error inline">', $html);
self::assertStringContainsString('<li>HTTPS: Die Website läuft ohne HTTPS.</li>', $html);
self::assertStringNotContainsString('<li>Discovery:', $html);
self::assertLessThan(strpos($html, '<ol class="lit-mcp-steps">'), strpos($html, 'notice-error'));
}
public function testNoProblemNoticeWhenNothingFailed(): void
{
$html = $this->render([['label' => 'HTTPS', 'ok' => true, 'message' => 'aktiv']]);
self::assertStringNotContainsString('notice-error', $html);
}
public function testExplainsWhereTheAssistantMenuIsWithoutNamingAProduct(): void
{
$html = $this->render([]);
self::assertStringContainsString('<details class="lit-mcp-hint"><summary>Wo finde ich das?</summary>', $html);
self::assertStringContainsString('<label for="lit-mcp-url">Server-URL</label>', $html);
}
}