Commit b7f9d010 authored by David Suissa's avatar David Suissa
Browse files

Issue #3550604 by dydave: Automated Tests: Added Functional tests for classes...

Issue #3550604 by dydave: Automated Tests: Added Functional tests for classes 'ExtraLinks', 'SearchLinks', 'AdminToolbarToolsHelper' and 'admin_toolbar_tools.module'.
parent ead152da
Loading
Loading
Loading
Loading
Loading
+41 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\admin_toolbar_tools\Constants;

/**
 * Constants for the admin_toolbar_tools module.
 */
final class AdminToolbarToolsConstants {

  /**
   * CSS classes used by default for testing all the added extra links.
   *
   * @var string
   *
   * @see \Drupal\Tests\admin_toolbar_tools\Traits\AdminToolbarToolsEntityCreationTrait:setUp()
   * @see \Drupal\Tests\admin_toolbar_tools\Functional\AdminToolbarToolsExtraLinksCustomTest:setUp()
   */
  const ADMIN_TOOLBAR_TOOLS_EXTRA_LINKS_TEST_CSS_CLASSES = 'toolbar-icon toolbar-icon-admin-toolbar-tools-extra-links';

  /**
   * An array of operation labels for entity bundles.
   *
   * @var array<string>
   *
   * @see \Drupal\Tests\admin_toolbar_tools\Functional\AdminToolbarToolsExtraLinksTest::assertToolbarMenuContentEntityBundleLinks()
   * @see \Drupal\Tests\admin_toolbar_tools\Functional\AdminToolbarToolsExtraLinksTest::assertSearchLinksControllerResponse()
   */
  const ENTITY_BUNDLE_OPERATIONS_LABELS = [
    // The operation labels for entity types using 'field_ui' operations.
    'fields' => 'Manage fields',
    'form-display' => 'Manage form display',
    'display' => 'Manage display',
    'permissions' => 'Manage permissions',
    'delete' => 'Delete',
    // The operation labels for entity types using 'menu_ui' operations.
    'add' => 'Add link',
  ];

}
+208 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\Tests\admin_toolbar_tools\Functional;

use Drupal\admin_toolbar_tools\Constants\AdminToolbarToolsConstants;
use Drupal\Tests\admin_toolbar\Traits\AdminToolbarHelperTestTrait;
use Drupal\Tests\BrowserTestBase;

/**
 * Test the Admin Toolbar Tools extra links custom links.
 *
 * Additional links provided by Admin Toolbar Tools module's 'ExtraLinks' class
 * that could not be tested in the 'AdminToolbarToolsExtraLinksTest' class, such
 * as those related with the 'config', 'field_ui' or 'language' modules.
 *
 * @see \Drupal\admin_toolbar_tools\Plugin\Derivative\ExtraLinks
 * @see \Drupal\Tests\admin_toolbar_tools\Functional\AdminToolbarToolsExtraLinksTest
 *
 * @group admin_toolbar
 * @group admin_toolbar_tools
 */
class AdminToolbarToolsExtraLinksCustomTest extends BrowserTestBase {

