From 9c681aaa35ab6a521a82e515ae36e6add8f864b9 Mon Sep 17 00:00:00 2001
From: James Shields <james@lostcarpark.com>
Date: Mon, 10 Mar 2025 02:20:09 +0000
Subject: [PATCH] Fixes for permission issues.

---
 navigation_extra_tools.post_update.php        |  5 +-
 navigation_extra_tools.routing.yml            |  2 +-
 .../NavigationExtraToolsDevelTest.php         | 69 +++++++++++++++++++
 .../NavigationExtraToolsMenuTest.php          | 17 +----
 4 files changed, 74 insertions(+), 19 deletions(-)
 create mode 100644 tests/src/Functional/NavigationExtraToolsDevelTest.php

diff --git a/navigation_extra_tools.post_update.php b/navigation_extra_tools.post_update.php
index ed56769..dd60185 100644
--- a/navigation_extra_tools.post_update.php
+++ b/navigation_extra_tools.post_update.php
@@ -8,12 +8,13 @@
 use Drupal\user\Entity\Role;
 
 /**
- * Adds the 'access navigation extra tools' permission for relevant roles.
+ * Adds cache flushing and cron permissions for relevant roles.
  */
 function navigation_extra_tools_post_update_update_permissions(): void {
   foreach (Role::loadMultiple() as $role) {
     if ($role->hasPermission('administer site configuration')) {
-      $role->grantPermission('access navigation extra tools')->save();
+      $role->grantPermission('access navigation extra tools cache flushing')->save();
+      $role->grantPermission('access navigation extra tools cron')->save();
     }
   }
 }
diff --git a/navigation_extra_tools.routing.yml b/navigation_extra_tools.routing.yml
index 194abbb..6f8f7ee 100644
--- a/navigation_extra_tools.routing.yml
+++ b/navigation_extra_tools.routing.yml
@@ -4,7 +4,7 @@ navigation_extra_tools.overview:
     _controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
     _title: 'Tools'
   requirements:
-    _permission: 'access navigation extra tools cache flushing+access navigation extra tools cron'
+    _permission: 'access navigation'
 
 navigation_extra_tools.flush:
   path: '/admin/flush'
