fix: PresetComposer liest nur den von der Ability bereinigten Namen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jan-Niclas Loosen
2026-10-16 18:10:47 +02:00
co-authored by Claude Opus 5.5
parent 3d760113ec
commit d5fd1642b8
4 changed files with 41 additions and 8 deletions
@@ -240,6 +240,21 @@ final class DiviPresetsSetAbilityTest extends TestCase
self::assertStringContainsString('1–100 Zeichen', $empty['fields']['items[0].rename']);
}
/** Final review M-5: rename is cleaned by the ability and reaches the composer as the resolved name. */
public function testRenameIsCleanedAndApplied(): void
{
$ability = $this->ability();
$input = ['items' => [['module' => 'button', 'preset' => 'CTA primär', 'rename' => '<b>CTA</b> neu']]];
$dry = self::assertToolError($ability->execute($input), 'confirm_required');
self::assertSame(['changed'], array_column($dry['diff'], 'action'));
$this->snapshots->expects('save')->andReturn('presets-1');
$this->snapshots->expects('attachLog');
self::assertTrue($ability->execute($input + ['confirm' => true, 'design_rev' => $dry['design_rev']])['ok']);
$items = PresetBook::fromDivi($this->stored)->items(new PresetScope('module', 'divi/button'));
self::assertSame('CTA neu', $items['aaaaaaaaaa']['name']);
}
public function testNameAndRenameAreExclusive(): void
{
$ability = $this->ability();
@@ -95,7 +95,7 @@ final class PresetComposerTest extends TestCase
$existing['attrs'] = ['button' => ['decoration' => ['border' => ['desktop' => ['value' => ['radius' => '4px']]]]]];
$result = self::composer()->compose(self::book(), new PresetScope('module', 'divi/button'), $existing, [
'rename' => 'CTA Primär',
'name' => 'CTA Primär',
'attrs' => ['button.decoration.background' => ['desktop' => ['color' => '#000000']]],
], 'items[0]', null);
@@ -105,6 +105,22 @@ final class PresetComposerTest extends TestCase
self::assertSame('4px', $result['item']['attrs']['button']['decoration']['border']['desktop']['value']['radius']);
}
/** Final review M-5: the ability resolves name/rename; the composer only takes "name" as given. */
public function testOnlyTheResolvedNameCounts(): void
{
$existing = self::book()->items(new PresetScope('module', 'divi/button'))['aaaaaaaaaa'];
$kept = self::composer()->compose(self::book(), new PresetScope('module', 'divi/button'), $existing, [
'rename' => 'Ignoriert',
], 'items[0]', null);
$missing = self::composer()->compose(self::book(), new PresetScope('module', 'divi/button'), null, [
'rename' => 'Ignoriert',
], 'items[0]', null);
self::assertSame('CTA primär', $kept['item']['name']);
self::assertSame('Name des neuen Presets fehlt', $missing['errors']['items[0].name']);
}
public function testFromNodeTakesTheDesignButNotTheContent(): void
{
$node = Block::create('divi/button', [