Mercurial > hg > isophonics-drupal-site
comparison core/modules/system/src/Tests/Pager/PagerTest.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\system\Tests\Pager; | |
4 | |
5 use Drupal\simpletest\WebTestBase; | |
6 | |
7 /** | |
8 * Tests pager functionality. | |
9 * | |
10 * @group Pager | |
11 */ | |
12 class PagerTest extends WebTestBase { | |
13 | |
14 /** | |
15 * Modules to enable. | |
16 * | |
17 * @var array | |
18 */ | |
19 public static $modules = ['dblog', 'pager_test']; | |
20 | |
21 /** | |
22 * A user with permission to access site reports. | |
23 * | |
24 * @var \Drupal\user\UserInterface | |
25 */ | |
26 protected $adminUser; | |
27 | |
28 protected $profile = 'testing'; | |
29 | |
30 protected function setUp() { | |
31 parent::setUp(); | |
32 | |
33 // Insert 300 log messages. | |
34 $logger = $this->container->get('logger.factory')->get('pager_test'); | |
35 for ($i = 0; $i < 300; $i++) { | |
36 $logger->debug($this->randomString()); | |
37 } | |
38 | |
39 $this->adminUser = $this->drupalCreateUser([ | |
40 'access site reports', | |
41 ]); | |
42 $this->drupalLogin($this->adminUser); | |
43 } | |
44 | |
45 /** | |
46 * Tests markup and CSS classes of pager links. | |
47 */ | |
48 public function testActiveClass() { | |
49 // Verify first page. | |
50 $this->drupalGet('admin/reports/dblog'); | |
51 $current_page = 0; | |
52 $this->assertPagerItems($current_page); | |
53 | |
54 // Verify any page but first/last. | |
55 $current_page++; | |
56 $this->drupalGet('admin/reports/dblog', ['query' => ['page' => $current_page]]); | |
57 $this->assertPagerItems($current_page); | |
58 | |
59 // Verify last page. | |
60 $elements = $this->xpath('//li[contains(@class, :class)]/a', [':class' => 'pager__item--last']); | |
61 preg_match('@page=(\d+)@', $elements[0]['href'], $matches); | |
62 $current_page = (int) $matches[1]; | |
63 $this->drupalGet($GLOBALS['base_root'] . parse_url($this->getUrl())['path'] . $elements[0]['href'], ['external' => TRUE]); | |
64 $this->assertPagerItems($current_page); | |
65 } | |
66 | |
67 /** | |
68 * Test proper functioning of the query parameters and the pager cache context. | |
69 */ | |
70 public function testPagerQueryParametersAndCacheContext() { | |
71 // First page. | |
72 $this->drupalGet('pager-test/query-parameters'); | |
73 $this->assertText(t('Pager calls: 0'), 'Initial call to pager shows 0 calls.'); | |
74 $this->assertText('[url.query_args.pagers:0]=0.0'); | |
75 $this->assertCacheContext('url.query_args'); | |
76 | |
77 // Go to last page, the count of pager calls need to go to 1. | |
78 $elements = $this->xpath('//li[contains(@class, :class)]/a', [':class' => 'pager__item--last']); | |
79 $this->drupalGet($this->getAbsoluteUrl($elements[0]['href'])); | |
80 $this->assertText(t('Pager calls: 1'), 'First link call to pager shows 1 calls.'); | |
81 $this->assertText('[url.query_args.pagers:0]=0.60'); | |
82 $this->assertCacheContext('url.query_args'); | |
83 | |
84 // Go back to first page, the count of pager calls need to go to 2. | |
85 $elements = $this->xpath('//li[contains(@class, :class)]/a', [':class' => 'pager__item--first']); | |
86 $this->drupalGet($this->getAbsoluteUrl($elements[0]['href'])); | |
87 $this->drupalGet($GLOBALS['base_root'] . parse_url($this->getUrl())['path'] . $elements[0]['href'], ['external' => TRUE]); | |
88 $this->assertText(t('Pager calls: 2'), 'Second link call to pager shows 2 calls.'); | |
89 $this->assertText('[url.query_args.pagers:0]=0.0'); | |
90 $this->assertCacheContext('url.query_args'); | |
91 } | |
92 | |
93 /** | |
94 * Test proper functioning of multiple pagers. | |
95 */ | |
96 public function testMultiplePagers() { | |
97 // First page. | |
98 $this->drupalGet('pager-test/multiple-pagers'); | |
99 | |
100 // Test data. | |
101 // Expected URL query string param is 0-indexed. | |
102 // Expected page per pager is 1-indexed. | |
103 $test_data = [ | |
104 // With no query, all pagers set to first page. | |
105 [ | |
106 'input_query' => NULL, | |
107 'expected_page' => [0 => '1', 1 => '1', 4 => '1'], | |
108 'expected_query' => '?page=0,0,,,0', | |
109 ], | |
110 // Blanks around page numbers should not be relevant. | |
111 [ | |
112 'input_query' => '?page=2 , 10,,, 5 ,,', | |
113 'expected_page' => [0 => '3', 1 => '11', 4 => '6'], | |
114 'expected_query' => '?page=2,10,,,5', | |
115 ], | |
116 // Blanks within page numbers should lead to only the first integer | |
117 // to be considered. | |
118 [ | |
119 'input_query' => '?page=2 , 3 0,,, 4 13 ,,', | |
120 'expected_page' => [0 => '3', 1 => '4', 4 => '5'], | |
121 'expected_query' => '?page=2,3,,,4', | |
122 ], | |
123 // If floats are passed as page numbers, only the integer part is | |
124 // returned. | |
125 [ | |
126 'input_query' => '?page=2.1,6.999,,,5.', | |
127 'expected_page' => [0 => '3', 1 => '7', 4 => '6'], | |
128 'expected_query' => '?page=2,6,,,5', | |
129 ], | |
130 // Partial page fragment, undefined pagers set to first page. | |
131 [ | |
132 'input_query' => '?page=5,2', | |
133 'expected_page' => [0 => '6', 1 => '3', 4 => '1'], | |
134 'expected_query' => '?page=5,2,,,0', | |
135 ], | |
136 // Partial page fragment, undefined pagers set to first page. | |
137 [ | |
138 'input_query' => '?page=,2', | |
139 'expected_page' => [0 => '1', 1 => '3', 4 => '1'], | |
140 'expected_query' => '?page=0,2,,,0', | |
141 ], | |
142 // Partial page fragment, undefined pagers set to first page. | |
143 [ | |
144 'input_query' => '?page=,', | |
145 'expected_page' => [0 => '1', 1 => '1', 4 => '1'], | |
146 'expected_query' => '?page=0,0,,,0', | |
147 ], | |
148 // With overflow pages, all pagers set to max page. | |
149 [ | |
150 'input_query' => '?page=99,99,,,99', | |
151 'expected_page' => [0 => '16', 1 => '16', 4 => '16'], | |
152 'expected_query' => '?page=15,15,,,15', | |
153 ], | |
154 // Wrong value for the page resets pager to first page. | |
155 [ | |
156 'input_query' => '?page=bar,5,foo,qux,bet', | |
157 'expected_page' => [0 => '1', 1 => '6', 4 => '1'], | |
158 'expected_query' => '?page=0,5,,,0', | |
159 ], | |
160 ]; | |
161 | |
162 // We loop through the page with the test data query parameters, and check | |
163 // that the active page for each pager element has the expected page | |
164 // (1-indexed) and resulting query parameter | |
165 foreach ($test_data as $data) { | |
166 $input_query = str_replace(' ', '%20', $data['input_query']); | |
167 $this->drupalGet($GLOBALS['base_root'] . parse_url($this->getUrl())['path'] . $input_query, ['external' => TRUE]); | |
168 foreach ([0, 1, 4] as $pager_element) { | |
169 $active_page = $this->cssSelect("div.test-pager-{$pager_element} ul.pager__items li.is-active:contains('{$data['expected_page'][$pager_element]}')"); | |
170 $destination = str_replace('%2C', ',', $active_page[0]->a['href'][0]->__toString()); | |
171 $this->assertEqual($destination, $data['expected_query']); | |
172 } | |
173 } | |
174 } | |
175 | |
176 /** | |
177 * Test proper functioning of the ellipsis. | |
178 */ | |
179 public function testPagerEllipsis() { | |
180 // Insert 100 extra log messages to get 9 pages. | |
181 $logger = $this->container->get('logger.factory')->get('pager_test'); | |
182 for ($i = 0; $i < 100; $i++) { | |
183 $logger->debug($this->randomString()); | |
184 } | |
185 $this->drupalGet('admin/reports/dblog'); | |
186 $elements = $this->cssSelect(".pager__item--ellipsis:contains('…')"); | |
187 $this->assertEqual(count($elements), 0, 'No ellipsis has been set.'); | |
188 | |
189 // Insert an extra 50 log messages to get 10 pages. | |
190 $logger = $this->container->get('logger.factory')->get('pager_test'); | |
191 for ($i = 0; $i < 50; $i++) { | |
192 $logger->debug($this->randomString()); | |
193 } | |
194 $this->drupalGet('admin/reports/dblog'); | |
195 $elements = $this->cssSelect(".pager__item--ellipsis:contains('…')"); | |
196 $this->assertEqual(count($elements), 1, 'Found the ellipsis.'); | |
197 } | |
198 | |
199 /** | |
200 * Asserts pager items and links. | |
201 * | |
202 * @param int $current_page | |
203 * The current pager page the internal browser is on. | |
204 */ | |
205 protected function assertPagerItems($current_page) { | |
206 $elements = $this->xpath('//ul[contains(@class, :class)]/li', [':class' => 'pager__items']); | |
207 $this->assertTrue(!empty($elements), 'Pager found.'); | |
208 | |
209 // Make current page 1-based. | |
210 $current_page++; | |
211 | |
212 // Extract first/previous and next/last items. | |
213 // first/previous only exist, if the current page is not the first. | |
214 if ($current_page > 1) { | |
215 $first = array_shift($elements); | |
216 $previous = array_shift($elements); | |
217 } | |
218 // next/last always exist, unless the current page is the last. | |
219 if ($current_page != count($elements)) { | |
220 $last = array_pop($elements); | |
221 $next = array_pop($elements); | |
222 } | |
223 | |
224 // We remove elements from the $elements array in the following code, so | |
225 // we store the total number of pages for verifying the "last" link. | |
226 $total_pages = count($elements); | |
227 | |
228 // Verify items and links to pages. | |
229 foreach ($elements as $page => $element) { | |
230 // Make item/page index 1-based. | |
231 $page++; | |
232 | |
233 if ($current_page == $page) { | |
234 $this->assertClass($element, 'is-active', 'Element for current page has .is-active class.'); | |
235 $this->assertTrue($element->a, 'Element for current page has link.'); | |
236 $destination = $element->a['href'][0]->__toString(); | |
237 // URL query string param is 0-indexed. | |
238 $this->assertEqual($destination, '?page=' . ($page - 1)); | |
239 } | |
240 else { | |
241 $this->assertNoClass($element, 'is-active', "Element for page $page has no .is-active class."); | |
242 $this->assertClass($element, 'pager__item', "Element for page $page has .pager__item class."); | |
243 $this->assertTrue($element->a, "Link to page $page found."); | |
244 $destination = $element->a['href'][0]->__toString(); | |
245 $this->assertEqual($destination, '?page=' . ($page - 1)); | |
246 } | |
247 unset($elements[--$page]); | |
248 } | |
249 // Verify that no other items remain untested. | |
250 $this->assertTrue(empty($elements), 'All expected items found.'); | |
251 | |
252 // Verify first/previous and next/last items and links. | |
253 if (isset($first)) { | |
254 $this->assertClass($first, 'pager__item--first', 'Element for first page has .pager__item--first class.'); | |
255 $this->assertTrue($first->a, 'Link to first page found.'); | |
256 $this->assertNoClass($first->a, 'is-active', 'Link to first page is not active.'); | |
257 $destination = $first->a['href'][0]->__toString(); | |
258 $this->assertEqual($destination, '?page=0'); | |
259 } | |
260 if (isset($previous)) { | |
261 $this->assertClass($previous, 'pager__item--previous', 'Element for first page has .pager__item--previous class.'); | |
262 $this->assertTrue($previous->a, 'Link to previous page found.'); | |
263 $this->assertNoClass($previous->a, 'is-active', 'Link to previous page is not active.'); | |
264 $destination = $previous->a['href'][0]->__toString(); | |
265 // URL query string param is 0-indexed, $current_page is 1-indexed. | |
266 $this->assertEqual($destination, '?page=' . ($current_page - 2)); | |
267 } | |
268 if (isset($next)) { | |
269 $this->assertClass($next, 'pager__item--next', 'Element for next page has .pager__item--next class.'); | |
270 $this->assertTrue($next->a, 'Link to next page found.'); | |
271 $this->assertNoClass($next->a, 'is-active', 'Link to next page is not active.'); | |
272 $destination = $next->a['href'][0]->__toString(); | |
273 // URL query string param is 0-indexed, $current_page is 1-indexed. | |
274 $this->assertEqual($destination, '?page=' . $current_page); | |
275 } | |
276 if (isset($last)) { | |
277 $this->assertClass($last, 'pager__item--last', 'Element for last page has .pager__item--last class.'); | |
278 $this->assertTrue($last->a, 'Link to last page found.'); | |
279 $this->assertNoClass($last->a, 'is-active', 'Link to last page is not active.'); | |
280 $destination = $last->a['href'][0]->__toString(); | |
281 // URL query string param is 0-indexed. | |
282 $this->assertEqual($destination, '?page=' . ($total_pages - 1)); | |
283 } | |
284 } | |
285 | |
286 /** | |
287 * Asserts that an element has a given class. | |
288 * | |
289 * @param \SimpleXMLElement $element | |
290 * The element to test. | |
291 * @param string $class | |
292 * The class to assert. | |
293 * @param string $message | |
294 * (optional) A verbose message to output. | |
295 */ | |
296 protected function assertClass(\SimpleXMLElement $element, $class, $message = NULL) { | |
297 if (!isset($message)) { | |
298 $message = "Class .$class found."; | |
299 } | |
300 $this->assertTrue(strpos($element['class'], $class) !== FALSE, $message); | |
301 } | |
302 | |
303 /** | |
304 * Asserts that an element does not have a given class. | |
305 * | |
306 * @param \SimpleXMLElement $element | |
307 * The element to test. | |
308 * @param string $class | |
309 * The class to assert. | |
310 * @param string $message | |
311 * (optional) A verbose message to output. | |
312 */ | |
313 protected function assertNoClass(\SimpleXMLElement $element, $class, $message = NULL) { | |
314 if (!isset($message)) { | |
315 $message = "Class .$class not found."; | |
316 } | |
317 $this->assertTrue(strpos($element['class'], $class) === FALSE, $message); | |
318 } | |
319 | |
320 } |