You are here

public function TempStorageTest::testLocking in Rules 8.3

Tests that editing a rule locks it for another user.

File

tests/src/Functional/TempStorageTest.php, line 29

Class

TempStorageTest
Tests that editing a rule locks it for another user.

Namespace

Drupal\Tests\rules\Functional

Code

public function testLocking() {

  // Create a rule with the first user.
  $account_1 = $this
    ->drupalCreateUser([
    'administer rules',
  ]);
  $this
    ->drupalLogin($account_1);
  $this
    ->drupalGet('admin/config/workflow/rules');
  $this
    ->clickLink('Add reaction rule');
  $this
    ->fillField('Label', 'Test rule');
  $this
    ->fillField('Machine-readable name', 'test_rule');
  $this
    ->fillField('React on event', 'rules_entity_insert:node');
  $this
    ->pressButton('Save');
  $this
    ->clickLink('Add condition');
  $this
    ->fillField('Condition', 'rules_node_is_promoted');
  $this
    ->pressButton('Continue');
  $this
    ->fillField('context_definitions[node][setting]', 'node');
  $this
    ->pressButton('Save');

  /** @var \Drupal\Tests\WebAssert $assert */
  $assert = $this
    ->assertSession();
  $assert
    ->pageTextContains('You have unsaved changes.');

  // Now check with the second user that the rule is being edited and locked.
  $account_2 = $this
    ->drupalCreateUser([
    'administer rules',
  ]);
  $this
    ->drupalLogin($account_2);
  $this
    ->drupalGet('admin/config/workflow/rules/reactions/edit/test_rule');
  $assert
    ->pageTextContains('This rule is being edited by user ' . $account_1
    ->getDisplayName() . ', and is therefore locked from editing by others.');
  $this
    ->pressButton('Cancel');
  $assert
    ->pageTextNotContains('Canceled.');
  $assert
    ->pageTextContains('This rule is being edited by user ' . $account_1
    ->getDisplayName() . ', and is therefore locked from editing by others.');
  $this
    ->pressButton('Save');
  $assert
    ->pageTextNotContains('Reaction rule Test rule has been updated.');
  $assert
    ->pageTextContains('This rule is being edited by user ' . $account_1
    ->getDisplayName() . ', and is therefore locked from editing by others.');
  $this
    ->clickLink('Edit');
  $current_url = $this
    ->getSession()
    ->getCurrentUrl();
  $this
    ->pressButton('Save');
  $this
    ->assertEquals($current_url, $this
    ->getSession()
    ->getCurrentUrl());
  $assert
    ->pageTextContains('This rule is being edited by user ' . $account_1
    ->getDisplayName() . ', and is therefore locked from editing by others.');

  // Try breaking the lock to edit the rule.
  $this
    ->clickLink('break this lock');
  $assert
    ->pageTextContains('By breaking this lock, any unsaved changes made by ' . $account_1
    ->getDisplayName() . ' will be lost.');
  $this
    ->pressButton('Break lock');
  $assert
    ->pageTextContains('The lock has been broken and you may now edit this rule.');

  // The link to edit the condition is now gone because the changes have been
  // reverted.
  $this
    ->assertFalse($this
    ->getSession()
    ->getPage()
    ->hasLink('Edit'));
}