JqueryUiLibraryAssetsTest.php

Same filename in this branch
  1. main core/tests/Drupal/FunctionalTests/Libraries/JqueryUiLibraryAssetsTest.php
Same filename and directory in other branches
  1. 11.x core/tests/Drupal/FunctionalTests/Libraries/JqueryUiLibraryAssetsTest.php
  2. 10 core/tests/Drupal/FunctionalTests/Libraries/JqueryUiLibraryAssetsTest.php
  3. 9 core/tests/Drupal/FunctionalTests/Libraries/JqueryUiLibraryAssetsTest.php

Namespace

Drupal\KernelTests\Core\Libraries

File

core/tests/Drupal/KernelTests/Core/Libraries/JqueryUiLibraryAssetsTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\KernelTests\Core\Libraries;

use Drupal\KernelTests\KernelTestBase;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;

/**
 * Tests the loading of jQuery UI CSS and JS assets.
 */
class JqueryUiLibraryAssetsTest extends KernelTestBase {
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'jqueryui_library_assets_test',
    'system',
  ];
  
  /**
   * The library discovery service.
   *
   * @var \Drupal\Core\Asset\LibraryDiscoveryInterface
   */
  protected $libraryDiscovery;
  
  /**
   * The core libraries that load assets from jQuery UI.
   *
   * @var array
   */
  protected $coreLibrariesWithJqueryUiAssets = [];
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->libraryDiscovery = $this->container
      ->get('library.discovery');
    $core_libraries = $this->libraryDiscovery
      ->getLibrariesByExtension('core');
    // All the core libraries that use jQuery UI assets.
    $libraries_to_check = [
      'internal.jquery_ui',
      'drupal.autocomplete',
      'drupal.dialog',
    ];
    $this->coreLibrariesWithJqueryUiAssets = array_filter($core_libraries, function ($key) use ($libraries_to_check) : bool {
      return in_array($key, $libraries_to_check);
    }, ARRAY_FILTER_USE_KEY);
  }
  
  /**
   * Removes base_url() and query args from file paths.
   *
   * @param string $path
   *   The path being trimmed.
   *
   * @return string
   *   The trimmed path.
   */
  protected function trimFilePath($path) {
    $base_path_position = strpos($path, base_path());
    if ($base_path_position !== FALSE) {
      $path = substr_replace($path, '', $base_path_position, strlen(base_path()));
    }
    $query_pos = strpos($path, '?');
    return $query_pos !== FALSE ? substr($path, 0, $query_pos) : $path;
  }
  
  /**
   * Confirms jQuery UI assets load as expected.
   *
   * Compares the jQuery assets that currently load against a list of the assets
   * that loaded prior to the deprecation of all remaining core jQuery UI
   * libraries.
   *
   * While this is similar to testLibraryAssetLoadingOrder(), it is a separate
   * test so it can be run in a test-only context, thus confirming that asset
   * loading is truly unchanged before and after the deprecations.
   *
   * @param string $library
   *   A pipe delimited list of libraries to check.
   * @param string[] $expected_css
   *   The jQuery UI CSS files expected to load.
   * @param string[] $expected_js
   *   The jQuery UI JavaScript files expected to load.
   */
  public function testAssetLoadingUnchanged(string $library, array $expected_css, array $expected_js) : void {
    $this->drupalGet("jqueryui_library_assets_test/{$library}");
    $this->assertSession()
      ->statusCodeEquals(200);
    // Find all jQuery UI CSS files loaded to the page.
    $css = $this->getSession()
      ->getPage()
      ->findAll('css', 'link[href*="jquery.ui"]');
    $css_loaded_by_page = [];
    foreach ($css as $item) {
      $file = $this->trimFilePath($item->getAttribute('href'));
      $css_loaded_by_page[] = $file;
    }
    $this->assertEmpty(array_diff($css_loaded_by_page, $expected_css));
    // Find all jQuery UI JavaScript files loaded to the page.
    $js = $this->getSession()
      ->getPage()
      ->findAll('css', 'script[src*="jquery.ui"]');
    $js_loaded_by_page = [];
    foreach ($js as $item) {
      $file = $this->trimFilePath($item->getAttribute('src'));
      $js_loaded_by_page[] = $file;
    }
    // assertEmpty() is used instead of assertSame() because we can only test
    // for the presence of assets, not their loading order. The test is designed
    // to pass before and after the jQuery UI asset changes in
    // http://drupal.org/node/3113400, which, by necessity, results in loading
    // order changes.
    $this->assertEmpty(array_diff($js_loaded_by_page, $expected_js));
  }
  
  /**
   * Data provider for confirming jQuery UI assets load as expected.
   *
   * Provides arrays that list how jQuery UI CSS and JavaScript dependencies
   * loaded prior to the change from dependencies to direct asset loading.
   *
   * @return array
   *   An array of test cases, where each test case is an array with the
   *   following values:
   *   - A pipe delimited string of the library/libraries to test.
   *   - An array of the jQuery UI CSS files that loaded for a given library
   *     prior to the change from jQuery UI library dependencies to direct file
   *     inclusion.
   *   - An array of the jQuery UI JavaScript files that loaded for a given
   *     library prior to the change from jQuery UI library dependencies to
   *     direct file inclusion.
   */
  public static function providerTestAssetLoading() : array {
    return [
      'drupal.autocomplete' => [
        'library' => 'drupal.autocomplete',
        'expected_css' => [
          'core/assets/vendor/jquery.ui/themes/base/core.css',
          'core/assets/vendor/jquery.ui/themes/base/menu.css',
          'core/assets/vendor/jquery.ui/themes/base/autocomplete.css',
          'core/assets/vendor/jquery.ui/themes/base/theme.css',
        ],
        'expected_js' => [
          'core/assets/vendor/jquery.ui/ui/data-min.js',
          'core/assets/vendor/jquery.ui/ui/disable-selection-min.js',
          'core/assets/vendor/jquery.ui/ui/form-min.js',
          'core/assets/vendor/jquery.ui/ui/labels-min.js',
          'core/assets/vendor/jquery.ui/ui/jquery-patch-min.js',
          'core/assets/vendor/jquery.ui/ui/scroll-parent-min.js',
          'core/assets/vendor/jquery.ui/ui/unique-id-min.js',
          'core/assets/vendor/jquery.ui/ui/version-min.js',
          'core/assets/vendor/jquery.ui/ui/focusable-min.js',
          'core/assets/vendor/jquery.ui/ui/ie-min.js',
          'core/assets/vendor/jquery.ui/ui/keycode-min.js',
          'core/assets/vendor/jquery.ui/ui/plugin-min.js',
          'core/assets/vendor/jquery.ui/ui/safe-active-element-min.js',
          'core/assets/vendor/jquery.ui/ui/safe-blur-min.js',
          'core/assets/vendor/jquery.ui/ui/widget-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/menu-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/autocomplete-min.js',
        ],
      ],
      'drupal.dialog' => [
        'library' => 'drupal.dialog',
        'expected_css' => [
          'core/assets/vendor/jquery.ui/themes/base/core.css',
          'core/assets/vendor/jquery.ui/themes/base/resizable.css',
          'core/assets/vendor/jquery.ui/themes/base/checkboxradio.css',
          'core/assets/vendor/jquery.ui/themes/base/controlgroup.css',
          'core/assets/vendor/jquery.ui/themes/base/button.css',
          'core/assets/vendor/jquery.ui/themes/base/dialog.css',
          'core/assets/vendor/jquery.ui/themes/base/theme.css',
        ],
        'expected_js' => [
          'core/assets/vendor/jquery.ui/ui/data-min.js',
          'core/assets/vendor/jquery.ui/ui/disable-selection-min.js',
          'core/assets/vendor/jquery.ui/ui/form-min.js',
          'core/assets/vendor/jquery.ui/ui/labels-min.js',
          'core/assets/vendor/jquery.ui/ui/jquery-patch-min.js',
          'core/assets/vendor/jquery.ui/ui/scroll-parent-min.js',
          'core/assets/vendor/jquery.ui/ui/unique-id-min.js',
          'core/assets/vendor/jquery.ui/ui/version-min.js',
          'core/assets/vendor/jquery.ui/ui/focusable-min.js',
          'core/assets/vendor/jquery.ui/ui/keycode-min.js',
          'core/assets/vendor/jquery.ui/ui/plugin-min.js',
          'core/assets/vendor/jquery.ui/ui/safe-active-element-min.js',
          'core/assets/vendor/jquery.ui/ui/safe-blur-min.js',
          'core/assets/vendor/jquery.ui/ui/widget-min.js',
          'core/assets/vendor/jquery.ui/ui/ie-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/mouse-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/draggable-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/resizable-min.js',
          'core/assets/vendor/jquery.ui/ui/form-reset-mixin-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/checkboxradio-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/controlgroup-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/button-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/dialog-min.js',
        ],
      ],
      // A few instances of multiple libraries being checked simultaneously are
      // here to ensure that multiple libraries requesting the same asset does
      // not impact the expected loading order.
'drupal.autocomplete|drupal.dialog' => [
        'library' => 'drupal.autocomplete|drupal.dialog',
        'expected_css' => [
          'core/assets/vendor/jquery.ui/themes/base/core.css',
          'core/assets/vendor/jquery.ui/themes/base/menu.css',
          'core/assets/vendor/jquery.ui/themes/base/autocomplete.css',
          'core/assets/vendor/jquery.ui/themes/base/resizable.css',
          'core/assets/vendor/jquery.ui/themes/base/checkboxradio.css',
          'core/assets/vendor/jquery.ui/themes/base/controlgroup.css',
          'core/assets/vendor/jquery.ui/themes/base/button.css',
          'core/assets/vendor/jquery.ui/themes/base/dialog.css',
          'core/assets/vendor/jquery.ui/themes/base/theme.css',
        ],
        'expected_js' => [
          'core/assets/vendor/jquery.ui/ui/data-min.js',
          'core/assets/vendor/jquery.ui/ui/disable-selection-min.js',
          'core/assets/vendor/jquery.ui/ui/form-min.js',
          'core/assets/vendor/jquery.ui/ui/labels-min.js',
          'core/assets/vendor/jquery.ui/ui/jquery-patch-min.js',
          'core/assets/vendor/jquery.ui/ui/scroll-parent-min.js',
          'core/assets/vendor/jquery.ui/ui/unique-id-min.js',
          'core/assets/vendor/jquery.ui/ui/version-min.js',
          'core/assets/vendor/jquery.ui/ui/focusable-min.js',
          'core/assets/vendor/jquery.ui/ui/keycode-min.js',
          'core/assets/vendor/jquery.ui/ui/plugin-min.js',
          'core/assets/vendor/jquery.ui/ui/safe-active-element-min.js',
          'core/assets/vendor/jquery.ui/ui/safe-blur-min.js',
          'core/assets/vendor/jquery.ui/ui/widget-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/menu-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/autocomplete-min.js',
          'core/assets/vendor/jquery.ui/ui/ie-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/mouse-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/draggable-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/resizable-min.js',
          'core/assets/vendor/jquery.ui/ui/form-reset-mixin-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/checkboxradio-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/controlgroup-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/button-min.js',
          'core/assets/vendor/jquery.ui/ui/widgets/dialog-min.js',
        ],
      ],
    ];
  }

}

Classes

Title Deprecated Summary
JqueryUiLibraryAssetsTest Tests the loading of jQuery UI CSS and JS assets.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.