feat: Outline und Knoten zeigen Gruppen-Presets mit Namen

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
Jan-Niclas Loosen
2026-10-18 16:41:42 +02:00
co-authored by Claude Haiku 5.5
parent ca3bbf5ad1
commit c3f08e2d33
7 changed files with 308 additions and 21 deletions
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace LIT\MCP\Tests\Unit\Integrations\Divi\Pages;
use LIT\MCP\Integrations\Divi\Design\DesignSystem;
use LIT\MCP\Integrations\Divi\Design\DesignSystemReader;
use LIT\MCP\Integrations\Divi\Library\LibraryAccess;
use LIT\MCP\Integrations\Divi\Pages\DiviNodeGetAbility;
@@ -25,6 +26,56 @@ final class DiviReadAbilitiesTest extends TestCase
return $reader;
}
/** The stage 4 preset inventory (tests/Fixtures/divi/stage4/presets.json) as the design system reads it. */
private function designWithGroupPresets(): DesignSystemReader
{
$stored = json_decode(DiviFixtures::markup('stage4/presets.json'), true)['stored'];
$reader = Mockery::mock(DesignSystemReader::class);
$reader->allows('read')->andReturn(DesignSystem::fromDivi([], [], $stored, []));
return $reader;
}
public function testOutlineShowsGroupPresetsWithNames(): void
{
DiviFixtures::givenPost(DiviFixtures::markup('stage4/page--designsystem.html'));
$ability = new DiviOutlineAbility(new DiviPageLoader(DiviFixtures::schema()), $this->designWithGroupPresets());
$result = $ability->execute(['post_id' => 7]);
$byId = array_column($result['nodes'], null, 'id');
self::assertSame([], $byId['s0.r0.c0.m1']['group_presets']);
self::assertSame(['[Fixture] Text Hinweis'], $byId['s0.r0.c0.m1']['presets']);
self::assertSame(['font-body: [Fixture] Fließtext'], $byId['s0.r0.c0.m2']['group_presets']);
self::assertSame(['spacing: [Fixture] Abstand Karte'], $byId['s0.r0.c0.m5']['group_presets']);
self::assertStringContainsString(
'{Preset: [Fixture] Blurb Leistung} {Gruppen-Presets: spacing: [Fixture] Abstand Karte}',
$result['outline']
);
self::assertContains('group_presets', $ability->outputSchema()['properties']['nodes']['items']['required']);
}
public function testNodeGetListsGroupPresetsWithGroupAndNames(): void
{
DiviFixtures::givenPost(DiviFixtures::markup('stage4/page--designsystem.html'));
$ability = new DiviNodeGetAbility(new DiviPageLoader(DiviFixtures::schema()), $this->designWithGroupPresets());
$blurb = $ability->execute(['post_id' => 7, 'id' => 's0.r0.c0.m5']);
$plain = $ability->execute(['post_id' => 7, 'id' => 's0.r0.c0.m3']);
self::assertSame(
[[
'group_id' => 'module.decoration.spacing',
'group' => 'spacing',
'presets' => [['id' => 'apzj7e17ok', 'name' => '[Fixture] Abstand Karte']],
]],
$blurb['group_presets']
);
self::assertSame([['id' => 'vdcl6msnuo', 'name' => '[Fixture] Blurb Leistung']], $blurb['presets']);
self::assertSame([], $plain['group_presets']);
self::assertArrayNotHasKey('groupPreset', $blurb['attrs']);
}
public function testOutlineListsNodesWithTreeRevAndPostRev(): void
{
$content = DiviFixtures::markup('synthetic-basic.html');