Files

75 lines
2.9 KiB
PHP

<?php
declare(strict_types=1);
namespace LIT\MCP\Tests\Unit\Integrations\WordPress\Menus;
use Brain\Monkey\Functions;
use LIT\MCP\Integrations\WordPress\Menus\MenuCreateAbility;
use LIT\MCP\Tests\Support\FakeChangeLog;
use LIT\MCP\Tests\Unit\TestCase;
use WP_Error;
final class MenuCreateAbilityTest extends TestCase
{
public function testUnknownLocationIsRejectedBeforeCreating(): void
{
Functions\when('get_registered_nav_menus')->justReturn(['primary-menu' => 'Hauptmenü']);
Functions\expect('wp_create_nav_menu')->never();
$ability = new MenuCreateAbility(FakeChangeLog::forbidden());
$result = $ability->execute(['name' => 'Neu', 'location' => 'nope']);
self::assertToolError($result, 'validation_failed');
self::assertStringContainsString('primary-menu', $result->get_error_message());
}
public function testExistingNameIsAValidationError(): void
{
Functions\when('wp_create_nav_menu')->justReturn(
new WP_Error('menu_exists', 'Der Menüname existiert bereits.')
);
$result = (new MenuCreateAbility(FakeChangeLog::forbidden()))->execute(['name' => 'Hauptmenü']);
self::assertToolError($result, 'validation_failed');
}
public function testCreatesAndAssignsTheLocation(): void
{
Functions\when('get_registered_nav_menus')->justReturn(['primary-menu' => 'Hauptmenü']);
Functions\expect('wp_create_nav_menu')->once()->with('Neu')->andReturn(8);
Functions\when('get_nav_menu_locations')->justReturn(['footer-menu' => 2]);
Functions\expect('set_theme_mod')->once()->with(
'nav_menu_locations',
['footer-menu' => 2, 'primary-menu' => 8]
);
Functions\expect('wp_get_nav_menu_items')->once()->with(8)->andReturn([]);
$log = new FakeChangeLog(5);
$result = (new MenuCreateAbility($log))->execute(['name' => 'Neu', 'location' => 'primary-menu']);
self::assertSame(8, $result['menu_id']);
// Trial: the first lit/menu-set-items needs no lit/menu-get just for the lock.
self::assertSame(\LIT\MCP\Abilities\Rev::ofMenu([]), $result['menu_rev']);
self::assertContains('menu_rev', (new MenuCreateAbility($log))->outputSchema()['required']);
self::assertSame('created', $result['changed'][0]['action']);
self::assertSame(5, $result['log_id']);
$log->assertRecorded([
'ability' => 'lit/menu-create',
'object_type' => 'nav_menu',
'object_id' => '8',
'summary' => 'Menü "Neu" angelegt (Position primary-menu)',
]);
}
public function testPermissionNeedsThemeOptionRights(): void
{
Functions\when('current_user_can')->justReturn(false);
$ability = new MenuCreateAbility(FakeChangeLog::forbidden());
self::assertToolError($ability->permission(['name' => 'Neu']), 'forbidden');
}
}