Backup of db before drupal security update
[yaffs-website] / web / core / modules / system / tests / src / Functional / Database / SelectPagerDefaultTest.php
1 <?php
2
3 namespace Drupal\Tests\system\Functional\Database;
4
5 use Symfony\Component\HttpFoundation\Request;
6
7 /**
8  * Tests the pager query select extender.
9  *
10  * @group Database
11  */
12 class SelectPagerDefaultTest extends DatabaseTestBase {
13
14   /**
15    * Confirms that a pager query returns the correct results.
16    *
17    * Note that we have to make an HTTP request to a test page handler
18    * because the pager depends on GET parameters.
19    */
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
24     // HTTP request.
25     $limit = 2;
26     $count = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
27
28     $correct_number = $limit;
29     $num_pages = floor($count / $limit);
30
31     // If there is no remainder from rounding, subtract 1 since we index from 0.
32     if (!($num_pages * $limit < $count)) {
33       $num_pages--;
34     }
35
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());
39
40       if ($page == $num_pages) {
41         $correct_number = $count - ($limit * $page);
42       }
43
44       $this->assertCount($correct_number, $data->names, format_string('Correct number of records returned by pager: @number', ['@number' => $correct_number]));
45     }
46   }
47
48   /**
49    * Confirms that a pager query returns the correct results.
50    *
51    * Note that we have to make an HTTP request to a test page handler
52    * because the pager depends on GET parameters.
53    */
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
58     // HTTP request.
59     $limit = 2;
60     $count = db_query('SELECT COUNT(*) FROM {test_task}')->fetchField();
61
62     $correct_number = $limit;
63     $num_pages = floor($count / $limit);
64
65     // If there is no remainder from rounding, subtract 1 since we index from 0.
66     if (!($num_pages * $limit < $count)) {
67       $num_pages--;
68     }
69
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());
73
74       if ($page == $num_pages) {
75         $correct_number = $count - ($limit * $page);
76       }
77
78       $this->assertCount($correct_number, $data->names, format_string('Correct number of records returned by pager: @number', ['@number' => $correct_number]));
79     }
80   }
81
82   /**
83    * Confirms that a pager query results with an inner pager query are valid.
84    *
85    * This is a regression test for #467984.
86    */
87   public function testInnerPagerQuery() {
88     $query = db_select('test', 't')
89       ->extend('Drupal\Core\Database\Query\PagerSelectExtender');
90     $query
91       ->fields('t', ['age'])
92       ->orderBy('age')
93       ->limit(5);
94
95     $outer_query = db_select($query);
96     $outer_query->addField('subquery', 'age');
97
98     $ages = $outer_query
99       ->execute()
100       ->fetchCol();
101     $this->assertEqual($ages, [25, 26, 27, 28], 'Inner pager query returned the correct ages.');
102   }
103
104   /**
105    * Confirms that a paging query results with a having expression are valid.
106    *
107    * This is a regression test for #467984.
108    */
109   public function testHavingPagerQuery() {
110     $query = db_select('test', 't')
111       ->extend('Drupal\Core\Database\Query\PagerSelectExtender');
112     $query
113       ->fields('t', ['name'])
114       ->orderBy('name')
115       ->groupBy('name')
116       ->having('MAX(age) > :count', [':count' => 26])
117       ->limit(5);
118
119     $ages = $query
120       ->execute()
121       ->fetchCol();
122     $this->assertEqual($ages, ['George', 'Ringo'], 'Pager query with having expression returned the correct ages.');
123   }
124
125   /**
126    * Confirms that every pager gets a valid, non-overlapping element ID.
127    */
128   public function testElementNumbers() {
129
130     $request = Request::createFromGlobals();
131     $request->query->replace([
132       'page' => '3, 2, 1, 0',
133     ]);
134     \Drupal::getContainer()->get('request_stack')->push($request);
135
136     $name = db_select('test', 't')
137       ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
138       ->element(2)
139       ->fields('t', ['name'])
140       ->orderBy('age')
141       ->limit(1)
142       ->execute()
143       ->fetchField();
144     $this->assertEqual($name, 'Paul', 'Pager query #1 with a specified element ID returned the correct results.');
145
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')
150       ->element(1)
151       ->fields('t', ['name'])
152       ->orderBy('age')
153       ->limit(1)
154       ->execute()
155       ->fetchField();
156     $this->assertEqual($name, 'George', 'Pager query #2 with a specified element ID returned the correct results.');
157
158     $name = db_select('test', 't')
159       ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
160       ->fields('t', ['name'])
161       ->orderBy('age')
162       ->limit(1)
163       ->execute()
164       ->fetchField();
165     $this->assertEqual($name, 'John', 'Pager query #3 with a generated element ID returned the correct results.');
166
167   }
168
169 }