You are here

public function WebformSettingsLimitsTest::testFormLimits in Webform 6.x

Same name and namespace in other branches
  1. 8.5 tests/src/Functional/Settings/WebformSettingsLimitsTest.php \Drupal\Tests\webform\Functional\Settings\WebformSettingsLimitsTest::testFormLimits()

Tests webform submission form limits.

File

tests/src/Functional/Settings/WebformSettingsLimitsTest.php, line 43

Class

WebformSettingsLimitsTest
Tests for webform submission form limits.

Namespace

Drupal\Tests\webform\Functional\Settings

Code

public function testFormLimits() {
  $own_submission_user = $this
    ->drupalCreateUser([
    'view own webform submission',
    'edit own webform submission',
    'delete own webform submission',
    'access webform submission user',
  ]);
  $webform_limit = Webform::load('test_form_limit');

  /**************************************************************************/
  $this
    ->drupalGet('/webform/test_form_limit');

  // Check webform available.
  $this
    ->assertFieldByName('op', 'Submit');

  // Check submission limit blocks.
  $this
    ->assertRaw('0 user submission(s)');
  $this
    ->assertRaw('1 user limit (every minute)');
  $this
    ->assertRaw('0 webform submission(s)');
  $this
    ->assertRaw('4 webform limit (every minute)');

  // Check submission limit tokens.
  $this
    ->assertRaw('limit:webform: 4');
  $this
    ->assertRaw('remaining:webform: 4');
  $this
    ->assertRaw('limit:user: 1');
  $this
    ->assertRaw('remaining:user: 1');
  $this
    ->drupalLogin($own_submission_user);

  // Check that draft does not count toward limit.
  $this
    ->postSubmission($webform_limit, [], 'Save Draft');
  $this
    ->drupalGet('/webform/test_form_limit');
  $this
    ->assertFieldByName('op', 'Submit');
  $this
    ->assertRaw('A partially-completed form was found. Please complete the remaining portions.');
  $this
    ->assertNoRaw('You are only allowed to have 1 submission for this webform.');

  // Check submission limit blocks do not count draft.
  $this
    ->assertRaw('0 user submission(s)');
  $this
    ->assertRaw('0 webform submission(s)');

  // Check limit reached and webform not available for authenticated user.
  $sid = $this
    ->postSubmission($webform_limit);
  $this
    ->drupalGet('/webform/test_form_limit');
  $this
    ->assertNoFieldByName('op', 'Submit');
  $this
    ->assertRaw('You are only allowed to have 1 submission for this webform.');

  // Check submission limit blocks do count submission.
  $this
    ->assertRaw('1 user submission(s)');
  $this
    ->assertRaw('1 webform submission(s)');

  // Check authenticated user can edit own submission.
  $this
    ->drupalGet("admin/structure/webform/manage/test_form_limit/submission/{$sid}/edit");
  $this
    ->assertNoRaw('You are only allowed to have 1 submission for this webform.');
  $this
    ->assertFieldByName('op', 'Save');
  $this
    ->drupalLogout();

  // Check admin post submission.
  $this
    ->drupalLogin($this->rootUser);
  $sid = $this
    ->postSubmission($webform_limit);
  $this
    ->drupalGet("admin/structure/webform/manage/test_form_limit/submission/{$sid}/edit");
  $this
    ->assertFieldByName('op', 'Save');
  $this
    ->assertNoRaw('No more submissions are permitted.');

  // Check submission limit tokens do count submission.
  $this
    ->assertRaw('remaining:webform: 2');
  $this
    ->assertRaw('remaining:user: 0');

  // Check submission limit blocks.
  $this
    ->assertRaw('1 user submission(s)');
  $this
    ->assertRaw('2 webform submission(s)');
  $this
    ->drupalLogout();

  // Allow anonymous users to edit own submission.
  $role = Role::load('anonymous');
  $role
    ->grantPermission('edit own webform submission');
  $role
    ->save();

  // Check webform is still available for anonymous users.
  $this
    ->drupalGet('/webform/test_form_limit');
  $this
    ->assertFieldByName('op', 'Submit');
  $this
    ->assertNoRaw('You are only allowed to have 1 submission for this webform.');

  // Add 1 more submissions as an anonymous user making the total number of
  // submissions equal to 3.
  $sid = $this
    ->postSubmission($webform_limit);

  // Check submission limit blocks.
  $this
    ->assertRaw('1 user submission(s)');
  $this
    ->assertRaw('3 webform submission(s)');

  // Check limit reached and webform not available for anonymous user.
  $this
    ->drupalGet('/webform/test_form_limit');
  $this
    ->assertNoFieldByName('op', 'Submit');
  $this
    ->assertRaw('You are only allowed to have 1 submission for this webform.');

  // Check authenticated user can edit own submission.
  $this
    ->drupalGet("admin/structure/webform/manage/test_form_limit/submission/{$sid}/edit");
  $this
    ->assertNoRaw('You are only allowed to have 1 submission for this webform.');
  $this
    ->assertFieldByName('op', 'Save');

  // Add 1 more submissions as an root user making the total number of
  // submissions equal to 4.
  $this
    ->drupalLogin($this->rootUser);
  $this
    ->postSubmission($webform_limit);
  $this
    ->drupalLogout();

  // Check total limit.
  $this
    ->drupalGet('/webform/test_form_limit');
  $this
    ->assertNoFieldByName('op', 'Submit');
  $this
    ->assertRaw('Only 4 submissions are allowed.');
  $this
    ->assertNoRaw('You are only allowed to have 1 submission for this webform.');

  // Check submission limit blocks.
  $this
    ->assertRaw('0 user submission(s)');
  $this
    ->assertRaw('4 webform submission(s)');

  // Check admin can still post submissions.
  $this
    ->drupalLogin($this->rootUser);
  $this
    ->drupalGet('/webform/test_form_limit');
  $this
    ->assertFieldByName('op', 'Submit');
  $this
    ->assertRaw('Only 4 submissions are allowed.');
  $this
    ->assertRaw('Only submission administrators are allowed to access this webform and create new submissions.');

  // Check submission limit blocks.
  $this
    ->assertRaw('2 user submission(s)');
  $this
    ->assertRaw('4 webform submission(s)');

  // Change submission completed to 1 hour ago.
  \Drupal::database()
    ->query('UPDATE {webform_submission} SET completed = :completed', [
    ':completed' => strtotime('-1 minute'),
  ]);

  // Check submission limit blocks are removed because the submission
  // intervals have passed.
  $this
    ->drupalGet('/webform/test_form_limit');
  $this
    ->assertRaw('0 user submission(s)');
  $this
    ->assertRaw('0 webform submission(s)');

  /**************************************************************************/

  // Wait.

  /**************************************************************************/
  $webform_limit_wait = Webform::load('test_form_limit_wait');
  $this
    ->postSubmission($webform_limit_wait);
  $this
    ->drupalGet('/webform/test_form_limit_wait');
  $this
    ->assertPattern('/webform_submission:interval:user:wait => \\d+ seconds/');
}