You are here

class PathProcessorTest in Drupal 10

Same name in this branch
  1. 10 core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php \Drupal\Tests\Core\PathProcessor\PathProcessorTest
  2. 10 core/modules/system/tests/modules/url_alter_test/src/PathProcessorTest.php \Drupal\url_alter_test\PathProcessorTest
Same name and namespace in other branches
  1. 8 core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php \Drupal\Tests\Core\PathProcessor\PathProcessorTest
  2. 9 core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php \Drupal\Tests\Core\PathProcessor\PathProcessorTest

Tests processing of the inbound path.

@group PathProcessor

Hierarchy

  • class \Drupal\Tests\UnitTestCase extends \PHPUnit\Framework\TestCase uses \Drupal\Tests\PhpUnitCompatibilityTrait, \Symfony\Bridge\PhpUnit\ExpectDeprecationTrait, PhpUnitWarnings

Expanded class hierarchy of PathProcessorTest

File

core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php, line 22

Namespace

Drupal\Tests\Core\PathProcessor
View source
class PathProcessorTest extends UnitTestCase {

  /**
   * Configuration for the languageManager stub.
   *
   * @var \Drupal\Core\Language\LanguageInterface[]
   */
  protected $languages;

  /**
   * The language manager stub used to construct a PathProcessorLanguage object.
   *
   * @var \Drupal\language\ConfigurableLanguageManagerInterface|\PHPUnit\Framework\MockObject\MockBuilder
   */
  protected $languageManager;
  protected function setUp() : void {

    // Set up some languages to be used by the language-based path processor.
    $languages = [];
    foreach ([
      'en',
      'fr',
    ] as $langcode) {
      $language = new Language([
        'id' => $langcode,
      ]);
      $languages[$langcode] = $language;
    }
    $this->languages = $languages;

    // Create a stub configuration.
    $language_prefixes = array_keys($this->languages);
    $config = [
      'url' => [
        'prefixes' => array_combine($language_prefixes, $language_prefixes),
      ],
    ];

    // Create a language manager stub.
    $language_manager = $this
      ->getMockBuilder('Drupal\\language\\ConfigurableLanguageManagerInterface')
      ->getMock();
    $language_manager
      ->expects($this
      ->any())
      ->method('getCurrentLanguage')
      ->will($this
      ->returnValue($languages['en']));
    $language_manager
      ->expects($this
      ->any())
      ->method('getLanguages')
      ->will($this
      ->returnValue($this->languages));
    $language_manager
      ->expects($this
      ->any())
      ->method('getLanguageTypes')
      ->will($this
      ->returnValue([
      LanguageInterface::TYPE_INTERFACE,
    ]));
    $this->languageManager = $language_manager;
  }

