Skip to content
Snippets Groups Projects
Commit cf8386d0 authored by Kurucz István's avatar Kurucz István
Browse files

Issue #3298837 by nevergone: Improve form settings management.

parent 38be2edc
No related branches found
No related tags found
No related merge requests found
......@@ -45,7 +45,11 @@ class MasqueradeTest extends TestBase {
public function testRedirectingWithMasquerade() {
$message = $this->randomMachineName();
$this->drupalLogin($this->adminUser);
$this->setRedirectConfig('/foobar-example', $message);
$edit = [
'edit-redirect-after-logout-destination' => '/foobar-example',
'edit-redirect-after-logout-message' => $message,
];
$this->setRedirectConfig($edit);
$node = $this->drupalCreateNode([
'type' => 'page',
'title' => 'Node for masquerade test',
......
......@@ -25,30 +25,41 @@ class RedirectTest extends TestBase {
public function testRedirecting() {
$this->drupalLogin($this->adminUser);
$message = $this->randomMachineName();
$edit = [
'edit-redirect-after-logout-message' => $message,
];
// Not redirect authenticated user.
$this->setRedirectConfig($this->authenticatedUser->toUrl('canonical', ['base_url' => ''])->toString());
$edit['edit-redirect-after-logout-destination'] = $this->authenticatedUser->toUrl('canonical', ['base_url' => ''])->toString();
$this->setRedirectConfig($edit);
$this->logoutNotRedirectHelper($this->authenticatedUser, $this->authenticatedUser->toUrl()->toString(), $message);
// Redirect testing with regular user.
// Frontpage.
$this->setRedirectConfig('<front>', $message);
$edit['edit-redirect-after-logout-destination'] = '<front>';
$this->setRedirectConfig($edit);
$this->logoutRedirectHelper($this->regularUser, '/', $message);
// External path.
$this->setRedirectConfig('http://example.com/');
$edit['edit-redirect-after-logout-destination'] = 'http://example.com/';
$this->setRedirectConfig($edit);
$this->logoutRedirectHelper($this->regularUser, 'http://example.com/', '', FALSE);
// External path with token.
$this->setRedirectConfig('http://[site:name].com/');
$edit['edit-redirect-after-logout-destination'] = 'http://[site:name].com/';
$this->setRedirectConfig($edit);
$this->logoutRedirectHelper($this->regularUser, 'http://example.com/', '', FALSE);
// Valid node path.
$this->setRedirectConfig('/foobar-example', $message);
$edit['edit-redirect-after-logout-destination'] = '/foobar-example';
$this->setRedirectConfig($edit);
$this->logoutRedirectHelper($this->regularUser, '/foobar-example', $message);
// Path with token.
$this->setRedirectConfig('/foobar-[site:name]', $message);
$edit['edit-redirect-after-logout-destination'] = '/foobar-[site:name]';
$this->setRedirectConfig($edit);
$this->logoutRedirectHelper($this->regularUser, '/foobar-example', $message);
// Path only token.
$this->setRedirectConfig('[current-user:url]', $message);
$edit['edit-redirect-after-logout-destination'] = '[current-user:url]';
$this->setRedirectConfig( $edit);
$this->logoutRedirectHelper($this->regularUser, $this->regularUser->toUrl('canonical', ['base_url' => ''])->toString(), $message);
// Token with left slash: /[current-user:url] transform to [current-user:url] destination.
$this->setRedirectConfig('/[current-user:url]', $message, NULL, '[current-user:url]');
$edit['edit-redirect-after-logout-destination'] = '/[current-user:url]';
$this->setRedirectConfig($edit, NULL, '[current-user:url]');
$this->logoutRedirectHelper($this->regularUser, $this->regularUser->toUrl('canonical', ['base_url' => ''])->toString(), $message);
}
......@@ -61,7 +72,11 @@ class RedirectTest extends TestBase {
public function testRedirectingWithMessageNewLine() {
$this->drupalLogin($this->adminUser);
$message = "Line 1.\nLine 2.\n\nLine 3.";
$this->setRedirectConfig('/foobar-example', $message);
$edit = [
'edit-redirect-after-logout-destination' => '/foobar-example',
'edit-redirect-after-logout-message' => $message,
];
$this->setRedirectConfig($edit);
$this->logoutRedirectHelper($this->regularUser, '/foobar-example', nl2br($message));
}
}
......@@ -120,7 +120,7 @@ abstract class TestBase extends BrowserTestBase {
* @param \Drupal\user\Entity\User $user
* Tested user.
* @param string $path
* Excepted path.
* Expected path.
* @param string $message
* Given message.
* @param bool $logout_check
......@@ -149,7 +149,7 @@ abstract class TestBase extends BrowserTestBase {
* @param \Drupal\user\Entity\User $user
* Tested user.
* @param string $path
* Not excepted path.
* Not expected path.
* @param string $message
* Given message.
* @param bool $logout_check
......@@ -177,15 +177,15 @@ abstract class TestBase extends BrowserTestBase {
*
* @param string $destination
* Redirect path.
* @param string $message
* Redirect message.
* @param array $edit
* Filled form settings array, include destination.
* @param \Drupal\user\Entity\User|null $account
* Administrator user account.
* @param string|null $given_destination
* Given destination path.
* Use it if you need to change destination, after submit settings form.
*/
protected function setRedirectConfig(string $destination, string $message = '', User $account = NULL, string $given_destination = NULL) {
protected function setRedirectConfig(array $edit = [], User $account = NULL, string $given_destination = NULL) {
if ($account instanceof UserInterface) {
$this->drupalLogin($account);
}
......@@ -193,16 +193,9 @@ abstract class TestBase extends BrowserTestBase {
$this->drupalLogin($this->adminUser);
}
if ($given_destination === NULL) {
$given_destination = $destination;
$given_destination = $edit['edit-redirect-after-logout-destination'];
}
$this->drupalGet('admin/config/system/redirect_after_logout');
$edit = [];
if ($destination !== '') {
$edit['redirect_after_logout_destination'] = $destination;
}
if ($message !== '') {
$edit['edit-redirect-after-logout-message'] = $message;
}
$this->submitForm($edit, 'Save configuration');
// Configuration submitted.
$this->assertSession()
......@@ -211,14 +204,47 @@ abstract class TestBase extends BrowserTestBase {
$this->assertSession()
->addressEquals('admin/config/system/redirect_after_logout');
$config = $this->config('redirect_after_logout.settings');
$this->assertSession()
->fieldValueEquals('edit-redirect-after-logout-destination', $given_destination);
$this::assertEquals($given_destination, $config->get('destination'));
if ($message !== '') {
$this->assertSession()
->fieldValueEquals('edit-redirect-after-logout-message', $message);
$this::assertEquals($message, $config->get('message'));
foreach ($edit as $form_item_key => $form_item_value) {
$config_key = $this->mappingSettingsFormAndConfig($form_item_key);
if ($form_item_key === 'edit-redirect-after-logout-destination') {
$this->assertSession()
->fieldValueEquals($form_item_key, $given_destination);
$this::assertEquals($given_destination, $config->get($config_key));
}
else {
$this->assertSession()
->fieldValueEquals($form_item_key, $form_item_value);
$this::assertEquals($form_item_value, $config->get($config_key));
}
}
}
/**
* Mapping settings form item key (see element #name property) and configuration key.
*
* @param string|NULL $key
* If $reverse is FALSE, then use form item key. If $reverse is TRUE, use configuration item key.
* If value is NULL, function result is a fully mapping array.
*
* @param bool $reverse
* Use configuration item key, instead of the settings form item key.
*
* @return string|array
* If $key value is not NULL, function result is a mapping key. If $key value is NULL,
* result is a fully mapping array.
*/
private function mappingSettingsFormAndConfig(string $key = NULL, bool $reverse = FALSE) {
$mapping = [
'edit-redirect-after-logout-destination' => 'destination',
'edit-redirect-after-logout-message' => 'message',
];
if ($reverse) {
$mapping = array_reverse($mapping);
}
if ($key !== NULL) {
return $mapping[$key];
}
return $mapping;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment