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