/** * Tests resolving the inbound path to the system path. */ function testProcessInbound() { // Create an alias manager stub. $alias_manager = $this->getMockBuilder('Drupal\\Core\\Path\\AliasManager')->disableOriginalConstructor()->getMock(); $system_path_map = array(array('/foo', NULL, '/user/1'), array('/fr/foo', NULL, '/fr/foo'), array('/fr', NULL, '/fr'), array('/user/login', NULL, '/user/login')); $alias_manager->expects($this->any())->method('getPathByAlias')->will($this->returnValueMap($system_path_map)); // Create a stub config factory with all config settings that will be checked // during this test. $config_factory_stub = $this->getConfigFactoryStub(array('system.site' => array('page.front' => '/user/login'), 'language.negotiation' => array('url' => array('prefixes' => array('fr' => 'fr'))))); // Create a language negotiator stub. $negotiator = $this->getMockBuilder('Drupal\\language\\LanguageNegotiatorInterface')->getMock(); $negotiator->expects($this->any())->method('getNegotiationMethods')->will($this->returnValue(array(LanguageNegotiationUrl::METHOD_ID => array('class' => 'Drupal\\language\\Plugin\\LanguageNegotiation\\LanguageNegotiationUrl')))); $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 the processors. $alias_processor = new PathProcessorAlias($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); // 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 = array(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 = array(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.'); }