3 namespace Drupal\system\Tests\Database;
4 use Symfony\Component\HttpFoundation\Request;
7 * Tests the pager query select extender.
11 class SelectPagerDefaultTest extends DatabaseWebTestBase {
14 * Confirms that a pager query returns the correct results.
16 * Note that we have to make an HTTP request to a test page handler
17 * because the pager depends on GET parameters.
19 public function testEvenPagerQuery() {
20 // To keep the test from being too brittle, we determine up front
21 // what the page count should be dynamically, and pass the control
22 // information forward to the actual query on the other side of the
25 $count = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
27 $correct_number = $limit;
28 $num_pages = floor($count / $limit);
30 // If there is no remainder from rounding, subtract 1 since we index from 0.
31 if (!($num_pages * $limit < $count)) {
35 for ($page = 0; $page <= $num_pages; ++$page) {
36 $this->drupalGet('database_test/pager_query_even/' . $limit, ['query' => ['page' => $page]]);
37 $data = json_decode($this->getRawContent());
39 if ($page == $num_pages) {
40 $correct_number = $count - ($limit * $page);
43 $this->assertEqual(count($data->names), $correct_number, format_string('Correct number of records returned by pager: @number', ['@number' => $correct_number]));
48 * Confirms that a pager query returns the correct results.
50 * Note that we have to make an HTTP request to a test page handler
51 * because the pager depends on GET parameters.
53 public function testOddPagerQuery() {
54 // To keep the test from being too brittle, we determine up front
55 // what the page count should be dynamically, and pass the control
56 // information forward to the actual query on the other side of the
59 $count = db_query('SELECT COUNT(*) FROM {test_task}')->fetchField();
61 $correct_number = $limit;
62 $num_pages = floor($count / $limit);
64 // If there is no remainder from rounding, subtract 1 since we index from 0.
65 if (!($num_pages * $limit < $count)) {
69 for ($page = 0; $page <= $num_pages; ++$page) {
70 $this->drupalGet('database_test/pager_query_odd/' . $limit, ['query' => ['page' => $page]]);
71 $data = json_decode($this->getRawContent());
73 if ($page == $num_pages) {
74 $correct_number = $count - ($limit * $page);
77 $this->assertEqual(count($data->names), $correct_number, format_string('Correct number of records returned by pager: @number', ['@number' => $correct_number]));
82 * Confirms that a pager query results with an inner pager query are valid.
84 * This is a regression test for #467984.
86 public function testInnerPagerQuery() {
87 $query = db_select('test', 't')
88 ->extend('Drupal\Core\Database\Query\PagerSelectExtender');
90 ->fields('t', ['age'])
94 $outer_query = db_select($query);
95 $outer_query->addField('subquery', 'age');
100 $this->assertEqual($ages, [25, 26, 27, 28], 'Inner pager query returned the correct ages.');
104 * Confirms that a paging query results with a having expression are valid.
106 * This is a regression test for #467984.
108 public function testHavingPagerQuery() {
109 $query = db_select('test', 't')
110 ->extend('Drupal\Core\Database\Query\PagerSelectExtender');
112 ->fields('t', ['name'])
115 ->having('MAX(age) > :count', [':count' => 26])
121 $this->assertEqual($ages, ['George', 'Ringo'], 'Pager query with having expression returned the correct ages.');
125 * Confirms that every pager gets a valid, non-overlapping element ID.
127 public function testElementNumbers() {
129 $request = Request::createFromGlobals();
130 $request->query->replace([
131 'page' => '3, 2, 1, 0',
133 \Drupal::getContainer()->get('request_stack')->push($request);
135 $name = db_select('test', 't')
136 ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
138 ->fields('t', ['name'])
143 $this->assertEqual($name, 'Paul', 'Pager query #1 with a specified element ID returned the correct results.');
145 // Setting an element smaller than the previous one
146 // should not overwrite the pager $maxElement with a smaller value.
147 $name = db_select('test', 't')
148 ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
150 ->fields('t', ['name'])
155 $this->assertEqual($name, 'George', 'Pager query #2 with a specified element ID returned the correct results.');
157 $name = db_select('test', 't')
158 ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
159 ->fields('t', ['name'])
164 $this->assertEqual($name, 'John', 'Pager query #3 with a generated element ID returned the correct results.');