justReturn(['primary-menu' => 'Hauptmenü']); Functions\expect('wp_create_nav_menu')->never(); $ability = new MenuCreateAbility(FakeChangeLog::forbidden()); $result = $ability->execute(['name' => 'Neu', 'location' => 'nope']); self::assertSame('lit_validation_failed', $result->get_error_code()); 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::assertSame('lit_validation_failed', $result->get_error_code()); } 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] ); $log = new FakeChangeLog(5); $result = (new MenuCreateAbility($log))->execute(['name' => 'Neu', 'location' => 'primary-menu']); self::assertSame(8, $result['menu_id']); 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::assertSame('lit_forbidden', $ability->permission(['name' => 'Neu'])->get_error_code()); } }