3 namespace Drupal\Tests\views\Kernel\Handler;
5 use Drupal\Core\Cache\Cache;
6 use Drupal\views\Plugin\views\display\DisplayPluginBase;
7 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
8 use Drupal\views\Views;
11 * Tests for core Drupal\views\Plugin\views\sort\Random handler.
15 class SortRandomTest extends ViewsKernelTestBase {
18 * Views used by this test.
22 public static $testViews = ['test_view'];
25 * Add more items to the test set, to make the order tests more robust.
27 * In total we have then 60 entries, which makes a probability of a collision
28 * of 1/60!, which is around 1/1E80, which is higher than the estimated amount
29 * of protons / electrons in the observable universe, also called the
32 * @see http://wikipedia.org/wiki/Eddington_number
34 protected function dataSet() {
35 $data = parent::dataSet();
36 for ($i = 0; $i < 55; $i++) {
38 'name' => 'name_' . $i,
41 'created' => rand(0, time()),
49 * Return a basic view with random ordering.
51 protected function getBasicRandomView() {
52 $view = Views::getView('test_view');
55 // Add a random ordering.
56 $view->displayHandlers->get('default')->overrideOption('sorts', [
68 * Tests random ordering of the result set.
70 * @see DatabaseSelectTestCase::testRandomOrder()
72 public function testRandomOrdering() {
73 // Execute a basic view first.
74 $view = Views::getView('test_view');
75 $this->executeView($view);
78 $this->assertEqual(count($this->dataSet()), count($view->result), 'The number of returned rows match.');
79 $this->assertIdenticalResultset($view, $this->dataSet(), [
80 'views_test_data_name' => 'name',
81 'views_test_data_age' => 'age',
84 // Execute a random view, we expect the result set to be different.
85 $view_random = $this->getBasicRandomView();
86 $this->executeView($view_random);
87 $this->assertEqual(count($this->dataSet()), count($view_random->result), 'The number of returned rows match.');
88 $this->assertNotIdenticalResultset($view_random, $view->result, [
89 'views_test_data_name' => 'views_test_data_name',
90 'views_test_data_age' => 'views_test_data_name',
93 // Execute a second random view, we expect the result set to be different again.
94 $view_random_2 = $this->getBasicRandomView();
95 $this->executeView($view_random_2);
96 $this->assertEqual(count($this->dataSet()), count($view_random_2->result), 'The number of returned rows match.');
97 $this->assertNotIdenticalResultset($view_random, $view->result, [
98 'views_test_data_name' => 'views_test_data_name',
99 'views_test_data_age' => 'views_test_data_name',
104 * Tests random ordering with tags based caching.
106 * The random sorting should opt out of caching by defining a max age of 0.
107 * At the same time, the row render caching still works.
109 public function testRandomOrderingWithRenderCaching() {
110 $view_random = $this->getBasicRandomView();
112 $display = &$view_random->storage->getDisplay('default');
113 $display['display_options']['cache'] = [
117 $view_random->storage->save();
119 /** @var \Drupal\Core\Render\RendererInterface $renderer */
120 $renderer = \Drupal::service('renderer');
121 /** @var \Drupal\Core\Render\RenderCacheInterface $render_cache */
122 $render_cache = \Drupal::service('render_cache');
124 $original = $build = DisplayPluginBase::buildBasicRenderable($view_random->id(), 'default');
125 $result = $renderer->renderPlain($build);
127 $original['#cache'] += ['contexts' => []];
128 $original['#cache']['contexts'] = Cache::mergeContexts($original['#cache']['contexts'], $this->container->getParameter('renderer.config')['required_cache_contexts']);
130 $this->assertFalse($render_cache->get($original), 'Ensure there is no render cache entry.');
132 $build = DisplayPluginBase::buildBasicRenderable($view_random->id(), 'default');
133 $result2 = $renderer->renderPlain($build);
135 // Ensure that the random ordering works and don't produce the same result.
136 $this->assertNotEqual($result, $result2);