diff --git a/core/tests/Drupal/FunctionalTests/Routing/RouteNormalizerTest.php b/core/tests/Drupal/FunctionalTests/Routing/RouteNormalizerTest.php new file mode 100644 index 0000000..f97619c --- /dev/null +++ b/core/tests/Drupal/FunctionalTests/Routing/RouteNormalizerTest.php @@ -0,0 +1,109 @@ +getEditable('system.site') + ->set('page.front', $front_page_path) + ->save(); + $this->drupalGet(Url::fromUri('base:' . $front_page_path)); + $this->assertSame(Url::fromRoute('')->setAbsolute()->toString(), $this->getSession()->getCurrentUrl()); + + // Test path alias redirect. + $this->drupalLogin($this->drupalCreateUser([ + 'administer url aliases', + ])); + $this->drupalGet(Url::fromRoute('path.admin_add')); + $edit = [ + 'source' => '/user/password', + 'alias' => '/my-cool/password/recovery/page', + ]; + $this->submitForm($edit, t('Save')); + $this->drupalGet(Url::fromUri('base:' . $edit['source'])); + $this->assertSame(Url::fromUri('base:' . $edit['alias'])->setAbsolute()->toString(), $this->getSession()->getCurrentUrl()); + + // Test language redirect. + $this->drupalLogin($this->drupalCreateUser([ + 'administer languages', + ])); + // We need more than one language to make the redirect work. + $this->drupalGet(Url::fromRoute('language.add')); + $edit = [ + 'predefined_langcode' => 'fr', + ]; + $this->submitForm($edit, t('Add language')); + $this->drupalGet(Url::fromRoute('language.negotiation')); + $edit = [ + 'language_interface[enabled][language-url]' => 1, + ]; + $this->submitForm($edit, t('Save settings')); + $this->drupalGet(Url::fromRoute('language.negotiation_url')); + $edit = [ + 'language_negotiation_url_part' => LanguageNegotiationUrl::CONFIG_PATH_PREFIX, + 'prefix[en]' => 'en', + 'prefix[fr]' => 'fr', + ]; + $this->submitForm($edit, t('Save configuration')); + $this->rebuildContainer(); + $url = Url::fromUri('base:/admin/config/regional/language')->setAbsolute()->toString(); + $prefix_count = substr_count($url, '/en/'); + $this->drupalGet($url); + $current_url = $this->getSession()->getCurrentUrl(); + $this->assertSame($prefix_count + 1, substr_count($current_url, '/en/'), 'The path prefix of the default language was added to the final URL.'); + $this->assertContains('/admin/config/regional/language', $current_url, 'Path preserved.'); + + // Test a redirect having special characters in source/destination paths. + /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */ + $menu_link_manager = $this->container->get('plugin.manager.menu.link'); + /** @var \Drupal\Core\Menu\MenuLinkInterface $menu_link */ + $menu_link = $menu_link_manager->createInstance('menu_test.exotic_path'); + $exotic_path = rawurldecode($menu_link->getUrlObject()->getInternalPath()); + $this->drupalLogin($this->drupalCreateUser([ + 'administer url aliases', + ])); + $this->drupalGet(Url::fromRoute('path.admin_add')); + $edit = [ + 'source' => '/' . $exotic_path, + 'alias' => '/' . $exotic_path . rawurlencode(rawurlencode('#%&+/?')), + ]; + $this->submitForm($edit, t('Save')); + $this->drupalGet($exotic_path, ['alias' => TRUE]); + $this->assertContains(UrlHelper::encodePath($edit['alias']), $this->getSession()->getCurrentUrl(), 'Redirected to the alias.'); + } + +}