fix: Variablen-Detach meldet verbleibende eingebettete Verweise und lehnt Werte mit Verweis, Markup oder leerem Inhalt ab

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Jan-Niclas Loosen
2026-10-19 14:19:41 +02:00
co-authored by Claude Sonnet 5.5
parent e951cc1353
commit 62f8465e60
9 changed files with 303 additions and 35 deletions
@@ -9,6 +9,8 @@ use Closure;
use LIT\MCP\Abilities\WriteFailed;
use LIT\MCP\Integrations\Divi\BlockTree\Block;
use LIT\MCP\Integrations\Divi\BlockTree\GlobalInstance;
use LIT\MCP\Integrations\Divi\BlockTree\Json;
use LIT\MCP\Integrations\Divi\Design\VariableDetachRewrite;
use LIT\MCP\Integrations\Divi\Design\NodeRewrite;
use LIT\MCP\Integrations\Divi\Design\PageRewriter;
use LIT\MCP\Integrations\Divi\Library\GlobalUsages;
@@ -368,6 +370,33 @@ final class PageRewriterTest extends TestCase
self::assertSame(['102'], array_column($this->log->records, 'object_id'));
}
/** V9: a page that only mentions the variable inside a longer text is not saved, but reported as skipped. */
public function testVariableReferencesLeftBehindAreSkippedEvenOnAPageThatIsNotSaved(): void
{
$embedded = '<!-- wp:divi/text ' . Json::encode(['content' => ['innerContent' => ['desktop' => ['value' => 'Ab '
. VariableDetachRewriteTest::ref('gvid-radius0001') . ' Rundung']]]]) . ' /-->';
$whole = '<!-- wp:divi/text ' . Json::encode(['content' => ['innerContent' => ['desktop' => ['value'
=> VariableDetachRewriteTest::ref('gvid-radius0001')]]]]) . ' /-->';
$rewriter = $this->rewriter([
self::page(101, self::layout($embedded)),
self::page(102, self::layout($whole, $embedded)),
]);
$rewrite = static fn (): NodeRewrite => new VariableDetachRewrite('gvid-radius0001', '8px', 'numbers');
$preview = $rewriter->preview(self::query(), $rewrite, null);
$result = $rewriter->apply(self::ABILITY, self::query(), $rewrite, null, self::SUMMARY);
self::assertSame(1, $preview['pages_count']);
self::assertSame(
[101, 102],
array_column($preview['skipped'], 'post_id')
);
self::assertStringStartsWith('s0.r0.c0.m0: Die Variable steht hier eingebettet', $preview['skipped'][0]['reason']);
self::assertStringStartsWith('s0.r0.c0.m1: ', $preview['skipped'][1]['reason']);
self::assertSame([102], array_column($result['saved'], 'post_id'));
self::assertSame([101, 102], array_column($result['skipped'], 'post_id'));
}
/** R8: pages loadWritable() refuses (Divi 4, unparsable – fail-closed candidates) are skipped, not remaining. */
public function testRefusedPagesAreSkippedWithTheLoaderMessage(): void
{