You are here

public function RedirectJavascriptTest::testRedirectUI in Redirect 8

Test the redirect UI.

File

tests/src/FunctionalJavascript/RedirectJavascriptTest.php, line 67

Class

RedirectJavascriptTest
UI tests for redirect module.

Namespace

Drupal\Tests\redirect\FunctionalJavascript

Code

public function testRedirectUI() {
  $this
    ->drupalLogin($this->adminUser);

  // Test populating the redirect form with predefined values.
  $this
    ->drupalGet('admin/config/search/redirect/add', [
    'query' => [
      'source' => 'non-existing',
      'source_query' => [
        'key' => 'val',
        'key1' => 'val1',
      ],
      'redirect' => 'node',
      'redirect_options' => [
        'query' => [
          'key' => 'val',
          'key1' => 'val1',
        ],
      ],
    ],
  ]);
  $this
    ->assertFieldByName('redirect_source[0][path]', 'non-existing?key=val&key1=val1');
  $this
    ->assertFieldByName('redirect_redirect[0][uri]', '/node?key=val&key1=val1');
  $this
    ->drupalGet('admin/config/search/redirect/add');
  $page = $this
    ->getSession()
    ->getPage();
  $page
    ->fillField('redirect_source[0][path]', 'non-existing');
  $page
    ->fillField('redirect_redirect[0][uri]', '/node');
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $page
    ->pressButton('Save');

  // Try to find the redirect we just created.
  $redirect = $this->repository
    ->findMatchingRedirect('non-existing');
  $this
    ->assertEqual($redirect
    ->getSourceUrl(), Url::fromUri('base:non-existing')
    ->toString());
  $this
    ->assertEqual($redirect
    ->getRedirectUrl()
    ->toString(), Url::fromUri('base:node')
    ->toString());

  // After adding the redirect we should end up in the list. Check if the
  // redirect is listed.
  $this
    ->assertUrl('admin/config/search/redirect');
  $this
    ->assertSession()
    ->pageTextContains('non-existing');
  $this
    ->assertLink(Url::fromUri('base:node')
    ->toString());
  $this
    ->assertSession()
    ->pageTextContains(t('Not specified'));

  // Test the edit form and update action.
  $this
    ->clickLink(t('Edit'));
  $this
    ->assertFieldByName('redirect_source[0][path]', 'non-existing');
  $this
    ->assertFieldByName('redirect_redirect[0][uri]', '/node');
  $this
    ->assertFieldByName('status_code', $redirect
    ->getStatusCode());

  // Append a query string to see if we handle query data properly.
  $this
    ->drupalPostForm(NULL, [
    'redirect_source[0][path]' => 'non-existing?key=value',
  ], t('Save'));

  // Check the location after update and check if the value has been updated
  // in the list.
  $this
    ->assertUrl('admin/config/search/redirect');
  $this
    ->assertSession()
    ->pageTextContains('non-existing?key=value');

  // The path field should not contain the query string and therefore we
  // should be able to load the redirect using only the url part without
  // query.
  $this->storage
    ->resetCache();
  $redirects = $this->repository
    ->findBySourcePath('non-existing');
  $redirect = array_shift($redirects);
  $this
    ->assertEqual($redirect
    ->getSourceUrl(), Url::fromUri('base:non-existing', [
    'query' => [
      'key' => 'value',
    ],
  ])
    ->toString());

  // Test the source url hints.
  // The hint about an existing base path.
  $this
    ->drupalGet('admin/config/search/redirect/add');
  $page
    ->fillField('redirect_source[0][path]', 'non-existing?key=value');
  $page
    ->fillField('redirect_redirect[0][uri]', '');
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $this
    ->assertRaw(t('The base source path %source is already being redirected. Do you want to <a href="@edit-page">edit the existing redirect</a>?', [
    '%source' => 'non-existing?key=value',
    '@edit-page' => $redirect
      ->toUrl('edit-form')
      ->toString(),
  ]));

  // The hint about a valid path.
  $this
    ->drupalGet('admin/config/search/redirect/add');
  $page
    ->fillField('redirect_source[0][path]', 'node');
  $page
    ->fillField('redirect_redirect[0][uri]', '');
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $this
    ->assertRaw(t('The source path %path is likely a valid path. It is preferred to <a href="@url-alias">create URL aliases</a> for existing paths rather than redirects.', [
    '%path' => 'node',
    '@url-alias' => Url::fromRoute('entity.path_alias.add_form')
      ->toString(),
  ]));

  // Test validation.
  // Duplicate redirect.
  $this
    ->drupalGet('admin/config/search/redirect/add');
  $page = $this
    ->getSession()
    ->getPage();
  $page
    ->fillField('redirect_source[0][path]', 'non-existing?key=value');
  $page
    ->fillField('redirect_redirect[0][uri]', '/node');
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $page
    ->pressButton('Save');
  $this
    ->assertRaw(t('The source path %source is already being redirected. Do you want to <a href="@edit-page">edit the existing redirect</a>?', [
    '%source' => 'non-existing?key=value',
    '@edit-page' => $redirect
      ->toUrl('edit-form')
      ->toString(),
  ]));

  // Redirecting to itself.
  $this
    ->drupalGet('admin/config/search/redirect/add');
  $page = $this
    ->getSession()
    ->getPage();
  $page
    ->fillField('redirect_source[0][path]', 'node');
  $page
    ->fillField('redirect_redirect[0][uri]', '/node');
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $page
    ->pressButton('Save');
  $this
    ->assertRaw(t('You are attempting to redirect the page to itself. This will result in an infinite loop.'));

  // Redirecting the front page.
  $this
    ->drupalGet('admin/config/search/redirect/add');
  $page = $this
    ->getSession()
    ->getPage();
  $page
    ->fillField('redirect_source[0][path]', '<front>');
  $page
    ->fillField('redirect_redirect[0][uri]', '/node');
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $page
    ->pressButton('Save');
  $this
    ->assertRaw(t('It is not allowed to create a redirect from the front page.'));

  // Redirecting a url with fragment.
  $this
    ->drupalGet('admin/config/search/redirect/add');
  $page = $this
    ->getSession()
    ->getPage();
  $page
    ->fillField('redirect_source[0][path]', 'page-to-redirect#content');
  $page
    ->fillField('redirect_redirect[0][uri]', '/node');
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $page
    ->pressButton('Save');
  $this
    ->assertRaw(t('The anchor fragments are not allowed.'));

  // Adding path that starts with /
  $this
    ->drupalGet('admin/config/search/redirect/add');
  $page = $this
    ->getSession()
    ->getPage();
  $page
    ->fillField('redirect_source[0][path]', '/page-to-redirect');
  $page
    ->fillField('redirect_redirect[0][uri]', '/node');

  // Wait on ajax is unpredictable, wait for one second.
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $page
    ->pressButton('Save');
  $this
    ->assertRaw(t('The url to redirect from should not start with a forward slash (/).'));

  // Test filters.
  // Add a new redirect.
  $this
    ->drupalGet('admin/config/search/redirect/add');
  $page = $this
    ->getSession()
    ->getPage();
  $page
    ->fillField('redirect_source[0][path]', 'test27');
  $page
    ->fillField('redirect_redirect[0][uri]', '/node');
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $page
    ->pressButton('Save');

  // Filter with non existing value.
  $this
    ->drupalGet('admin/config/search/redirect', [
    'query' => [
      'status_code' => '3',
    ],
  ]);
  $rows = $this
    ->xpath('//tbody/tr');

  // Check if the list has no rows.
  $this
    ->assertTrue(count($rows) == 0);

  // Filter with existing values.
  $this
    ->drupalGet('admin/config/search/redirect', [
    'query' => [
      'redirect_source__path' => 'test',
      'status_code' => '2',
    ],
  ]);
  $rows = $this
    ->xpath('//tbody/tr');

  // Check if the list has 1 row.
  $this
    ->assertTrue(count($rows) == 1);
  $this
    ->drupalGet('admin/config/search/redirect', [
    'query' => [
      'redirect_redirect__uri' => 'nod',
    ],
  ]);
  $rows = $this
    ->xpath('//tbody/tr');

  // Check if the list has 2 rows.
  $this
    ->assertTrue(count($rows) == 2);

  // Test the plural form of the bulk delete action.
  $this
    ->drupalGet('admin/config/search/redirect');
  $edit = [
    'redirect_bulk_form[0]' => TRUE,
    'redirect_bulk_form[1]' => TRUE,
  ];
  $this
    ->drupalPostForm(NULL, $edit, t('Apply to selected items'));
  $this
    ->assertSession()
    ->pageTextContains('Are you sure you want to delete these redirects?');
  $this
    ->clickLink('Cancel');

  // Test the delete action.
  $page
    ->find('css', '.dropbutton-toggle button')
    ->press();
  $this
    ->clickLink(t('Delete'));
  $this
    ->assertRaw(t('Are you sure you want to delete the URL redirect from %source to %redirect?', [
    '%source' => Url::fromUri('base:non-existing', [
      'query' => [
        'key' => 'value',
      ],
    ])
      ->toString(),
    '%redirect' => Url::fromUri('base:node')
      ->toString(),
  ]));
  $this
    ->drupalPostForm(NULL, [], t('Delete'));
  $this
    ->assertUrl('admin/config/search/redirect');

  // Test the bulk delete action.
  $this
    ->drupalPostForm(NULL, [
    'redirect_bulk_form[0]' => TRUE,
  ], t('Apply to selected items'));
  $this
    ->assertSession()
    ->pageTextContains('Are you sure you want to delete this redirect?');
  $this
    ->assertSession()
    ->pageTextContains('test27');
  $this
    ->drupalPostForm(NULL, [], t('Delete'));
  $this
    ->assertSession()
    ->pageTextContains(t('There is no redirect yet.'));
}