You are here

public function ContentLockEntityTest::testJsLocking in Content locking (anti-concurrent editing) 8

Same name and namespace in other branches
  1. 8.2 tests/src/FunctionalJavascript/ContentLockEntityTest.php \Drupal\Tests\content_lock\FunctionalJavascript\ContentLockEntityTest::testJsLocking()

Test JS locking.

File

tests/src/FunctionalJavascript/ContentLockEntityTest.php, line 15

Class

ContentLockEntityTest
Class ContentLockEntityTest.

Namespace

Drupal\Tests\content_lock\FunctionalJavascript

Code

public function testJsLocking() {
  $page = $this
    ->getSession()
    ->getPage();
  $this
    ->drupalLogin($this->admin);
  $this
    ->drupalGet('admin/config/content/content_lock');
  $this
    ->click('#edit-entity-types-entity-test-mul-changed');
  $this
    ->click('#edit-entity-test-mul-changed-settings-js-lock');
  $page
    ->pressButton('Save configuration');

  // We lock entity.
  $this
    ->drupalLogin($this->user1);

  // Edit a entity without saving.
  $this
    ->drupalGet($this->entity
    ->toUrl('edit-form'));
  $assert_session = $this
    ->assertSession();
  $assert_session
    ->waitForElement('css', 'messages messages--status');
  $assert_session
    ->pageTextContains(t('This content is now locked against simultaneous editing.'));

  // Other user can not edit entity.
  $this
    ->drupalLogin($this->user2);
  $this
    ->drupalGet($this->entity
    ->toUrl('edit-form'));
  $assert_session
    ->waitForElement('css', 'messages messages--status');
  $assert_session
    ->pageTextContains(t('This content is being edited by the user @name and is therefore locked to prevent other users changes.', [
    '@name' => $this->user1
      ->getDisplayName(),
  ]));
  $assert_session
    ->linkExists(t('Break lock'));
  $disabled_button = $assert_session
    ->elementExists('css', 'input[disabled][data-drupal-selector="edit-submit"]');
  $this
    ->assertTrue($disabled_button, t('The form cannot be submitted.'));
  $disabled_field = $this
    ->xpath('//input[@id=:id and @disabled]', [
    ':id' => 'edit-field-test-text-0-value',
  ]);
  $this
    ->assertTrue($disabled_field, t('The form cannot be submitted.'));

  // We save entity 1 and unlock it.
  $this
    ->drupalLogin($this->user1);
  $this
    ->drupalGet($this->entity
    ->toUrl('edit-form'));
  $assert_session
    ->waitForElement('css', 'messages messages--status');
  $assert_session
    ->pageTextContains(t('This content is now locked by you against simultaneous editing.'));
  $page
    ->pressButton(t('Save'));

  // We lock entity with user2.
  $this
    ->drupalLogin($this->user2);

  // Edit a entity without saving.
  $this
    ->drupalGet($this->entity
    ->toUrl('edit-form'));
  $assert_session
    ->waitForElement('css', 'messages messages--status');
  $assert_session
    ->pageTextContains(t('This content is now locked against simultaneous editing.'));

  // Other user can not edit entity.
  $this
    ->drupalLogin($this->user1);
  $this
    ->drupalGet($this->entity
    ->toUrl('edit-form'));
  $assert_session
    ->waitForElement('css', 'messages messages--status');
  $assert_session
    ->pageTextContains(t('This content is being edited by the user @name and is therefore locked to prevent other users changes.', [
    '@name' => $this->user2
      ->getDisplayName(),
  ]));
  $assert_session
    ->linkNotExists(t('Break lock'));
  $disabled_button = $assert_session
    ->elementExists('css', 'input[disabled][data-drupal-selector="edit-submit"]');
  $this
    ->assertTrue($disabled_button, t('The form cannot be submitted.'));

  // We unlock entity with user2.
  $this
    ->drupalLogin($this->user2);

  // Edit a entity without saving.
  $this
    ->drupalGet($this->entity
    ->toUrl('edit-form'));
  $assert_session
    ->waitForElement('css', 'messages messages--status');
  $assert_session
    ->pageTextContains(t('This content is now locked by you against simultaneous editing.'));
  $page
    ->pressButton(t('Save'));
  $assert_session
    ->waitForElement('css', 'messages messages--status');
  $assert_session
    ->pageTextContains(t('updated.'));
}