feat: lit/tb-assign – conditions with dry run on live templates, reattach
- ThemeBuilderAccess::changeableTemplate(): rights (Q18 not_found), group gate, no TB draft, never the default template, current template_rev - omitted exclude_from stays, [] clears (Q3); live dry run shows use_on and exclude_from before/after, overlaps and possible overlaps (B9) - reattach only with published layouts (B10) and a live TB post; always disabled, unmarks template and layouts; failure restores everything Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,7 @@ declare(strict_types=1);
|
||||
namespace LIT\MCP\Tests\Unit\Integrations\Divi\ThemeBuilder;
|
||||
|
||||
use Brain\Monkey\Functions;
|
||||
use LIT\MCP\Integrations\Divi\ThemeBuilder\Template;
|
||||
use LIT\MCP\Integrations\WordPress\PostGuard;
|
||||
use LIT\MCP\Tests\Support\LibraryFixtures;
|
||||
use LIT\MCP\Tests\Support\ThemeBuilderFixtures;
|
||||
@@ -166,4 +167,39 @@ final class ThemeBuilderAccessTest extends TestCase
|
||||
$refusal = ThemeBuilderFixtures::access()->layoutsRefusal(ThemeBuilderFixtures::template());
|
||||
self::assertSame(['layouts.body'], array_keys(self::errorFields($refusal)), 'a footer is no body');
|
||||
}
|
||||
|
||||
public function testChangeableTemplateNeedsRightsNoDraftNoDefaultAndTheCurrentRev(): void
|
||||
{
|
||||
LibraryFixtures::given([ThemeBuilderFixtures::templatePost(1066), ThemeBuilderFixtures::templatePost(1065)]);
|
||||
$store = ThemeBuilderFixtures::store([ThemeBuilderFixtures::template(1065), ThemeBuilderFixtures::template(1066)]);
|
||||
$access = ThemeBuilderFixtures::access([], true, $store);
|
||||
$rev = ThemeBuilderFixtures::template(1066)->rev();
|
||||
|
||||
self::assertInstanceOf(Template::class, $access->changeableTemplate(['template_id' => 1066, 'template_rev' => $rev]));
|
||||
self::assertToolError($access->changeableTemplate(['template_id' => 1066, 'template_rev' => 'alt']), 'rev_mismatch');
|
||||
self::assertToolError(
|
||||
$access->changeableTemplate(['template_id' => 1065, 'template_rev' => ThemeBuilderFixtures::template(1065)->rev()]),
|
||||
'unsupported'
|
||||
);
|
||||
$draft = ThemeBuilderFixtures::access([], true, ThemeBuilderFixtures::store([ThemeBuilderFixtures::template(1066)], 999));
|
||||
self::assertToolError($draft->changeableTemplate(['template_id' => 1066, 'template_rev' => $rev]), 'unsupported');
|
||||
self::assertToolError(
|
||||
ThemeBuilderFixtures::access([], false, $store)->changeableTemplate(['template_id' => 1066, 'template_rev' => $rev]),
|
||||
'forbidden'
|
||||
);
|
||||
}
|
||||
|
||||
/** Ruling Q18: a template the user may not edit answers like a missing one, also for writing. */
|
||||
public function testChangeableTemplateHidesTemplatesTheUserMayNotEdit(): void
|
||||
{
|
||||
$store = ThemeBuilderFixtures::store([ThemeBuilderFixtures::template(1066)]);
|
||||
$rev = ThemeBuilderFixtures::template(1066)->rev();
|
||||
LibraryFixtures::given([ThemeBuilderFixtures::templatePost(1066)], ['edit_post']);
|
||||
$hidden = ThemeBuilderFixtures::access([], true, $store)->changeableTemplate(['template_id' => 1066, 'template_rev' => $rev]);
|
||||
LibraryFixtures::given([]);
|
||||
$missing = ThemeBuilderFixtures::access([], true, $store)->changeableTemplate(['template_id' => 1066, 'template_rev' => $rev]);
|
||||
|
||||
self::assertToolError($hidden, 'not_found');
|
||||
self::assertSame(self::clientError($missing), self::clientError($hidden));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user