createContentType(['type' => 'page']); for ($i = 1; $i <= 11; $i++) { $this->createNode(['title' => 'Node ' . $i . ' content', 'changed' => $i * 1000]); } // Create a user privileged enough to view content. $user = $this->drupalCreateUser([ 'administer site configuration', 'access content', 'access content overview', ]); $this->drupalLogin($user); } /** * Tests if pagination via AJAX works for the "Content" View. */ public function testBasicPagination() { // Visit the content page. $this->drupalGet('test-content-ajax'); $session_assert = $this->assertSession(); $page = $this->getSession()->getPage(); // Set the number of items displayed per page to 5 using the exposed pager. $page->selectFieldOption('edit-items-per-page', 5); $page->pressButton('Filter'); $session_assert->assertWaitOnAjaxRequest(); // Change 'Updated' sorting from descending to ascending. $page->clickLink('Updated'); $session_assert->assertWaitOnAjaxRequest(); // Use the pager by clicking on the links and test if we see the expected // number of rows on each page. For easy targeting the titles of the pager // links are used. /** @var \Behat\Mink\Element\NodeElement[] $rows */ $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertContains('Node 1 content', $rows[0]->getHtml()); $this->clickLink('Go to page 2'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertContains('Node 6 content', $rows[0]->getHtml()); $link = $page->findLink('Go to page 3'); // Test that no unwanted parameters are added to the URL. $this->assertEquals('?status=All&type=All&langcode=All&items_per_page=5&order=changed&sort=asc&title=&page=2', $link->getAttribute('href')); $this->assertNoDuplicateAssetsOnPage(); $this->clickLink('Go to page 3'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(1, $rows); $this->assertContains('Node 11 content', $rows[0]->getHtml()); // Navigate back to the first page. $this->clickLink('Go to first page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertContains('Node 1 content', $rows[0]->getHtml()); // Navigate using the 'next' link. $this->clickLink('Go to next page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertContains('Node 6 content', $rows[0]->getHtml()); // Navigate using the 'last' link. $this->clickLink('Go to last page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(1, $rows); $this->assertContains('Node 11 content', $rows[0]->getHtml()); } /** * Assert that assets are not loaded twice on a page. */ protected function assertNoDuplicateAssetsOnPage() { /** @var \Behat\Mink\Element\NodeElement[] $scripts */ $scripts = $this->getSession()->getPage()->findAll('xpath', '//script'); $script_src = []; foreach ($scripts as $script) { $this->assertFalse(in_array($script->getAttribute('src'), $script_src)); $script_src[] = $script->getAttribute('src'); } } }