‪TYPO3CMS  ‪main
ElementBrowserTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
25 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
26 
27 final class ‪ElementBrowserTest extends UnitTestCase
28 {
29  #[Test]
31  {
32  $elementBrowser = new ‪ElementBrowser($this->createMock(InlineStackProcessor::class));
33  $elementBrowser->setData([
34  'fieldName' => 'somefield',
35  'isInlineChild' => false,
36  'tableName' => 'tt_content',
37  'inlineStructure' => [],
38  'renderData' => [
39  'fieldControlOptions' => [],
40  ],
41  'parameterArray' => [
42  'itemFormElName' => '',
43  'fieldConf' => [
44  'config' => [
45  'type' => 'group',
46  'allowed' => 'be_users, be_groups',
47  ],
48  ],
49  ],
50  ]);
51 
52  $result = $elementBrowser->render();
53  self::assertSame($result['linkAttributes']['data-params'], '|||be_users,be_groups|');
54  }
55 
56  #[Test]
57  public function ‪renderTrimsAllowedValues(): void
58  {
59  $elementBrowser = new ‪ElementBrowser($this->createMock(InlineStackProcessor::class));
60  $elementBrowser->setData([
61  'fieldName' => 'somefield',
62  'isInlineChild' => false,
63  'tableName' => 'tt_content',
64  'inlineStructure' => [],
65  'renderData' => [
66  'fieldControlOptions' => [],
67  ],
68  'parameterArray' => [
69  'itemFormElName' => '',
70  'fieldConf' => [
71  'config' => [
72  'type' => 'file',
73  'allowed' => 'jpg, png',
74  ],
75  ],
76  ],
77  ]);
78  $result = $elementBrowser->render();
79  self::assertSame($result['linkAttributes']['data-params'], '|||jpg,png|');
80  }
81 
82  public static function ‪renderResolvesEntryPointDataProvider(): \Generator
83  {
84  yield 'Wildcard' => [
85  [
86  'type' => 'group',
87  'allowed' => '*',
88  'elementBrowserEntryPoints' => [
89  '_default' => 123,
90  ],
91  ],
92  '123',
93  ];
94  yield 'One table' => [
95  [
96  'type' => 'group',
97  'allowed' => 'pages',
98  'elementBrowserEntryPoints' => [
99  'pages' => 123,
100  ],
101  ],
102  '123',
103  ];
104  yield 'One table with default' => [
105  [
106  'type' => 'group',
107  'allowed' => 'pages',
108  'elementBrowserEntryPoints' => [
109  '_default' => 123,
110  ],
111  ],
112  '123',
113  ];
114  yield 'One table with default and table definition' => [
115  [
116  'type' => 'group',
117  'allowed' => 'pages',
118  'elementBrowserEntryPoints' => [
119  '_default' => 123,
120  'pages' => 124,
121  ],
122  ],
123  '123',
124  ];
125  yield 'One table with invalid configuration' => [
126  [
127  'type' => 'group',
128  'allowed' => 'pages',
129  'elementBrowserEntryPoints' => [
130  'some_table' => 123,
131  ],
132  ],
133  '',
134  ];
135  yield 'Two tables without _default' => [
136  [
137  'type' => 'group',
138  'allowed' => 'pages,some_table',
139  'elementBrowserEntryPoints' => [
140  'pages' => 123,
141  'some_table' => 124,
142  ],
143  ],
144  '',
145  ];
146  yield 'Two tables with _default' => [
147  [
148  'type' => 'group',
149  'allowed' => 'pages,some_table',
150  'elementBrowserEntryPoints' => [
151  '_default' => 123,
152  'pages' => 124,
153  'some_table' => 125,
154  ],
155  ],
156  '123',
157  ];
158  yield 'Folder' => [
159  [
160  'type' => 'folder',
161  'elementBrowserEntryPoints' => [
162  '_default' => '1:/storage/',
163  ],
164  ],
165  '1:/storage/',
166  ];
167  yield 'Folder without mandatory _default' => [
168  [
169  'type' => 'folder',
170  'elementBrowserEntryPoints' => [
171  'file' => 123,
172  ],
173  ],
174  '',
175  ];
176  yield 'Entry point is not escaped' => [ // Escaping is later done by calling code (FieldControl::render())
177  [
178  'type' => 'folder',
179  'elementBrowserEntryPoints' => [
180  '_default' => '1:/<script>alert(1)</script>/',
181  ],
182  ],
183  '1:/<script>alert(1)</script>/',
184  ];
185  yield 'Pid placeholder is resolved' => [
186  [
187  'type' => 'group',
188  'allowed' => '*',
189  'elementBrowserEntryPoints' => [
190  '_default' => '###CURRENT_PID###',
191  ],
192  ],
193  '123',
194  ];
195  yield 'Site placeholder is resolved' => [
196  [
197  'type' => 'group',
198  'allowed' => '*',
199  'elementBrowserEntryPoints' => [
200  '_default' => '###SITEROOT###',
201  ],
202  ],
203  '123',
204  ];
205  }
206 
207  #[DataProvider('renderResolvesEntryPointDataProvider')]
208  #[Test]
209  public function ‪renderResolvesEntryPoint(array $config, string $expected): void
210  {
211  $elementBrowser = new ‪ElementBrowser($this->createMock(InlineStackProcessor::class));
212  $elementBrowser->setData([
213  'fieldName' => 'somefield',
214  'isInlineChild' => false,
215  'effectivePid' => 123,
216  'site' => new ‪Site('some-site', 123, []),
217  'tableName' => 'tt_content',
218  'inlineStructure' => [],
219  'renderData' => [
220  'fieldControlOptions' => [],
221  ],
222  'parameterArray' => [
223  'itemFormElName' => '',
224  'fieldConf' => [
225  'config' => $config,
226  ],
227  ],
228  ]);
229  $result = $elementBrowser->render();
230  self::assertEquals($expected, $result['linkAttributes']['data-entry-point'] ?? '');
231  }
232 
233  #[Test]
234  public function ‪renderUsesCustomTitle(): void
235  {
236  $title = 'Custom title';
237  $elementBrowser = new ‪ElementBrowser($this->createMock(InlineStackProcessor::class));
238  $elementBrowser->setData([
239  'fieldName' => 'somefield',
240  'isInlineChild' => false,
241  'tableName' => 'tt_content',
242  'renderData' => [
243  'fieldControlOptions' => [
244  'title' => $title,
245  ],
246  ],
247  'inlineStructure' => [],
248  'parameterArray' => [
249  'itemFormElName' => '',
250  'fieldConf' => [
251  'config' => [
252  'type' => 'group',
253  'allowed' => 'pages',
254  ],
255  ],
256  ],
257  ]);
258  $result = $elementBrowser->render();
259  self::assertSame($title, $result['title']);
260  }
261 
262  #[Test]
263  public function ‪renderUsesFallbackTitle(): void
264  {
265  $elementBrowser = new ‪ElementBrowser($this->createMock(InlineStackProcessor::class));
266  $elementBrowser->setData([
267  'fieldName' => 'somefield',
268  'isInlineChild' => false,
269  'tableName' => 'tt_content',
270  'renderData' => [
271  'fieldControlOptions' => [],
272  ],
273  'inlineStructure' => [],
274  'parameterArray' => [
275  'itemFormElName' => '',
276  'fieldConf' => [
277  'config' => [
278  'type' => 'user',
279  'allowed' => 'pages',
280  ],
281  ],
282  ],
283  ]);
284  $result = $elementBrowser->render();
285  self::assertSame('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.browse_elements', $result['title']);
286  }
287 }
‪TYPO3\CMS\Backend\Tests\Unit\Form\FieldControl\ElementBrowserTest\renderUsesFallbackTitle
‪renderUsesFallbackTitle()
Definition: ElementBrowserTest.php:263
‪TYPO3\CMS\Backend\Tests\Unit\Form\FieldControl\ElementBrowserTest\renderResolvesEntryPointDataProvider
‪static renderResolvesEntryPointDataProvider()
Definition: ElementBrowserTest.php:82
‪TYPO3\CMS\Backend\Form\FieldControl\ElementBrowser
Definition: ElementBrowser.php:31
‪TYPO3\CMS\Core\Site\Entity\Site
Definition: Site.php:42
‪TYPO3\CMS\Backend\Tests\Unit\Form\FieldControl\ElementBrowserTest
Definition: ElementBrowserTest.php:28
‪TYPO3\CMS\Backend\Tests\Unit\Form\FieldControl\ElementBrowserTest\renderTrimsAllowedValues
‪renderTrimsAllowedValues()
Definition: ElementBrowserTest.php:57
‪TYPO3\CMS\Backend\Tests\Unit\Form\FieldControl
Definition: ElementBrowserTest.php:18
‪TYPO3\CMS\Backend\Tests\Unit\Form\FieldControl\ElementBrowserTest\renderTrimsAllowedValuesFromConfigSection
‪renderTrimsAllowedValuesFromConfigSection()
Definition: ElementBrowserTest.php:30
‪TYPO3\CMS\Backend\Tests\Unit\Form\FieldControl\ElementBrowserTest\renderResolvesEntryPoint
‪renderResolvesEntryPoint(array $config, string $expected)
Definition: ElementBrowserTest.php:209
‪TYPO3\CMS\Backend\Form\InlineStackProcessor
Definition: InlineStackProcessor.php:32
‪TYPO3\CMS\Backend\Tests\Unit\Form\FieldControl\ElementBrowserTest\renderUsesCustomTitle
‪renderUsesCustomTitle()
Definition: ElementBrowserTest.php:234