diff --git a/html/modules/custom/reliefweb_entities/tests/src/ExistingSite/RwReportBase.php b/html/modules/custom/reliefweb_entities/tests/src/ExistingSite/RwReportBase.php index 905bdb5e7..f16ebb8d9 100644 --- a/html/modules/custom/reliefweb_entities/tests/src/ExistingSite/RwReportBase.php +++ b/html/modules/custom/reliefweb_entities/tests/src/ExistingSite/RwReportBase.php @@ -4,6 +4,7 @@ namespace Drupal\Tests\reliefweb_entities\ExistingSite; +use Drupal\Core\Session\AccountInterface; use Drupal\node\Entity\Node; use Drupal\taxonomy\Entity\Term; use Drupal\user\Entity\User; @@ -51,4 +52,58 @@ protected function createUserIfNeeded($id, $name, array $extra = []) : User { return $user; } + /** + * Logs in a user using the Mink controlled browser. + * + * If a user is already logged in, then the current user is logged out before + * logging in the specified user. + * + * Note that neither the current user nor the passed-in user object is + * populated with data of the logged in user. If you need full access to the + * user object after logging in, it must be updated manually. If you also need + * access to the plain-text password of the user (set by drupalCreateUser()), + * e.g. to log in the same user again, then it must be re-assigned manually. + * For example: + * @code + * // Create a user. + * $account = $this->drupalCreateUser([]); + * $this->drupalLogin($account); + * // Load real user object. + * $pass_raw = $account->passRaw; + * $account = User::load($account->id()); + * $account->passRaw = $pass_raw; + * @endcode + * + * @param \Drupal\Core\Session\AccountInterface $account + * User object representing the user to log in. + * + * @see drupalCreateUser() + */ + protected function drupalLogin(AccountInterface $account) { + if ($this->loggedInUser) { + $this->drupalLogout(); + } + + if ($this->useOneTimeLoginLinks) { + // Reload to get latest login timestamp. + $storage = \Drupal::entityTypeManager()->getStorage('user'); + /** @var \Drupal\user\UserInterface $accountUnchanged */ + $accountUnchanged = $storage->loadUnchanged($account->id()); + $login = user_pass_reset_url($accountUnchanged) . '/login?destination=user/' . $account->id(); + $this->drupalGet($login); + } + else { + $this->drupalGet(Url::fromRoute('user.login')); + $this->submitForm([ + 'name' => $account->getAccountName(), + 'pass' => $account->passRaw, + ], 'Log in'); + } + + // @see ::drupalUserIsLoggedIn() + $account->sessionId = $this->getSession()->getCookie(\Drupal::service('session_configuration')->getOptions(\Drupal::request())['name']); + + $this->loggedInUser = $account; + $this->container->get('current_user')->setAccount($account); + } }