function AreaDisplayLinkTest::testAreaDisplayLink

Same name and namespace in other branches
  1. 9 core/modules/views/tests/src/Kernel/Handler/AreaDisplayLinkTest.php \Drupal\Tests\views\Kernel\Handler\AreaDisplayLinkTest::testAreaDisplayLink()
  2. 8.9.x core/modules/views/tests/src/Kernel/Handler/AreaDisplayLinkTest.php \Drupal\Tests\views\Kernel\Handler\AreaDisplayLinkTest::testAreaDisplayLink()
  3. 11.x core/modules/views/tests/src/Kernel/Handler/AreaDisplayLinkTest.php \Drupal\Tests\views\Kernel\Handler\AreaDisplayLinkTest::testAreaDisplayLink()

Tests the views area display_link handler.

File

core/modules/views/tests/src/Kernel/Handler/AreaDisplayLinkTest.php, line 132

Class

AreaDisplayLinkTest
Tests the core views_handler_area_display_link handler.

Namespace

Drupal\Tests\views\Kernel\Handler

Code

public function testAreaDisplayLink() : void {
  $view = Views::getView('test_view');
  // Assert only path-based displays are available in the display link
  // settings form.
  $view->setDisplay('page_1');
  $this->assertFormOptions($view, 'display_link_1');
  $this->assertFormOptions($view, 'display_link_2');
  $view->setDisplay('page_2');
  $this->assertFormOptions($view, 'display_link_1');
  $this->assertFormOptions($view, 'display_link_2');
  $view->setDisplay('block_1');
  $this->assertFormOptions($view, 'display_link_1');
  $this->assertFormOptions($view, 'display_link_2');
  // Assert the links are rendered correctly for all displays.
  $this->assertRenderedDisplayLinks($view, 'page_1');
  $this->assertRenderedDisplayLinks($view, 'page_2');
  $this->assertRenderedDisplayLinks($view, 'block_1');
  // Assert some special request parameters are filtered from the display
  // links.
  $request = Request::create('page_1', 'GET', [
    'name' => 'John',
    'sort_by' => 'created',
    'sort_order' => 'ASC',
    'page' => 1,
    'keep' => 'keep',
    'keep_another' => 1,
    'view_name' => 1,
    'view_display_id' => 1,
    'view_args' => 1,
    'view_path' => 1,
    'view_dom_id' => 1,
    'pager_element' => 1,
    'view_base_path' => 1,
    AjaxResponseSubscriber::AJAX_REQUEST_PARAMETER => 1,
    FormBuilderInterface::AJAX_FORM_REQUEST => 1,
    MainContentViewSubscriber::WRAPPER_FORMAT => 1,
  ]);
  $request->setSession(new Session(new MockArraySessionStorage()));
  $view->setRequest($request);
  $view->destroy();
  $view->setDisplay('page_1');
  $view->setCurrentPage(2);
  $this->executeView($view, [
    1,
  ]);
  $this->assertSame('<a href="/page_1/1?name=John&amp;sort_by=created&amp;sort_order=ASC&amp;keep=keep&amp;keep_another=1&amp;page=1" class="views-display-link views-display-link-page_1 is-active">Page 1</a>', $this->renderDisplayLink($view, 'display_link_1'));
  $this->assertSame('<a href="/page_2/1?name=John&amp;sort_by=created&amp;sort_order=ASC&amp;keep=keep&amp;keep_another=1&amp;page=1" class="views-display-link views-display-link-page_2">Page 2</a>', $this->renderDisplayLink($view, 'display_link_2'));
  // Assert the validation adds warning messages when a display link is added
  // to a display with different filter criteria, sort criteria, pager
  // settings or contextual filters. Since all options are added to the
  // default display there currently should be no warning messages.
  $this->assertNoWarningMessages($view);
  // Assert the message are shown when changing the filter criteria of page_1.
  $filters = [
    'name' => [
      'id' => 'name',
      'table' => 'views_test_data',
      'field' => 'name',
      'relationship' => 'none',
      'operator' => '=',
      'value' => '',
      'exposed' => TRUE,
      'expose' => [
        'identifier' => 'name',
        'label' => 'Name',
      ],
    ],
  ];
  $view->displayHandlers
    ->get('page_1')
    ->overrideOption('filters', $filters);
  $this->assertWarningMessages($view, [
    'filters',
  ]);
  // Assert no messages are added after the default display is changed with
  // the same options.
  $view->displayHandlers
    ->get('default')
    ->overrideOption('filters', $filters);
  $this->assertNoWarningMessages($view);
  // Assert the message are shown when changing the sort criteria of page_1.
  $sorts = [
    'created' => [
      'id' => 'created',
      'table' => 'views_test_data',
      'field' => 'created',
      'relationship' => 'none',
      'order' => 'DESC',
      'exposed' => TRUE,
    ],
  ];
  $view->displayHandlers
    ->get('page_1')
    ->overrideOption('sorts', $sorts);
  $this->assertWarningMessages($view, [
    'sorts',
  ]);
  // Assert no messages are added after the default display is changed with
  // the same options.
  $view->displayHandlers
    ->get('default')
    ->overrideOption('sorts', $sorts);
  $this->assertNoWarningMessages($view);
  // Assert the message are shown when changing the sort criteria of page_1.
  $pager = [
    'type' => 'full',
    'options' => [
      'items_per_page' => 10,
    ],
  ];
  $view->displayHandlers
    ->get('page_1')
    ->overrideOption('pager', $pager);
  $this->assertWarningMessages($view, [
    'pager',
  ]);
  // Assert no messages are added after the default display is changed with
  // the same options.
  $view->displayHandlers
    ->get('default')
    ->overrideOption('pager', $pager);
  $this->assertNoWarningMessages($view);
  // Assert the message are shown when changing the contextual filters of
  // page_1.
  $arguments = [
    'id' => [
      'id' => 'id',
      'table' => 'views_test_data',
      'field' => 'id',
      'relationship' => 'none',
    ],
  ];
  $view->displayHandlers
    ->get('page_1')
    ->overrideOption('arguments', $arguments);
  $this->assertWarningMessages($view, [
    'arguments',
  ]);
  // Assert no messages are added after the default display is changed with
  // the same options.
  $view->displayHandlers
    ->get('default')
    ->overrideOption('arguments', $arguments);
  $this->assertNoWarningMessages($view);
  // Assert an error is shown when the display ID is not set.
  $display_link = [
    'display_link_3' => [
      'id' => 'display_link_3',
      'table' => 'views',
      'field' => 'display_link',
      'display_id' => '',
      'label' => 'Empty',
      'plugin_id' => 'display_link',
    ],
  ];
  $view->displayHandlers
    ->get('page_1')
    ->overrideOption('header', $display_link);
  $view->destroy();
  $view->setDisplay('page_1');
  $errors = $view->validate();
  $this->assertCount(1, $errors);
  $this->assertCount(1, $errors['page_1']);
  $this->assertSame('<em class="placeholder">Page 1</em>: The link in the <em class="placeholder">header</em> area has no configured display.', $errors['page_1'][0]->__toString());
  // Assert an error is shown when linking to a display ID that doesn't exist.
  $display_link['display_link_3']['display_id'] = 'non-existent';
  $view->displayHandlers
    ->get('page_1')
    ->overrideOption('header', $display_link);
  $view->destroy();
  $view->setDisplay('page_1');
  $errors = $view->validate();
  $this->assertCount(1, $errors);
  $this->assertCount(1, $errors['page_1']);
  $this->assertSame('<em class="placeholder">Page 1</em>: The link in the <em class="placeholder">header</em> area points to the <em class="placeholder">non-existent</em> display which no longer exists.', $errors['page_1'][0]->__toString());
  // Assert an error is shown when linking to a display without a path.
  $display_link['display_link_3']['display_id'] = 'block_1';
  $view->displayHandlers
    ->get('page_1')
    ->overrideOption('header', $display_link);
  $view->destroy();
  $view->setDisplay('page_1');
  $errors = $view->validate();
  $this->assertCount(1, $errors);
  $this->assertCount(1, $errors['page_1']);
  $this->assertSame('<em class="placeholder">Page 1</em>: The link in the <em class="placeholder">header</em> area points to the <em class="placeholder">Block 1</em> display which does not have a path.', $errors['page_1'][0]->__toString());
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.