diff --git a/tests/src/Functional/NavigationExtraToolsDevelTest.php b/tests/src/Functional/NavigationExtraToolsDevelTest.php
new file mode 100644
index 0000000..c467d23
--- /dev/null
+++ b/tests/src/Functional/NavigationExtraToolsDevelTest.php
@@ -0,0 +1,69 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\navigation_extra_tools\Functional;
+
+use Drupal\Tests\BrowserTestBase;
+use Drupal\user\UserInterface;
+
+// cSpell:ignore toolshelp
+
+/**
+ * Test description.
+ *
+ * @group navigation_extra_tools
+ */
+final class NavigationExtraToolsDevelTest extends BrowserTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'navigation_extra_tools',
+    'devel',
+  ];
+
+  /**
+   * A test user with permission to access the administrative toolbar.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected UserInterface $adminUser;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    // Create and log in an administrative user.
+    $this->adminUser = $this->drupalCreateUser([
+      'access navigation',
+      'access administration pages',
+      'administer site configuration',
+    ]);
+    $this->drupalLogin($this->adminUser);
+  }
+
+  /**
+   * Test the Development menu.
+   */
+  public function testDevelopmentMenu(): void {
+    // Test that Development menu now present under Tools.
+    $this->assertSession()->elementExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li[contains(@class, "toolbar-menu__item--level-1")]/button[contains(@class, "toolbar-button")]/span[text() = "Development"]');
+    // Test that "Devel settings" exists as level 2 menu under Tools.
+    $this->assertSession()->elementExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li/ul/li[contains(@class, "toolbar-menu__item--level-2")]/a[contains(@class, "toolbar-menu__link--2") and text() = "Devel settings"]');
+    // Test that "Config editor" exists as level 2 menu under Tools.
+    $this->assertSession()->elementExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li/ul/li[contains(@class, "toolbar-menu__item--level-2")]/a[contains(@class, "toolbar-menu__link--2") and text() = "Config editor"]');
+    // Test that "Reinstall modules" exists as level 2 menu under Tools.
+    $this->assertSession()->elementExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li/ul/li[contains(@class, "toolbar-menu__item--level-2")]/a[contains(@class, "toolbar-menu__link--2") and text() = "Reinstall modules"]');
+    // Test that "Rebuild menu" exists as level 2 menu under Tools.
+    $this->assertSession()->elementExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li/ul/li[contains(@class, "toolbar-menu__item--level-2")]/a[contains(@class, "toolbar-menu__link--2") and text() = "Rebuild menu"]');
+  }
+
+}
diff --git a/tests/src/Functional/NavigationExtraToolsMenuTest.php b/tests/src/Functional/NavigationExtraToolsMenuTest.php
index 77ffe54..48a8001 100644
--- a/tests/src/Functional/NavigationExtraToolsMenuTest.php
+++ b/tests/src/Functional/NavigationExtraToolsMenuTest.php
@@ -25,7 +25,6 @@ final class NavigationExtraToolsMenuTest extends BrowserTestBase {
    * {@inheritdoc}
    */
   protected static $modules = [
-    'navigation',
     'navigation_extra_tools',
   ];
 
@@ -45,7 +44,6 @@ final class NavigationExtraToolsMenuTest extends BrowserTestBase {
     $this->adminUser = $this->drupalCreateUser([
       'access navigation',
       'access administration pages',
-      'administer site configuration',
       'administer software updates',
       'access navigation extra tools cache flushing',
       'access navigation extra tools cron',
@@ -177,22 +175,9 @@ final class NavigationExtraToolsMenuTest extends BrowserTestBase {
   /**
    * Test the Development menu.
    */
-  public function testDevelopmentMenu(): void {
+  public function testDevelopmentMenuNotEnabled(): void {
     // Check Development menu not shown when devel not enabled.
     $this->assertSession()->elementNotExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li[contains(@class, "toolbar-menu__item--level-1")]/button[contains(@class, "toolbar-button")]/span[text() = "Development"]');
-    $success = $this->container->get('module_installer')->install(['devel'], TRUE);
-    $this->assertTrue($success, 'Enabled module devel');
-    $this->drupalGet('admin');
-    // Test that Development menu now present under Tools.
-    $this->assertSession()->elementExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li[contains(@class, "toolbar-menu__item--level-1")]/button[contains(@class, "toolbar-button")]/span[text() = "Development"]');
-    // Test that "Devel settings" exists as level 2 menu under Tools.
-    $this->assertSession()->elementExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li/ul/li[contains(@class, "toolbar-menu__item--level-2")]/a[contains(@class, "toolbar-menu__link--2") and text() = "Devel settings"]');
-    // Test that "Config editor" exists as level 2 menu under Tools.
-    $this->assertSession()->elementExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li/ul/li[contains(@class, "toolbar-menu__item--level-2")]/a[contains(@class, "toolbar-menu__link--2") and text() = "Config editor"]');
-    // Test that "Reinstall modules" exists as level 2 menu under Tools.
-    $this->assertSession()->elementExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li/ul/li[contains(@class, "toolbar-menu__item--level-2")]/a[contains(@class, "toolbar-menu__link--2") and text() = "Reinstall modules"]');
-    // Test that "Rebuild menu" exists as level 2 menu under Tools.
-    $this->assertSession()->elementExists('xpath', '//li[@id="navigation-link-navigation-extra-toolshelp"]/div/ul/li/ul/li[contains(@class, "toolbar-menu__item--level-2")]/a[contains(@class, "toolbar-menu__link--2") and text() = "Rebuild menu"]');
   }
 
 }
-- 
GitLab