feat: Fähigkeiten theme-option-read/-write und font-upload; ThemeOptionsAdapter und FontCatalog (Manifest, Nachbau customizer-typography, Signatur-Referenzen) und DesignRights::themeOptions()/fonts()

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Jan-Niclas Loosen
2026-10-19 17:44:57 +02:00
co-authored by Claude Sonnet 5.5
parent 8379c55c89
commit a90cd7f5bd
14 changed files with 4765 additions and 26 deletions
@@ -7,7 +7,9 @@ namespace LIT\MCP\Tests\Unit\Integrations\Divi\Design;
use Brain\Monkey\Functions;
use LIT\MCP\Integrations\Divi\Design\DesignRights;
use LIT\MCP\Integrations\Divi\Design\DesignSystemWriter;
use LIT\MCP\Integrations\Divi\Design\FontCatalog;
use LIT\MCP\Integrations\Divi\Design\GlobalVariablesAdapter;
use LIT\MCP\Integrations\Divi\Design\ThemeOptionsAdapter;
use LIT\MCP\Tests\Unit\TestCase;
use Mockery;
@@ -73,4 +75,46 @@ final class DesignRightsTest extends TestCase
$refusal = self::assertToolError(DesignRights::variables($writer, $variables), 'forbidden');
self::assertStringContainsString('Variablen ändern erfordert', $refusal['message']);
}
public function testThemeOptionsNeedEditThemeOptionsAndTheThemeCustomizerRight(): void
{
$writer = Mockery::mock(DesignSystemWriter::class);
// Divi's customizer does not need the Visual Builder (plan 4d, rights).
$writer->expects('canUseVisualBuilder')->never();
$options = Mockery::mock(ThemeOptionsAdapter::class);
$options->allows('canCustomize')->andReturn(true, false);
Functions\when('current_user_can')->alias(static fn (string $cap): bool => $cap === 'edit_theme_options');
self::assertNull(DesignRights::themeOptions($writer, $options));
$refusal = self::assertToolError(DesignRights::themeOptions($writer, $options), 'forbidden');
self::assertStringContainsString('Theme-Anpassung', $refusal['message']);
self::assertStringContainsString('keine Theme-Optionen', $refusal['message']);
self::assertStringContainsString('Rollen-Editor', $refusal['hint']);
Functions\when('current_user_can')->justReturn(false);
$refusal = self::assertToolError(DesignRights::themeOptions($writer, $options), 'forbidden');
self::assertStringContainsString('Theme-Optionen ändern erfordert', $refusal['message']);
self::assertStringContainsString('edit_theme_options', $refusal['message']);
}
public function testFontsNeedUploadFilesEditThemeOptionsAndTheFontsRight(): void
{
$fonts = Mockery::mock(FontCatalog::class);
$fonts->allows('canManage')->andReturn(true, false);
Functions\when('current_user_can')->justReturn(true);
self::assertNull(DesignRights::fonts($fonts));
$refusal = self::assertToolError(DesignRights::fonts($fonts), 'forbidden');
self::assertStringContainsString('Eigene Schriften verwalten', $refusal['message']);
self::assertStringContainsString('Rollen-Editor', $refusal['hint']);
Functions\when('current_user_can')->alias(static fn (string $cap): bool => $cap === 'edit_theme_options');
$refusal = self::assertToolError(DesignRights::fonts($fonts), 'forbidden');
self::assertStringContainsString('upload_files', $refusal['message']);
Functions\when('current_user_can')->alias(static fn (string $cap): bool => $cap === 'upload_files');
$refusal = self::assertToolError(DesignRights::fonts($fonts), 'forbidden');
self::assertStringContainsString('Schriften hochladen erfordert', $refusal['message']);
self::assertStringContainsString('edit_theme_options', $refusal['message']);
}
}