  use AdminToolbarHelperTestTrait;

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'admin_toolbar',
    'admin_toolbar_tools',
    // Modules required for the test.
    'config',
    'field_ui',
    'language',
  ];

  /**
   * A user with the necessary permissions to access the links to be tested.
   *
   * @var \Drupal\user\UserInterface
   */
  protected $adminUser;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    // Set the default CSS class used for testing links in the admin toolbar.
    $this->testAdminToolbarDefaultLinkCssClass = AdminToolbarToolsConstants::ADMIN_TOOLBAR_TOOLS_EXTRA_LINKS_TEST_CSS_CLASSES;

    /* Setup users for the tests. */

    // Permissions to access the toolbar and site's configuration admin pages.
    $permissions = [
      'access toolbar',
      'access administration pages',
      'administer site configuration',
      // Test display modes links.
      'administer display modes',
      // Test languages links.
      'administer languages',
      // Test themes links.
      'administer themes',
      // Test configuration management links.
      'export configuration',
      'import configuration',
      'synchronize configuration',
      // Test user displays and fields.
      'administer account settings',
      'administer user display',
      'administer user fields',
      'administer user form display',
    ];
    // Create in an administrative user.
    $this->adminUser = $this->drupalCreateUser($permissions);
  }

  /**
   * Test Admin Toolbar Tools custom extra links.
   *
   * Login as an admin user and check the custom extra links related with:
   * - Module 'field_ui': Display modes links.
   * - Themes: Theme settings and individual themes.
   * - Module 'language': Language links, add language and detection.
   * - Module 'config': Import and Export links.
   * - Module 'user': Account settings links: user fields and displays.
   *   Additional check for the 'Logout' link with a token in the Tools menu.
   *
   * @see \Drupal\admin_toolbar_tools\Plugin\Derivative\ExtraLinks::getDerivativeDefinitions()
   */
  public function testAdminToolbarToolsExtraLinksCustom(): void {
    // Log in as an admin user to test admin pages.
    $this->drupalLogin($this->adminUser);

    // Test the custom extra links provided by the module that could not be
    // tested in the main 'AdminToolbarToolsExtraLinksTest' class.
    $custom_extra_links = [
      // Test integration with 'field_ui' display and form modes: Check all the
      // links displayed under 'Structure' > 'Display modes'.
      [
        'url' => 'admin/structure/display-modes',
        'text' => 'Display modes',
        'css_classes' => 'toolbar-icon toolbar-icon-field-ui-display-mode',
      ],
      [
        'url' => 'admin/structure/display-modes/form',
        'text' => 'Form modes',
        'position' => 1,
        'css_classes' => 'toolbar-icon toolbar-icon-entity-entity-form-mode-collection',
      ],
      [
        'url' => 'admin/structure/display-modes/view',
        'text' => 'View modes',
        'position' => 2,
        'css_classes' => 'toolbar-icon toolbar-icon-entity-entity-view-mode-collection',
      ],
      [
        'url' => 'admin/structure/display-modes/form/add',
        'text' => 'Add form mode',
      ],
      [
        'url' => 'admin/structure/display-modes/view/add',
        'text' => 'Add view mode',
      ],
      // Themes: Check all the links displayed under 'Appearance'.
      [
        'url' => 'admin/appearance/settings',
        'text' => 'Settings',
        'position' => 1,
      ],
      [
        'url' => 'admin/appearance/settings/stark',
        'text' => 'Stark',
        'position' => 1,
      ],
      // Test integration with 'language': Check the links added by the module
      // that should be under 'Configuration' > 'Regional' > 'Languages'.
      [
        'url' => 'admin/config/regional/language/add',
        'text' => 'Add language',
        'position' => 1,
      ],
      [
        'url' => 'admin/config/regional/language/detection',
        'text' => 'Detection and selection',
        'position' => 2,
      ],
      // Test integration with 'config': 'Import' and 'Export' links.
      [
        'url' => 'admin/config/development/configuration/full/import',
        'text' => 'Import',
        'position' => 1,
      ],
      [
        'url' => 'admin/config/development/configuration/full/export',
        'text' => 'Export',
        'position' => 2,
      ],
      // Test integration with 'user' entity admin pages: Check all the links
      // displayed under 'Configuration' > 'People' > 'Accounts settings'.
      [
        'url' => 'admin/config/people/accounts',
        'text' => 'Account settings',
        'position' => 1,
        'css_classes' => 'toolbar-icon toolbar-icon-entity-user-admin-form',
      ],
      [
        'url' => 'admin/config/people/accounts/fields',
        'text' => 'Manage fields',
        'position' => 1,
      ],
      [
        'url' => 'admin/config/people/accounts/form-display',
        'text' => 'Manage form display',
        'position' => 2,
      ],
      [
        'url' => 'admin/config/people/accounts/display',
        'text' => 'Manage display',
        'position' => 3,
      ],
    ];

    // Check all the custom extra links are found in the admin toolbar menu with
    // expected text, URL, position and CSS classes.
    foreach ($custom_extra_links as $link) {
      $this->assertAdminToolbarMenuLinkExists($link['url'], $link['text'], $link['position'] ?? 0, $link['css_classes'] ?? '');
    }

    // The user 'Logout' link contains a randomly generated token, so a contains
    // css condition '*=' has to be used instead of an 'end-with' '$='. Check
    // the link is found at the 4th position.
    $this->assertSession()
      // cSpell:ignore linksuser
      ->elementExists('css', 'div[id="' . $this->testAdminToolbarHtmlIds['admin_tray'] . '"] li:nth-child(4)[class*="menu-item"] a:contains("Logout")[href*="/user/logout"][class*="toolbar-icon-admin-toolbar-tools-extra-linksuser-logout"]');
  }

}
+638 −0

