refactor: ToolAvailability ersetzt die sechs Referenz-Closures in Plugin (Frage vor der Verdrahtung wirft statt still false); DiviIntegration bekommt den Tools-Tab-Zustand als Objekt; Plugin::integrations() mit Verdrahtungstest für Reihenfolge, einmaliges Booten und spätes Binden
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
6c59934caa
commit
e6e0f914ba
@@ -0,0 +1,71 @@
|
||||
<?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');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user