‪TYPO3CMS  11.5
ConditionMatcherTest.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 Prophecy\PhpUnit\ProphecyTrait;
29 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
30 
34 class ‪ConditionMatcherTest extends FunctionalTestCase
35 {
36  use ProphecyTrait;
37 
41  protected function ‪setUp(): void
42  {
43  parent::setUp();
44 
45  $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/pages.xml');
46 
47  $backendUser = new ‪BackendUserAuthentication();
48  $backendUser->user['uid'] = 13;
49  $backendUser->user['admin'] = true;
50  $backendUser->userGroupsUID = [13, 14, 15];
51  GeneralUtility::makeInstance(Context::class)->setAspect('backend.user', new ‪UserAspect($backendUser));
52  }
53 
59  public function ‪usergroupConditionMatchesSingleGroupId(): void
60  {
61  $subject = $this->‪getConditionMatcher();
62  self::assertTrue($subject->match('[usergroup(13)]'));
63  self::assertTrue($subject->match('[usergroup("13")]'));
64  self::assertTrue($subject->match('[usergroup(\'13\')]'));
65  }
66 
73  {
74  $subject = $this->‪getConditionMatcher();
75  self::assertTrue($subject->match('[usergroup("999,15,14,13")]'));
76  self::assertTrue($subject->match('[usergroup(\'999,15,14,13\')]'));
77  }
78 
84  public function ‪userGroupInOperatorConditionMatchesGroupId(): void
85  {
86  $subject = $this->‪getConditionMatcher();
87  self::assertTrue($subject->match('[14 in backend.user.userGroupIds]'));
88  }
89 
95  public function ‪loginUserConditionMatchesAnyLoggedInUser(): void
96  {
97  $subject = $this->‪getConditionMatcher();
98  self::assertTrue($subject->match('[loginUser("*")]'));
99  self::assertTrue($subject->match('[loginUser(\'*\')]'));
100  }
101 
107  public function ‪loginUserConditionMatchesSingleLoggedInUser(): void
108  {
109  $subject = $this->‪getConditionMatcher();
110  self::assertTrue($subject->match('[loginUser(13)]'));
111  self::assertTrue($subject->match('[loginUser("13")]'));
112  self::assertTrue($subject->match('[loginUser(\'13\')]'));
113  }
114 
121  {
122  $subject = $this->‪getConditionMatcher();
123  self::assertFalse($subject->match('[loginUser(999)]'));
124  self::assertFalse($subject->match('[loginUser("999")]'));
125  self::assertFalse($subject->match('[loginUser(\'999\')]'));
126  }
127 
134  {
135  $subject = $this->‪getConditionMatcher();
136  self::assertTrue($subject->match('[loginUser("999,13")]'));
137  self::assertTrue($subject->match('[loginUser(\'999,13\')]'));
138  }
139 
145  public function ‪adminUserConditionMatchesAdminUser(): void
146  {
147  $subject = $this->‪getConditionMatcher();
148  self::assertTrue($subject->match('[backend.user.isAdmin == true]'));
149  self::assertTrue($subject->match('[backend.user.isAdmin != false]'));
150  self::assertTrue($subject->match('[backend.user.isAdmin]'));
151  }
152 
159  {
160  $this->‪setUpWorkspaceAspect(0);
161  $subject = $this->‪getConditionMatcher();
162  self::assertTrue($subject->match('[workspace.workspaceId === 0]'));
163  self::assertTrue($subject->match('[workspace.workspaceId == 0]'));
164  self::assertTrue($subject->match('[workspace.workspaceId == "0"]'));
165  self::assertTrue($subject->match('[workspace.workspaceId == \'0\']'));
166  }
167 
173  public function ‪workspaceIsLiveMatchesCorrectWorkspaceState(): void
174  {
175  $this->‪setUpWorkspaceAspect(1);
176  $subject = $this->‪getConditionMatcher();
177  self::assertFalse($subject->match('[workspace.isLive]'));
178  self::assertFalse($subject->match('[workspace.isLive === true]'));
179  self::assertFalse($subject->match('[workspace.isLive == true]'));
180  self::assertFalse($subject->match('[workspace.isLive !== false]'));
181  self::assertFalse($subject->match('[workspace.isLive != false]'));
182  }
183 
190  {
191  $this->‪setUpWorkspaceAspect(1);
192  $subject = $this->‪getConditionMatcher();
193  self::assertTrue($subject->match('[workspace.isOffline]'));
194  self::assertTrue($subject->match('[workspace.isOffline === true]'));
195  self::assertTrue($subject->match('[workspace.isOffline == true]'));
196  self::assertTrue($subject->match('[workspace.isOffline !== false]'));
197  self::assertTrue($subject->match('[workspace.isOffline != false]'));
198  }
199 
205  public function ‪treeLevelConditionMatchesSingleValue(): void
206  {
207  $subject = $this->‪getConditionMatcher(2);
208  self::assertTrue($subject->match('[tree.level == 2]'));
209  }
210 
216  public function ‪treeLevelConditionMatchesMultipleValues(): void
217  {
218  $subject = $this->‪getConditionMatcher(2);
219  self::assertTrue($subject->match('[tree.level in [999,998,2]]'));
220  }
221 
227  public function ‪treeLevelConditionDoesNotMatchFaultyValue(): void
228  {
229  $subject = $this->‪getConditionMatcher();
230  self::assertFalse($subject->match('[tree.level == 999]'));
231  }
232 
239  {
240  $subject = $this->‪getConditionMatcher(3);
241  self::assertTrue($subject->match('[2 in tree.rootLineParentIds]'));
242  self::assertTrue($subject->match('["2" in tree.rootLineParentIds]'));
243  self::assertTrue($subject->match('[\'2\' in tree.rootLineParentIds]'));
244  }
245 
252  {
253  $subject = $this->‪getConditionMatcher(3);
254  self::assertFalse($subject->match('[3 in tree.rootLineParentIds]'));
255  }
256 
263  {
264  $subject = $this->‪getConditionMatcher(3);
265  self::assertFalse($subject->match('[999 in tree.rootLineParentIds]'));
266  }
267 
274  {
275  $subject = $this->‪getConditionMatcher(3);
276  self::assertTrue($subject->match('[2 in tree.rootLineIds]'));
277  }
278 
285  {
286  $subject = $this->‪getConditionMatcher(3);
287  self::assertTrue($subject->match('[3 in tree.rootLineIds]'));
288  }
289 
296  {
297  $subject = $this->‪getConditionMatcher(3);
298  self::assertFalse($subject->match('[999 in tree.rootLineIds]'));
299  }
300 
307  public function ‪compatVersionConditionMatchesOlderRelease(): void
308  {
309  $subject = $this->‪getConditionMatcher();
310  self::assertTrue($subject->match('[compatVersion(7.0)]'));
311  self::assertTrue($subject->match('[compatVersion("7.0")]'));
312  self::assertTrue($subject->match('[compatVersion(\'7.0\')]'));
313  }
314 
321  public function ‪compatVersionConditionMatchesSameRelease(): void
322  {
323  $subject = $this->‪getConditionMatcher();
324  self::assertTrue($subject->match('[compatVersion(' . TYPO3_branch . ')]'));
325  self::assertTrue($subject->match('[compatVersion("' . TYPO3_branch . '")]'));
326  self::assertTrue($subject->match('[compatVersion(\'' . TYPO3_branch . '\')]'));
327  }
328 
335  public function compatVersionConditionDoesNotMatchNewerRelease(): void
336  {
337  $subject = $this->getConditionMatcher();
338  self::assertFalse($subject->match('[compatVersion(15.0)]'));
339  self::assertFalse($subject->match('[compatVersion("15.0")]'));
340  self::assertFalse($subject->match('[compatVersion(\'15.0\')]'));
341  }
342 
348  public function ‪genericGetVariablesSucceedsWithNamespaceENV(): void
349  {
350  $testKey = ‪StringUtility::getUniqueId('test');
351  putenv($testKey . '=testValue');
352  $subject = $this->‪getConditionMatcher();
353  self::assertTrue($subject->match('[getenv("' . $testKey . '") == "testValue"]'));
354  }
355 
359  public function ‪usingTSFEInATestInBeContextIsAlwaysFalse(): void
360  {
361  $subject = $this->‪getConditionMatcher();
362  self::assertFalse($subject->match('[getTSFE().id == 1]'));
363  }
364 
366  {
367  return [
368  'Page ID from "id" parameter' => [
369  ['id' => 6],
370  6,
371  ],
372  'Page ID from "edit" parameter' => [
373  [
374  'edit' => [
375  'pages' => [
376  6 => 'edit',
377  ],
378  ],
379  ],
380  6,
381  ],
382  'Page ID from "new" parameter' => [
383  [
384  'edit' => [
385  'pages' => [
386  -6 => 'new',
387  ],
388  ],
389  ],
390  5,
391  ],
392  'Page ID from "copy" parameter' => [
393  [
394  'cmd' => [
395  'pages' => [
396  5 => [
397  'copy' => 6,
398  ],
399  ],
400  ],
401  ],
402  6,
403  ],
404  'Page ID from "move" target parameter' => [
405  [
406  'cmd' => [
407  'pages' => [
408  5 => [
409  'move' => [
410  'target' => 6,
411  ],
412  ],
413  ],
414  ],
415  ],
416  6,
417  ],
418  ];
419  }
420 
425  public function ‪determinePageIdFindIdFromQueryParameters($queryParameters, $resultPageId): void
426  {
427  $_GET = $queryParameters;
428  $subject = GeneralUtility::makeInstance(ConditionMatcher::class);
429  self::assertEquals($resultPageId, $subject->getPageId());
430  }
431 
436  protected function ‪getConditionMatcher(int $pageId = null): ConditionMatcher
437  {
438  $conditionMatcher = new ConditionMatcher(null, $pageId);
439  $conditionMatcher->setLogger($this->prophesize(Logger::class)->reveal());
440 
441  return $conditionMatcher;
442  }
443 
449  protected function ‪setUpWorkspaceAspect(int $workspaceId): void
450  {
451  GeneralUtility::makeInstance(Context::class)->setAspect('workspace', new WorkspaceAspect($workspaceId));
452  }
453 }
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\genericGetVariablesSucceedsWithNamespaceENV
‪genericGetVariablesSucceedsWithNamespaceENV()
Definition: ConditionMatcherTest.php:347
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\treeLevelConditionMatchesMultipleValues
‪treeLevelConditionMatchesMultipleValues()
Definition: ConditionMatcherTest.php:215
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\usingTSFEInATestInBeContextIsAlwaysFalse
‪usingTSFEInATestInBeContextIsAlwaysFalse()
Definition: ConditionMatcherTest.php:358
‪TYPO3\CMS\Core\Context\WorkspaceAspect
Definition: WorkspaceAspect.php:31
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\treeLevelConditionMatchesSingleValue
‪treeLevelConditionMatchesSingleValue()
Definition: ConditionMatcherTest.php:204
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\loginUserConditionMatchesMultipleLoggedInUsers
‪loginUserConditionMatchesMultipleLoggedInUsers()
Definition: ConditionMatcherTest.php:132
‪TYPO3\CMS\Backend\Configuration\TypoScript\ConditionMatching\ConditionMatcher
Definition: ConditionMatcher.php:31
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\loginUserConditionDoesNotMatchSingleLoggedInUser
‪loginUserConditionDoesNotMatchSingleLoggedInUser()
Definition: ConditionMatcherTest.php:119
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\adminUserConditionMatchesAdminUser
‪adminUserConditionMatchesAdminUser()
Definition: ConditionMatcherTest.php:144
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\workspaceIdConditionMatchesCurrentWorkspaceId
‪workspaceIdConditionMatchesCurrentWorkspaceId()
Definition: ConditionMatcherTest.php:157
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\compatVersionConditionMatchesSameRelease
‪compatVersionConditionMatchesSameRelease()
Definition: ConditionMatcherTest.php:320
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\workspaceIsLiveMatchesCorrectWorkspaceState
‪workspaceIsLiveMatchesCorrectWorkspaceState()
Definition: ConditionMatcherTest.php:172
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\loginUserConditionMatchesAnyLoggedInUser
‪loginUserConditionMatchesAnyLoggedInUser()
Definition: ConditionMatcherTest.php:94
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\setUp
‪setUp()
Definition: ConditionMatcherTest.php:40
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\getConditionMatcher
‪ConditionMatcher getConditionMatcher(int $pageId=null)
Definition: ConditionMatcherTest.php:435
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\usergroupConditionMatchesSingleGroupId
‪usergroupConditionMatchesSingleGroupId()
Definition: ConditionMatcherTest.php:58
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:53
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\PIDinRootlineConditionDoesNotMatchPageIdNotInRootline
‪PIDinRootlineConditionDoesNotMatchPageIdNotInRootline()
Definition: ConditionMatcherTest.php:294
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\PIDupinRootlineConditionMatchesSinglePageIdInRootline
‪PIDupinRootlineConditionMatchesSinglePageIdInRootline()
Definition: ConditionMatcherTest.php:237
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\PIDinRootlineConditionMatchesSinglePageIdInRootline
‪PIDinRootlineConditionMatchesSinglePageIdInRootline()
Definition: ConditionMatcherTest.php:272
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\workspaceIsOfflineMatchesCorrectWorkspaceState
‪workspaceIsOfflineMatchesCorrectWorkspaceState()
Definition: ConditionMatcherTest.php:188
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\determinePageIdFindIdFromQueryParameters
‪determinePageIdFindIdFromQueryParameters($queryParameters, $resultPageId)
Definition: ConditionMatcherTest.php:424
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\usergroupConditionMatchesMultipleUserGroupId
‪usergroupConditionMatchesMultipleUserGroupId()
Definition: ConditionMatcherTest.php:71
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\PIDinRootlineConditionMatchesLastPageIdInRootline
‪PIDinRootlineConditionMatchesLastPageIdInRootline()
Definition: ConditionMatcherTest.php:283
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\determinePageIdFindIdFromQueryParametersDataProvider
‪determinePageIdFindIdFromQueryParametersDataProvider()
Definition: ConditionMatcherTest.php:364
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\loginUserConditionMatchesSingleLoggedInUser
‪loginUserConditionMatchesSingleLoggedInUser()
Definition: ConditionMatcherTest.php:106
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static string getUniqueId($prefix='')
Definition: StringUtility.php:128
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\PIDupinRootlineConditionDoesNotMatchPageIdNotInRootline
‪PIDupinRootlineConditionDoesNotMatchPageIdNotInRootline()
Definition: ConditionMatcherTest.php:261
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\userGroupInOperatorConditionMatchesGroupId
‪userGroupInOperatorConditionMatchesGroupId()
Definition: ConditionMatcherTest.php:83
‪TYPO3\CMS\Core\Log\Logger
Definition: Logger.php:27
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\setUpWorkspaceAspect
‪setUpWorkspaceAspect(int $workspaceId)
Definition: ConditionMatcherTest.php:448
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\PIDupinRootlineConditionDoesNotMatchLastPageIdInRootline
‪PIDupinRootlineConditionDoesNotMatchLastPageIdInRootline()
Definition: ConditionMatcherTest.php:250
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\compatVersionConditionMatchesOlderRelease
‪compatVersionConditionMatchesOlderRelease()
Definition: ConditionMatcherTest.php:306
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest\treeLevelConditionDoesNotMatchFaultyValue
‪treeLevelConditionDoesNotMatchFaultyValue()
Definition: ConditionMatcherTest.php:226
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:22
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching
Definition: ConditionMatcherTest.php:18
‪TYPO3\CMS\Core\Context\UserAspect
Definition: UserAspect.php:37
‪TYPO3\CMS\Backend\Tests\Functional\Configuration\TypoScript\ConditionMatching\ConditionMatcherTest
Definition: ConditionMatcherTest.php:35