File added.

Preview size limit exceeded, changes collapsed.

+634 −0

File added.

Preview size limit exceeded, changes collapsed.

+0 −235
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\Tests\admin_toolbar\Functional;

use Drupal\Tests\admin_toolbar\Traits\AdminToolbarHelperTestTrait;
use Drupal\Tests\BrowserTestBase;
use Drupal\media\Entity\MediaType;
use Drupal\system\Entity\Menu;

/**
 * Tests Admin Toolbar tools functionality.
 *
 * @group admin_toolbar
 */
class AdminToolbarToolsSortTest extends BrowserTestBase {

  use AdminToolbarHelperTestTrait;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'admin_toolbar',
    'admin_toolbar_tools',
    'menu_ui',
    'media',
    'field_ui',
  ];

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

  /**
   * A test user with permission to access the administrative toolbar.
   *
   * @var \Drupal\user\UserInterface
   */
  protected $adminUser;

  /**
   * Tests that menu updates on entity add/update/delete.
   *
   * @return void
   *   Nothing to return.
   */
  public function testMenuUpdate() {

    // Create and log in an administrative user.
    $this->adminUser = $this->drupalCreateUser([
      'access toolbar',
      'access administration pages',
      'administer site configuration',
      'administer menu',
      'access media overview',
      'administer media',
      'administer media fields',
      'administer media form display',
      'administer media display',
      'administer media types',
    ]);
    $this->drupalLogin($this->adminUser);

    $menu = Menu::create([
      'id' => 'armadillo',
      'label' => 'Armadillo',
    ]);
    $menu->save();

    $this->container->get('plugin.manager.menu.link')->rebuild();
    $this->drupalGet('/admin');

    // Assert that special menu items are present in the HTML.
    $this->assertSession()->responseContains('class="toolbar-icon toolbar-icon-admin-toolbar-tools-flush"');

    // Assert that adding a media type adds it to the admin toolbar.
    $chinchilla_media_type = MediaType::create([
      'id' => 'chinchilla',
      'label' => 'Chinchilla',
      'source' => 'image',
    ]);
    $chinchilla_media_type->save();
    $this->drupalGet('/admin');
    $this->assertAdminToolbarMenuLinkExists('admin/structure/media/manage/chinchilla', 'Chinchilla');

    // Assert that adding a menu adds it to the admin toolbar.
    $menu = Menu::create([
      'id' => 'chupacabra',
      'label' => 'Chupacabra',
    ]);
    $menu->save();
    $this->drupalGet('/admin');
    $this->assertAdminToolbarMenuLinkExists('admin/structure/menu/manage/chupacabra', 'Chupacabra');

    // Assert that deleting a menu removes it from the admin toolbar.
    $this->assertAdminToolbarMenuLinkExists('admin/structure/menu/manage/armadillo', 'Armadillo');
    $menu = Menu::load('armadillo');
    $menu->delete();
    $this->drupalGet('/admin');
    $this->assertAdminToolbarMenuLinkNotExists('armadillo');

    // Assert that deleting a content entity bundle removes it from admin menu.
    $this->assertAdminToolbarMenuLinkExists('admin/structure/media/manage/chinchilla', 'Chinchilla');
    $chinchilla_media_type = MediaType::load('chinchilla');
    $chinchilla_media_type->delete();
    $this->drupalGet('/admin');
    $this->assertAdminToolbarMenuLinkNotExists('chinchilla');
  }

  /**
   * Tests sorting of menus by label rather than machine name.
   *
   * @return void
   *   Nothing to return.
   */
  public function testMenuSorting() {

    // Create and log in an administrative user.
    $this->adminUser = $this->drupalCreateUser([
      'access toolbar',
      'access administration pages',
      'administer site configuration',
      'administer menu',
    ]);

    $menus = [
      'aaa' => 'qqq',
      'bbb' => 'ppp',
      'ccc' => 'ooo',
      'ddd' => 'nnn',
      'eee' => 'mmm',
      'fff' => 'lll',
      'ggg' => 'kkk',
      'hhh' => 'jjj',
      'iii' => 'iii',
      'jjj' => 'hhh',
      'kkk' => 'ggg',
      'lll' => 'fff',
      'mmm' => 'eee',
      'nnn' => 'ddd',
      'ooo' => 'ccc',
      'ppp' => 'bbb',
      'qqq' => 'aaa',
    ];

    foreach ($menus as $machine_name => $label) {
      $menu = Menu::create([
        'id' => $machine_name,
        'label' => $label,
      ]);
      $menu->save();
    }

    $this->drupalLogin($this->adminUser);

    $this->container->get('plugin.manager.menu.link')->rebuild();
    $this->drupalGet('/admin');

    $results = $this->getSession()->getPage()->findAll('xpath', '//a[contains(@href, "/admin/structure/menu/manage")]');

    $links = [];
    foreach ($results as $result) {
      $links[] = $result->getAttribute('href');
    }

    $expected = [
      0 => '/admin/structure/menu/manage/qqq',
      1 => '/admin/structure/menu/manage/qqq/add',
      2 => '/admin/structure/menu/manage/qqq/delete',
      3 => '/admin/structure/menu/manage/admin',
      4 => '/admin/structure/menu/manage/admin/add',
      5 => '/admin/structure/menu/manage/ppp',
      6 => '/admin/structure/menu/manage/ppp/add',
      7 => '/admin/structure/menu/manage/ppp/delete',
      8 => '/admin/structure/menu/manage/ooo',
      9 => '/admin/structure/menu/manage/ooo/add',
      10 => '/admin/structure/menu/manage/ooo/delete',
      11 => '/admin/structure/menu/manage/nnn',
      12 => '/admin/structure/menu/manage/nnn/add',
      13 => '/admin/structure/menu/manage/nnn/delete',
      14 => '/admin/structure/menu/manage/mmm',
      15 => '/admin/structure/menu/manage/mmm/add',
      16 => '/admin/structure/menu/manage/mmm/delete',
      17 => '/admin/structure/menu/manage/lll',
      18 => '/admin/structure/menu/manage/lll/add',
      19 => '/admin/structure/menu/manage/lll/delete',
      20 => '/admin/structure/menu/manage/footer',
      21 => '/admin/structure/menu/manage/footer/add',
      22 => '/admin/structure/menu/manage/kkk',
      23 => '/admin/structure/menu/manage/kkk/add',
      24 => '/admin/structure/menu/manage/kkk/delete',
      25 => '/admin/structure/menu/manage/jjj',
      26 => '/admin/structure/menu/manage/jjj/add',
      27 => '/admin/structure/menu/manage/jjj/delete',
      28 => '/admin/structure/menu/manage/iii',
      29 => '/admin/structure/menu/manage/iii/add',
      30 => '/admin/structure/menu/manage/iii/delete',
      31 => '/admin/structure/menu/manage/hhh',
      32 => '/admin/structure/menu/manage/hhh/add',
      33 => '/admin/structure/menu/manage/hhh/delete',
      34 => '/admin/structure/menu/manage/ggg',
      35 => '/admin/structure/menu/manage/ggg/add',
      36 => '/admin/structure/menu/manage/ggg/delete',
      37 => '/admin/structure/menu/manage/fff',
      38 => '/admin/structure/menu/manage/fff/add',
      39 => '/admin/structure/menu/manage/fff/delete',
      40 => '/admin/structure/menu/manage/main',
      41 => '/admin/structure/menu/manage/main/add',
      42 => '/admin/structure/menu/manage/eee',
      43 => '/admin/structure/menu/manage/eee/add',
      44 => '/admin/structure/menu/manage/eee/delete',
      45 => '/admin/structure/menu/manage/ddd',
      46 => '/admin/structure/menu/manage/ddd/add',
      47 => '/admin/structure/menu/manage/ddd/delete',
      48 => '/admin/structure/menu/manage/ccc',
      49 => '/admin/structure/menu/manage/ccc/add',
      50 => '/admin/structure/menu/manage/ccc/delete',
      51 => '/admin/structure/menu/manage/bbb',
      52 => '/admin/structure/menu/manage/bbb/add',
      53 => '/admin/structure/menu/manage/bbb/delete',
      54 => '/admin/structure/menu/manage/aaa',
      55 => '/admin/structure/menu/manage/aaa/add',
      56 => '/admin/structure/menu/manage/aaa/delete',
    ];

    foreach ($links as $key => $link) {
      // Using assert contains because prefaces the urls with "/subdirectory".
      $this->assertStringContainsString($expected[$key], $link);
    }
  }

}
Loading