Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
72 lines
2.5 KiB
PHP
72 lines
2.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace LIT\MCP\Tests\Unit;
|
|
|
|
use Brain\Monkey\Actions;
|
|
use Brain\Monkey\Filters;
|
|
use Brain\Monkey\Functions;
|
|
use LIT\MCP\Abilities\ExposurePolicy;
|
|
use LIT\MCP\Abilities\ToolAvailability;
|
|
use LIT\MCP\Admin\SettingsPage;
|
|
use LIT\MCP\Integrations\IntegrationRegistry;
|
|
use LIT\MCP\Integrations\WordPress\Schema\ContentSchema;
|
|
use LIT\MCP\Limits;
|
|
use LIT\MCP\Plugin;
|
|
use LIT\MCP\Tests\Support\FakeChangeLog;
|
|
use Mockery;
|
|
|
|
/** The wiring of the composition root: Plugin::integrations() and the steps Plugin::boot() takes with it. */
|
|
final class PluginTest extends TestCase
|
|
{
|
|
private static function registry(ToolAvailability $tools = new ToolAvailability()): IntegrationRegistry
|
|
{
|
|
return Plugin::integrations(
|
|
Mockery::mock(ContentSchema::class),
|
|
FakeChangeLog::forbidden(),
|
|
new Limits(),
|
|
$tools
|
|
);
|
|
}
|
|
|
|
/** Registry order = order of the Tools tab, the guide and the server instructions. */
|
|
public function testIntegrationsInRegistryOrder(): void
|
|
{
|
|
self::assertSame(
|
|
['core', 'wordpress', 'media', 'divi', 'divi-library', 'divi-theme-builder'],
|
|
self::registry()->ids()
|
|
);
|
|
}
|
|
|
|
/** Only the Divi integration has boot steps; a second boot registers nothing twice. */
|
|
public function testTheBootableIntegrationsBootExactlyOnce(): void
|
|
{
|
|
Actions\expectAdded('upgrader_process_complete')->once();
|
|
Actions\expectAdded('rest_api_init')->once();
|
|
Filters\expectAdded(SettingsPage::TABS_FILTER)->once();
|
|
$registry = self::registry();
|
|
|
|
$registry->boot();
|
|
$registry->boot();
|
|
}
|
|
|
|
/**
|
|
* No temporal coupling: building and booting the integrations never asks the Tools-tab state (an unbound
|
|
* ToolAvailability throws when asked); bound afterwards, it answers from the bound policy.
|
|
*/
|
|
public function testTheToolsTabStateIsAskedOnlyAfterBind(): void
|
|
{
|
|
Functions\stubTranslationFunctions();
|
|
$tools = new ToolAvailability();
|
|
$registry = self::registry($tools);
|
|
$registry->boot();
|
|
|
|
$tools->bind($registry, new ExposurePolicy(['@group:divi-library' => ExposurePolicy::DISABLED]));
|
|
|
|
self::assertFalse($tools->groupEnabled('divi-library'));
|
|
self::assertTrue($tools->groupWritable('divi-theme-builder'));
|
|
self::assertFalse($tools->allows('lit/divi-insert'), 'no Divi in unit tests: lit/divi-insert not registered');
|
|
}
|
|
}
|