diff -u b/core/modules/user/tests/src/Functional/UserPasswordResetTest.php b/core/modules/user/tests/src/Functional/UserPasswordResetTest.php --- b/core/modules/user/tests/src/Functional/UserPasswordResetTest.php +++ b/core/modules/user/tests/src/Functional/UserPasswordResetTest.php @@ -215,48 +215,65 @@ /** * Tests password reset functionality when user has set preferred language. + * + * @dataProvider languagePrefixTestProvider */ - public function testUserPasswordResetPreferredLanguage() { + public function testUserPasswordResetPreferredLanguage($setPreferredLangcode, $actualPreferredLangcode, $activeLangcode, $prefix, $visitingUrl, $expectedResetUrl, $unexpectedResetUrl) { // Set two new languages. ConfigurableLanguage::createFromLangcode('fr')->save(); ConfigurableLanguage::createFromLangcode('zh-hant')->save(); $this->languageManager = \Drupal::languageManager(); - $default_language_code = $this->languageManager->getDefaultLanguage()->getId(); - - // Test password reset when language prefixes are not set. - $this->assertLanguagePrefixResetUrl('user/password', '/user/reset', "$default_language_code/user/reset"); - // Set language prefixes. $config = $this->config('language.negotiation'); $config->set('url.prefixes', ['en' => '', 'fr' => 'fr', 'zh-hant' => 'zh'])->save(); \Drupal::configFactory()->reset('language.negotiation'); $this->rebuildContainer(); - $this->drupalGet('zh/user/password'); - $this->assertLangcodeDifferent('zh-hant', 'en'); - - // Set preferred language for user account. - $this->account->preferred_langcode = 'fr'; + $this->account->preferred_langcode = $setPreferredLangcode; $this->account->save(); - $this->assertSame('fr', $this->account->getPreferredLangcode()); + $this->assertSame($actualPreferredLangcode, $this->account->getPreferredLangcode(FALSE)); - // Test reset URL respects preferred language over other language settings. - $this->assertLanguagePrefixResetUrl('zh/user/password', '/fr/user/reset', '/zh/user/reset'); - - // Unset preferred language for user account. - $this->account->preferred_langcode = NULL; - $this->account->save(); - $this->assertSame('', $this->account->getPreferredLangcode(FALSE)); - - // Test reset URL respect default language over browser language when - // preferred language is no set. - $this->assertLanguagePrefixResetUrl('zh/user/password', '/user/reset', '/zh/user/reset'); - - // Unset language prefixes. - $config = $this->config('language.negotiation'); - $config->set('url.prefixes', [])->save(); + // Test Default langcode is different from active langcode when visiting different. + if ($setPreferredLangcode !== 'en') { + $this->assertLangcodeDifferent($prefix, $activeLangcode, 'en'); + } + + // Test password reset with language prefixes. + $this->assertLanguagePrefixResetUrl($visitingUrl, $expectedResetUrl, $unexpectedResetUrl); + } + + public function languagePrefixTestProvider() { + return [ + 'Test preferredLanguage not set' => [ + 'setPreferredLangcode' => 'en', + 'actualPreferredLangcode' => 'en', + 'activeLangcode' => 'en', + 'prefix' => '', + 'visitingUrl' => 'user/password', + 'expectedResetUrl' => 'user/reset', + 'unexpectedResetUrl' => 'en/user/reset' + ], + 'Test language prefix set as fr, visiting zh' => [ + 'setPreferredLangcode' => 'fr', + 'actualPreferredLangcode' => 'fr', + 'activeLangcode' => 'fr', + 'prefix' => 'fr', + 'visitingUrl' => 'zh/user/password', + 'expectedResetUrl' => 'fr/user/reset', + 'unexpectedResetUrl' => 'zh/user/reset' + ], + 'Test language prefix set as null, visiting zh' => [ + 'setPreferredLangcode' => 'null', + 'actualPreferredLangcode' => '', + 'activeLangcode' => 'zh-hant', + 'prefix' => 'zh', + 'visitingUrl' => 'zh/user/password', + 'expectedResetUrl' => 'user/reset', + 'unexpectedResetUrl' => 'zh/user/reset' + ], + ]; } /** @@ -282,14 +299,17 @@ /** * Helper method to assert expected active language and - * default lanugage is different. + * default language is different. * + * @param string $prefix + * The prefix to visit /user/password. * @param string $activeLangcode * The active language code of your current session. * @param string $defaultLangcode * The default language code of your site settings. */ - public function assertLangcodeDifferent($activeLangcode, $defaultLangcode) { + public function assertLangcodeDifferent($prefix, $activeLangcode, $defaultLangcode) { + $this->drupalGet( $prefix . '/user/password'); $this->assertSame($activeLangcode, $this->drupalGetHeader('Content-language')); $this->assertSame($defaultLangcode, $this->languageManager->getDefaultLanguage()->getId()); $this->assertNotSame($this->languageManager->getDefaultLanguage()->getId(), $this->drupalGetHeader('Content-language'));