3 namespace Drupal\Tests\system\Functional\Database;
5 use Symfony\Component\HttpFoundation\Request;
8 * Tests the pager query select extender.
12 class SelectPagerDefaultTest extends DatabaseTestBase {
15 * Confirms that a pager query returns the correct results.
17 * Note that we have to make an HTTP request to a test page handler
18 * because the pager depends on GET parameters.
20 public function testEvenPagerQuery() {
21 // To keep the test from being too brittle, we determine up front
22 // what the page count should be dynamically, and pass the control
23 // information forward to the actual query on the other side of the
26 $count = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
28 $correct_number = $limit;
29 $num_pages = floor($count / $limit);
31 // If there is no remainder from rounding, subtract 1 since we index from 0.
32 if (!($num_pages * $limit < $count)) {
36 for ($page = 0; $page <= $num_pages; ++$page) {
37 $this->drupalGet('database_test/pager_query_even/' . $limit, ['query' => ['page' => $page]]);
38 $data = json_decode($this->getSession()->getPage()->getContent());
40 if ($page == $num_pages) {
41 $correct_number = $count - ($limit * $page);
44 $this->assertCount($correct_number, $data->names, format_string('Correct number of records returned by pager: @number', ['@number' => $correct_number]));
49 * Confirms that a pager query returns the correct results.
51 * Note that we have to make an HTTP request to a test page handler
52 * because the pager depends on GET parameters.
54 public function testOddPagerQuery() {
55 // To keep the test from being too brittle, we determine up front
56 // what the page count should be dynamically, and pass the control
57 // information forward to the actual query on the other side of the
60 $count = db_query('SELECT COUNT(*) FROM {test_task}')->fetchField();
62 $correct_number = $limit;
63 $num_pages = floor($count / $limit);
65 // If there is no remainder from rounding, subtract 1 since we index from 0.
66 if (!($num_pages * $limit < $count)) {
70 for ($page = 0; $page <= $num_pages; ++$page) {
71 $this->drupalGet('database_test/pager_query_odd/' . $limit, ['query' => ['page' => $page]]);
72 $data = json_decode($this->getSession()->getPage()->getContent());
74 if ($page == $num_pages) {
75 $correct_number = $count - ($limit * $page);
78 $this->assertCount($correct_number, $data->names, format_string('Correct number of records returned by pager: @number', ['@number' => $correct_number]));
83 * Confirms that a pager query results with an inner pager query are valid.
85 * This is a regression test for #467984.
87 public function testInnerPagerQuery() {
88 $query = db_select('test', 't')
89 ->extend('Drupal\Core\Database\Query\PagerSelectExtender');
91 ->fields('t', ['age'])
95 $outer_query = db_select($query);
96 $outer_query->addField('subquery', 'age');
101 $this->assertEqual($ages, [25, 26, 27, 28], 'Inner pager query returned the correct ages.');
105 * Confirms that a paging query results with a having expression are valid.
107 * This is a regression test for #467984.
109 public function testHavingPagerQuery() {
110 $query = db_select('test', 't')
111 ->extend('Drupal\Core\Database\Query\PagerSelectExtender');
113 ->fields('t', ['name'])
116 ->having('MAX(age) > :count', [':count' => 26])
122 $this->assertEqual($ages, ['George', 'Ringo'], 'Pager query with having expression returned the correct ages.');
126 * Confirms that every pager gets a valid, non-overlapping element ID.
128 public function testElementNumbers() {
130 $request = Request::createFromGlobals();
131 $request->query->replace([
132 'page' => '3, 2, 1, 0',
134 \Drupal::getContainer()->get('request_stack')->push($request);
136 $name = db_select('test', 't')
137 ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
139 ->fields('t', ['name'])
144 $this->assertEqual($name, 'Paul', 'Pager query #1 with a specified element ID returned the correct results.');
146 // Setting an element smaller than the previous one
147 // should not overwrite the pager $maxElement with a smaller value.
148 $name = db_select('test', 't')
149 ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
151 ->fields('t', ['name'])
156 $this->assertEqual($name, 'George', 'Pager query #2 with a specified element ID returned the correct results.');
158 $name = db_select('test', 't')
159 ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
160 ->fields('t', ['name'])
165 $this->assertEqual($name, 'John', 'Pager query #3 with a generated element ID returned the correct results.');