X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fsystem%2Ftests%2Fsrc%2FFunctional%2FDatabase%2FSelectPagerDefaultTest.php;fp=web%2Fcore%2Fmodules%2Fsystem%2Ftests%2Fsrc%2FFunctional%2FDatabase%2FSelectPagerDefaultTest.php;h=63e7e3163775f8e425ce0cc36dd9a2e73e039a06;hb=bfbba508964731508b9bd6d5835c2edc858db95b;hp=0000000000000000000000000000000000000000;hpb=cb9a80db11fc6b014e5b1e693a5a391c95eb5d9a;p=yaffs-website diff --git a/web/core/modules/system/tests/src/Functional/Database/SelectPagerDefaultTest.php b/web/core/modules/system/tests/src/Functional/Database/SelectPagerDefaultTest.php new file mode 100644 index 000000000..63e7e3163 --- /dev/null +++ b/web/core/modules/system/tests/src/Functional/Database/SelectPagerDefaultTest.php @@ -0,0 +1,169 @@ +fetchField(); + + $correct_number = $limit; + $num_pages = floor($count / $limit); + + // If there is no remainder from rounding, subtract 1 since we index from 0. + if (!($num_pages * $limit < $count)) { + $num_pages--; + } + + for ($page = 0; $page <= $num_pages; ++$page) { + $this->drupalGet('database_test/pager_query_even/' . $limit, ['query' => ['page' => $page]]); + $data = json_decode($this->getSession()->getPage()->getContent()); + + if ($page == $num_pages) { + $correct_number = $count - ($limit * $page); + } + + $this->assertCount($correct_number, $data->names, format_string('Correct number of records returned by pager: @number', ['@number' => $correct_number])); + } + } + + /** + * Confirms that a pager query returns the correct results. + * + * Note that we have to make an HTTP request to a test page handler + * because the pager depends on GET parameters. + */ + public function testOddPagerQuery() { + // To keep the test from being too brittle, we determine up front + // what the page count should be dynamically, and pass the control + // information forward to the actual query on the other side of the + // HTTP request. + $limit = 2; + $count = db_query('SELECT COUNT(*) FROM {test_task}')->fetchField(); + + $correct_number = $limit; + $num_pages = floor($count / $limit); + + // If there is no remainder from rounding, subtract 1 since we index from 0. + if (!($num_pages * $limit < $count)) { + $num_pages--; + } + + for ($page = 0; $page <= $num_pages; ++$page) { + $this->drupalGet('database_test/pager_query_odd/' . $limit, ['query' => ['page' => $page]]); + $data = json_decode($this->getSession()->getPage()->getContent()); + + if ($page == $num_pages) { + $correct_number = $count - ($limit * $page); + } + + $this->assertCount($correct_number, $data->names, format_string('Correct number of records returned by pager: @number', ['@number' => $correct_number])); + } + } + + /** + * Confirms that a pager query results with an inner pager query are valid. + * + * This is a regression test for #467984. + */ + public function testInnerPagerQuery() { + $query = db_select('test', 't') + ->extend('Drupal\Core\Database\Query\PagerSelectExtender'); + $query + ->fields('t', ['age']) + ->orderBy('age') + ->limit(5); + + $outer_query = db_select($query); + $outer_query->addField('subquery', 'age'); + + $ages = $outer_query + ->execute() + ->fetchCol(); + $this->assertEqual($ages, [25, 26, 27, 28], 'Inner pager query returned the correct ages.'); + } + + /** + * Confirms that a paging query results with a having expression are valid. + * + * This is a regression test for #467984. + */ + public function testHavingPagerQuery() { + $query = db_select('test', 't') + ->extend('Drupal\Core\Database\Query\PagerSelectExtender'); + $query + ->fields('t', ['name']) + ->orderBy('name') + ->groupBy('name') + ->having('MAX(age) > :count', [':count' => 26]) + ->limit(5); + + $ages = $query + ->execute() + ->fetchCol(); + $this->assertEqual($ages, ['George', 'Ringo'], 'Pager query with having expression returned the correct ages.'); + } + + /** + * Confirms that every pager gets a valid, non-overlapping element ID. + */ + public function testElementNumbers() { + + $request = Request::createFromGlobals(); + $request->query->replace([ + 'page' => '3, 2, 1, 0', + ]); + \Drupal::getContainer()->get('request_stack')->push($request); + + $name = db_select('test', 't') + ->extend('Drupal\Core\Database\Query\PagerSelectExtender') + ->element(2) + ->fields('t', ['name']) + ->orderBy('age') + ->limit(1) + ->execute() + ->fetchField(); + $this->assertEqual($name, 'Paul', 'Pager query #1 with a specified element ID returned the correct results.'); + + // Setting an element smaller than the previous one + // should not overwrite the pager $maxElement with a smaller value. + $name = db_select('test', 't') + ->extend('Drupal\Core\Database\Query\PagerSelectExtender') + ->element(1) + ->fields('t', ['name']) + ->orderBy('age') + ->limit(1) + ->execute() + ->fetchField(); + $this->assertEqual($name, 'George', 'Pager query #2 with a specified element ID returned the correct results.'); + + $name = db_select('test', 't') + ->extend('Drupal\Core\Database\Query\PagerSelectExtender') + ->fields('t', ['name']) + ->orderBy('age') + ->limit(1) + ->execute() + ->fetchField(); + $this->assertEqual($name, 'John', 'Pager query #3 with a generated element ID returned the correct results.'); + + } + +}