Version 1
[yaffs-website] / web / core / modules / views / tests / src / Kernel / Entity / RowEntityRenderersTest.php
1 <?php
2
3 namespace Drupal\Tests\views\Kernel\Entity;
4
5 use Drupal\language\Entity\ConfigurableLanguage;
6 use Drupal\node\Entity\NodeType;
7 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
8 use Drupal\views\Views;
9
10 /**
11  * Tests the entity row renderers.
12  *
13  * @group views
14  * @see \Drupal\views\Entity\Render\RendererBase
15  */
16 class RowEntityRenderersTest extends ViewsKernelTestBase {
17
18   /**
19    * Modules to enable.
20    *
21    * @var array
22    */
23   public static $modules = ['field', 'filter', 'text', 'node', 'user', 'language', 'views_test_language'];
24
25   /**
26    * Views used by this test.
27    *
28    * @var array
29    */
30   public static $testViews = ['test_entity_row_renderers'];
31
32   /**
33    * An array of added languages.
34    *
35    * @var array
36    */
37   protected $langcodes;
38
39   /**
40    * An array of titles for each node per language.
41    *
42    * @var array
43    */
44   protected $expected;
45
46   /**
47    * {@inheritdoc}
48    */
49   protected function setUp($import_test_views = TRUE) {
50     parent::setUp();
51
52     $this->installEntitySchema('node');
53     $this->installEntitySchema('user');
54     $this->installSchema('node', ['node_access']);
55     $this->installConfig(['node', 'language']);
56
57     // The entity.node.canonical route must exist when nodes are rendered.
58     $this->container->get('router.builder')->rebuild();
59
60     $this->langcodes = [\Drupal::languageManager()->getDefaultLanguage()->getId()];
61     for ($i = 0; $i < 2; $i++) {
62       $langcode = 'l' . $i;
63       $this->langcodes[] = $langcode;
64       ConfigurableLanguage::createFromLangcode($langcode)->save();
65     }
66
67     // Make sure we do not try to render non-existing user data.
68     $node_type = NodeType::create(['type' => 'test']);
69     $node_type->setDisplaySubmitted(FALSE);
70     $node_type->save();
71
72     $this->values = [];
73     $controller = \Drupal::entityManager()->getStorage('node');
74     $langcode_index = 0;
75
76     for ($i = 0; $i < count($this->langcodes); $i++) {
77       // Create a node with a different default language each time.
78       $default_langcode = $this->langcodes[$langcode_index++];
79       $node = $controller->create(['type' => 'test', 'uid' => 0, 'langcode' => $default_langcode]);
80       // Ensure the default language is processed first.
81       $langcodes = array_merge([$default_langcode], array_diff($this->langcodes, [$default_langcode]));
82
83       foreach ($langcodes as $langcode) {
84         // Ensure we have a predictable result order.
85         $this->values[$i][$langcode] = $i . '-' . $langcode . '-' . $this->randomMachineName();
86
87         if ($langcode != $default_langcode) {
88           $node->addTranslation($langcode, ['title' => $this->values[$i][$langcode]]);
89         }
90         else {
91           $node->setTitle($this->values[$i][$langcode]);
92         }
93
94         $node->save();
95       }
96     }
97   }
98
99   /**
100    * Tests the entity row renderers.
101    */
102   public function testEntityRenderers() {
103     $this->checkLanguageRenderers('page_1', $this->values);
104   }
105
106   /**
107    * Tests the field row renderers.
108    */
109   public function testFieldRenderers() {
110     $this->checkLanguageRenderers('page_2', $this->values);
111   }
112
113   /**
114    * Checks that the language renderer configurations work as expected.
115    *
116    * @param string $display
117    *   Name of display to test with.
118    * @param array $values
119    *   An array of node information which are each an array of node titles
120    *   associated with language keys appropriate for the translation of that
121    *   node.
122    */
123   protected function checkLanguageRenderers($display, $values) {
124     $expected = [
125       $values[0]['en'],
126       $values[0]['en'],
127       $values[0]['en'],
128       $values[1]['en'],
129       $values[1]['en'],
130       $values[1]['en'],
131       $values[2]['en'],
132       $values[2]['en'],
133       $values[2]['en'],
134     ];
135     $this->assertTranslations($display, '***LANGUAGE_language_content***', $expected, 'The current language renderer behaves as expected.');
136
137     $expected = [
138       $values[0]['en'],
139       $values[0]['en'],
140       $values[0]['en'],
141       $values[1]['l0'],
142       $values[1]['l0'],
143       $values[1]['l0'],
144       $values[2]['l1'],
145       $values[2]['l1'],
146       $values[2]['l1'],
147     ];
148     $this->assertTranslations($display, '***LANGUAGE_entity_default***', $expected, 'The default language renderer behaves as expected.');
149
150     $expected = [
151       $values[0]['en'],
152       $values[0]['l0'],
153       $values[0]['l1'],
154       $values[1]['en'],
155       $values[1]['l0'],
156       $values[1]['l1'],
157       $values[2]['en'],
158       $values[2]['l0'],
159       $values[2]['l1'],
160     ];
161     $this->assertTranslations($display, '***LANGUAGE_entity_translation***', $expected, 'The translation language renderer behaves as expected.');
162
163     $expected = [
164       $values[0][$this->langcodes[0]],
165       $values[0][$this->langcodes[0]],
166       $values[0][$this->langcodes[0]],
167       $values[1][$this->langcodes[0]],
168       $values[1][$this->langcodes[0]],
169       $values[1][$this->langcodes[0]],
170       $values[2][$this->langcodes[0]],
171       $values[2][$this->langcodes[0]],
172       $values[2][$this->langcodes[0]],
173     ];
174     $this->assertTranslations($display, '***LANGUAGE_site_default***', $expected, 'The site default language renderer behaves as expected.');
175
176     $expected = [
177       $values[0]['l0'],
178       $values[0]['l0'],
179       $values[0]['l0'],
180       $values[1]['l0'],
181       $values[1]['l0'],
182       $values[1]['l0'],
183       $values[2]['l0'],
184       $values[2]['l0'],
185       $values[2]['l0'],
186     ];
187     $this->assertTranslations($display, 'l0', $expected, 'The language specific renderer behaves as expected.');
188   }
189
190   /**
191    * Checks that the view results match the expected values.
192    *
193    * @param string $display
194    *   Name of display to test with.
195    * @param string $renderer_id
196    *   The id of the renderer to be tested.
197    * @param array $expected
198    *   An array of expected title translation values, one for each result row.
199    * @param string $message
200    *   (optional) A message to display with the assertion.
201    * @param string $group
202    *   (optional) The group this message is in.
203    *
204    * @return bool
205    *   TRUE if the assertion succeeded, FALSE otherwise.
206    */
207   protected function assertTranslations($display, $renderer_id, array $expected, $message = '', $group = 'Other') {
208     $view = Views::getView('test_entity_row_renderers');
209     $view->storage->invalidateCaches();
210     $view->setDisplay($display);
211     $view->getDisplay()->setOption('rendering_language', $renderer_id);
212     $view->preview();
213
214     $result = FALSE;
215     foreach ($expected as $index => $expected_output) {
216       if (!empty($view->result[$index])) {
217         $build = $view->rowPlugin->render($view->result[$index]);
218         $output = \Drupal::service('renderer')->renderRoot($build);
219         $result = strpos($output, $expected_output) !== FALSE;
220         if (!$result) {
221           break;
222         }
223       }
224       else {
225         $result = FALSE;
226         break;
227       }
228     }
229
230     return $this->assertTrue($result, $message, $group);
231   }
232
233 }