  /**
   * Tests resolving the inbound path to the system path.
   */
  public function testProcessInbound() {

    // Create an alias manager stub.
    $alias_manager = $this
      ->getMockBuilder(AliasManager::class)
      ->disableOriginalConstructor()
      ->getMock();
    $system_path_map = [
      // Set up one proper alias that can be resolved to a system path.
      [
        '/foo',
        NULL,
        '/user/1',
      ],
      // Passing in anything else should return the same string.
      [
        '/fr/foo',
        NULL,
        '/fr/foo',
      ],
      [
        '/fr',
        NULL,
        '/fr',
      ],
      [
        '/user/login',
        NULL,
        '/user/login',
      ],
    ];
    $alias_manager
      ->expects($this
      ->any())
      ->method('getPathByAlias')
      ->willReturnMap($system_path_map);

    // Create a stub config factory with all config settings that will be checked
    // during this test.
    $config_factory_stub = $this
      ->getConfigFactoryStub([
      'system.site' => [
        'page.front' => '/user/login',
      ],
      'language.negotiation' => [
        'url' => [
          'prefixes' => [
            'fr' => 'fr',
          ],
          'source' => LanguageNegotiationUrl::CONFIG_PATH_PREFIX,
        ],
      ],
    ]);

    // Create a language negotiator stub.
    $negotiator = $this
      ->getMockBuilder('Drupal\\language\\LanguageNegotiatorInterface')
      ->getMock();
    $negotiator
      ->expects($this
      ->any())
      ->method('getNegotiationMethods')
      ->will($this
      ->returnValue([
      LanguageNegotiationUrl::METHOD_ID => [
        'class' => 'Drupal\\language\\Plugin\\LanguageNegotiation\\LanguageNegotiationUrl',
        'weight' => 9,
      ],
    ]));
    $method = new LanguageNegotiationUrl();
    $method
      ->setConfig($config_factory_stub);
    $method
      ->setLanguageManager($this->languageManager);
    $negotiator
      ->expects($this
      ->any())
      ->method('getNegotiationMethodInstance')
      ->will($this
      ->returnValue($method));

    // Create a user stub.
    $current_user = $this
      ->getMockBuilder('Drupal\\Core\\Session\\AccountInterface')
      ->getMock();

    // Create a config event subscriber stub.
    $config_subscriber = $this
      ->getMockBuilder('Drupal\\language\\EventSubscriber\\ConfigSubscriber')
      ->disableOriginalConstructor()
      ->getMock();

    // Create the processors.
    $alias_processor = new AliasPathProcessor($alias_manager);
    $decode_processor = new PathProcessorDecode();
    $front_processor = new PathProcessorFront($config_factory_stub);
    $language_processor = new PathProcessorLanguage($config_factory_stub, $this->languageManager, $negotiator, $current_user, $config_subscriber);

    // First, test the processor manager with the processors in the incorrect
    // order. The alias processor will run before the language processor, meaning
    // aliases will not be found.
    $priorities = [
      1000 => $alias_processor,
      500 => $decode_processor,
      300 => $front_processor,
      200 => $language_processor,
    ];

    // Create the processor manager and add the processors.
    $processor_manager = new PathProcessorManager();
    foreach ($priorities as $priority => $processor) {
      $processor_manager
        ->addInbound($processor, $priority);
    }

    // Test resolving the French homepage using the incorrect processor order.
    $test_path = '/fr';
    $request = Request::create($test_path);
    $processed = $processor_manager
      ->processInbound($test_path, $request);
    $this
      ->assertEquals('/', $processed, 'Processing in the incorrect order fails to resolve the system path from the empty path');

    // Test resolving an existing alias using the incorrect processor order.
    $test_path = '/fr/foo';
    $request = Request::create($test_path);
    $processed = $processor_manager
      ->processInbound($test_path, $request);
    $this
      ->assertEquals('/foo', $processed, 'Processing in the incorrect order fails to resolve the system path from an alias');

    // Now create a new processor manager and add the processors, this time in
    // the correct order.
    $processor_manager = new PathProcessorManager();
    $priorities = [
      1000 => $decode_processor,
      500 => $language_processor,
      300 => $front_processor,
      200 => $alias_processor,
    ];
    foreach ($priorities as $priority => $processor) {
      $processor_manager
        ->addInbound($processor, $priority);
    }

    // Test resolving the French homepage using the correct processor order.
    $test_path = '/fr';
    $request = Request::create($test_path);
    $processed = $processor_manager
      ->processInbound($test_path, $request);
    $this
      ->assertEquals('/user/login', $processed, 'Processing in the correct order resolves the system path from the empty path.');

    // Test resolving an existing alias using the correct processor order.
    $test_path = '/fr/foo';
    $request = Request::create($test_path);
    $processed = $processor_manager
      ->processInbound($test_path, $request);
    $this
      ->assertEquals('/user/1', $processed, 'Processing in the correct order resolves the system path from an alias.');
  }

}

Members

Namesort descending Modifiers Type Description Overrides
PathProcessorTest::$languageManager protected property The language manager stub used to construct a PathProcessorLanguage object.
PathProcessorTest::$languages protected property Configuration for the languageManager stub.
PathProcessorTest::setUp protected function Overrides UnitTestCase::setUp
PathProcessorTest::testProcessInbound public function Tests resolving the inbound path to the system path.
PhpUnitWarnings::$deprecationWarnings private static property Deprecation warnings from PHPUnit to raise with @trigger_error().
PhpUnitWarnings::addWarning public function Converts PHPUnit deprecation warnings to E_USER_DEPRECATED.
UnitTestCase::$randomGenerator protected property The random generator.
UnitTestCase::$root protected property The app root. 1
UnitTestCase::getClassResolverStub protected function Returns a stub class resolver.
UnitTestCase::getConfigFactoryStub public function Returns a stub config factory that behaves according to the passed array.
UnitTestCase::getConfigStorageStub public function Returns a stub config storage that returns the supplied configuration.
UnitTestCase::getContainerWithCacheTagsInvalidator protected function Sets up a container with a cache tags invalidator.
UnitTestCase::getRandomGenerator protected function Gets the random generator for the utility methods.
UnitTestCase::getStringTranslationStub public function Returns a stub translation manager that just returns the passed string.
UnitTestCase::randomMachineName public function Generates a unique random string containing letters and numbers.
UnitTestCase::setUpBeforeClass public static function