Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / web / core / modules / views / tests / src / Kernel / Handler / SortRandomTest.php
1 <?php
2
3 namespace Drupal\Tests\views\Kernel\Handler;
4
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;
9
10 /**
11  * Tests for core Drupal\views\Plugin\views\sort\Random handler.
12  *
13  * @group views
14  */
15 class SortRandomTest extends ViewsKernelTestBase {
16
17   /**
18    * Views used by this test.
19    *
20    * @var array
21    */
22   public static $testViews = ['test_view'];
23
24   /**
25    * Add more items to the test set, to make the order tests more robust.
26    *
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
30    * eddington number.
31    *
32    * @see http://wikipedia.org/wiki/Eddington_number
33    */
34   protected function dataSet() {
35     $data = parent::dataSet();
36     for ($i = 0; $i < 55; $i++) {
37       $data[] = [
38         'name' => 'name_' . $i,
39         'age' => $i,
40         'job' => 'job_' . $i,
41         'created' => rand(0, time()),
42         'status' => 1,
43       ];
44     }
45     return $data;
46   }
47
48   /**
49    * Return a basic view with random ordering.
50    */
51   protected function getBasicRandomView() {
52     $view = Views::getView('test_view');
53     $view->setDisplay();
54
55     // Add a random ordering.
56     $view->displayHandlers->get('default')->overrideOption('sorts', [
57       'random' => [
58         'id' => 'random',
59         'field' => 'random',
60         'table' => 'views',
61       ],
62     ]);
63
64     return $view;
65   }
66
67   /**
68    * Tests random ordering of the result set.
69    *
70    * @see DatabaseSelectTestCase::testRandomOrder()
71    */
72   public function testRandomOrdering() {
73     // Execute a basic view first.
74     $view = Views::getView('test_view');
75     $this->executeView($view);
76
77     // Verify the result.
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',
82     ]);
83
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',
91     ]);
92
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',
100     ]);
101   }
102
103   /**
104    * Tests random ordering with tags based caching.
105    *
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.
108    */
109   public function testRandomOrderingWithRenderCaching() {
110     $view_random = $this->getBasicRandomView();
111
112     $display = &$view_random->storage->getDisplay('default');
113     $display['display_options']['cache'] = [
114       'type' => 'tag',
115     ];
116
117     $view_random->storage->save();
118
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');
123
124     $original = $build = DisplayPluginBase::buildBasicRenderable($view_random->id(), 'default');
125     $result = $renderer->renderPlain($build);
126
127     $original['#cache'] += ['contexts' => []];
128     $original['#cache']['contexts'] = Cache::mergeContexts($original['#cache']['contexts'], $this->container->getParameter('renderer.config')['required_cache_contexts']);
129
130     $this->assertFalse($render_cache->get($original), 'Ensure there is no render cache entry.');
131
132     $build = DisplayPluginBase::buildBasicRenderable($view_random->id(), 'default');
133     $result2 = $renderer->renderPlain($build);
134
135     // Ensure that the random ordering works and don't produce the same result.
136     $this->assertNotEqual($result, $result2);
137   }
138
139 }