Skip to content
Snippets Groups Projects
Commit 71078914 authored by Christian Kuhn's avatar Christian Kuhn Committed by Stefan Bürk
Browse files

[TASK] Avoid MockEventDispatcher

The MockEventDispatcher unit test fixture became
useless with introduction of NoopEventDispatcher.

The patch removes last remains: Most simply inject
NoopEventDispatcher, some others create a mock of
EventDispatcherInterface and use it for event
manipulation when testing $subjects that act on
event results.

Resolves: #104273
Related: #97449
Related: #98016
Releases: main
Change-Id: I0babc60cdd3c87bf9f25a931edfd3f47f642bfae
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/85032


Tested-by: default avatarcore-ci <typo3@b13.com>
Tested-by: default avatarStefan Bürk <stefan@buerk.tech>
Tested-by: default avatarAnja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: default avatarStefan Bürk <stefan@buerk.tech>
Reviewed-by: default avatarAnja Leichsenring <aleichsenring@ab-softlab.de>
parent 7e6e733c
Branches
Tags
No related merge requests found
......@@ -16,6 +16,7 @@
namespace TYPO3\CMS\Backend\Form\FormDataProvider;
use Psr\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
use TYPO3\CMS\Backend\Form\Event\ModifyEditFormUserAccessEvent;
use TYPO3\CMS\Backend\Form\Exception\AccessDeniedContentEditException;
use TYPO3\CMS\Backend\Form\Exception\AccessDeniedEditInternalsException;
......@@ -29,13 +30,15 @@ use TYPO3\CMS\Backend\Form\FormDataProviderInterface;
use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
use TYPO3\CMS\Core\Type\Bitmask\Permission;
use TYPO3\CMS\Core\Utility\GeneralUtility;
/**
* Determine user permission for action and check them
*/
class DatabaseUserPermissionCheck implements FormDataProviderInterface
#[Autoconfigure(public: true)]
readonly class DatabaseUserPermissionCheck implements FormDataProviderInterface
{
public function __construct(private EventDispatcherInterface $eventDispatcher) {}
/**
* Set userPermissionOnPage to result array and check access rights.
*
......@@ -147,7 +150,7 @@ class DatabaseUserPermissionCheck implements FormDataProviderInterface
}
}
$userHasAccess = GeneralUtility::makeInstance(EventDispatcherInterface::class)->dispatch(
$userHasAccess = $this->eventDispatcher->dispatch(
new ModifyEditFormUserAccessEvent(
$exception,
$result['tableName'],
......
......@@ -31,9 +31,7 @@ use TYPO3\CMS\Backend\Form\Exception\AccessDeniedTableModifyException;
use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseUserPermissionCheck;
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
use TYPO3\CMS\Core\Tests\Unit\Fixtures\EventDispatcher\MockEventDispatcher;
use TYPO3\CMS\Core\Type\Bitmask\Permission;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
final class DatabaseUserPermissionCheckTest extends UnitTestCase
......@@ -52,9 +50,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
public function addDataSetsUserPermissionsOnPageForAdminUser(): void
{
$this->beUserMock->method('isAdmin')->willReturn(true);
$result = (new DatabaseUserPermissionCheck())->addData([]);
$result = (new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData([]);
self::assertSame(Permission::ALL, $result['userPermissionOnPage']);
}
......@@ -70,7 +66,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->expectException(AccessDeniedTableModifyException::class);
$this->expectExceptionCode(1437683248);
(new DatabaseUserPermissionCheck())->addData($input);
(new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
}
#[Test]
......@@ -93,10 +89,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->expectException(AccessDeniedContentEditException::class);
$this->expectExceptionCode(1437679657);
$eventDispatcher = new MockEventDispatcher();
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
(new DatabaseUserPermissionCheck())->addData($input);
(new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
}
#[Test]
......@@ -115,12 +108,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->beUserMock->method('check')->with('tables_modify', $input['tableName'])->willReturn(true);
$this->beUserMock->method('calcPerms')->with(['pid' => 321])->willReturn(Permission::CONTENT_EDIT);
$this->beUserMock->method('recordEditAccessInternals')->with($input['tableName'], self::anything())->willReturn(true);
$eventDispatcher = new MockEventDispatcher();
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
$result = (new DatabaseUserPermissionCheck())->addData($input);
$result = (new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
self::assertSame(Permission::CONTENT_EDIT, $result['userPermissionOnPage']);
}
......@@ -143,10 +131,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->expectException(AccessDeniedPageEditException::class);
$this->expectExceptionCode(1437679336);
$eventDispatcher = new MockEventDispatcher();
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
(new DatabaseUserPermissionCheck())->addData($input);
(new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
}
#[Test]
......@@ -184,10 +169,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->expectException(AccessDeniedPageEditException::class);
$this->expectExceptionCode(1437679336);
$eventDispatcher = new MockEventDispatcher();
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
(new DatabaseUserPermissionCheck())->addData($input);
(new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
}
#[Test]
......@@ -222,10 +204,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->beUserMock->method('calcPerms')->with($input['databaseRow'])->willReturn(Permission::PAGE_EDIT);
$this->beUserMock->method('recordEditAccessInternals')->with($input['tableName'], self::anything())->willReturn(true);
$eventDispatcher = new MockEventDispatcher();
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
$result = (new DatabaseUserPermissionCheck())->addData($input);
$result = (new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
self::assertSame(Permission::PAGE_EDIT, $result['userPermissionOnPage']);
}
......@@ -247,10 +226,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->beUserMock->method('recordEditAccessInternals')->with($input['tableName'], self::anything())->willReturn(true);
$GLOBALS['TCA'][$input['tableName']]['ctrl']['security']['ignoreRootLevelRestriction'] = true;
$eventDispatcher = new MockEventDispatcher();
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
$result = (new DatabaseUserPermissionCheck())->addData($input);
$result = (new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
self::assertSame(Permission::ALL, $result['userPermissionOnPage']);
}
......@@ -274,10 +250,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->expectException(AccessDeniedRootNodeException::class);
$this->expectExceptionCode(1437679856);
$eventDispatcher = new MockEventDispatcher();
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
(new DatabaseUserPermissionCheck())->addData($input);
(new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
}
#[Test]
......@@ -301,10 +274,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->expectException(AccessDeniedEditInternalsException::class);
$this->expectExceptionCode(1437687404);
$eventDispatcher = new MockEventDispatcher();
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
(new DatabaseUserPermissionCheck())->addData($input);
(new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
}
#[Test]
......@@ -327,10 +297,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->expectException(AccessDeniedContentEditException::class);
$this->expectExceptionCode(1437745759);
$eventDispatcher = new MockEventDispatcher();
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
(new DatabaseUserPermissionCheck())->addData($input);
(new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
}
#[Test]
......@@ -355,10 +322,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->expectException(AccessDeniedPageNewException::class);
$this->expectExceptionCode(1437745640);
$eventDispatcher = new MockEventDispatcher();
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
(new DatabaseUserPermissionCheck())->addData($input);
(new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
}
#[Test]
......@@ -384,13 +348,12 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->expectException(AccessDeniedListenerException::class);
$this->expectExceptionCode(1662727149);
$eventDispatcher = new MockEventDispatcher();
$eventDispatcher->addListener(static function (ModifyEditFormUserAccessEvent $event) {
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$eventDispatcher->expects(self::once())->method('dispatch')->willReturnCallback(static function (ModifyEditFormUserAccessEvent $event) {
$event->denyUserAccess();
return $event;
});
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
(new DatabaseUserPermissionCheck())->addData($input);
(new DatabaseUserPermissionCheck($eventDispatcher))->addData($input);
}
#[Test]
......@@ -413,14 +376,12 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->beUserMock->method('calcPerms')->with($input['parentPageRow'])->willReturn(Permission::CONTENT_EDIT);
$this->beUserMock->method('recordEditAccessInternals')->with($input['tableName'], self::anything())->willReturn(true);
$eventDispatcher = new MockEventDispatcher();
$eventDispatcher->addListener(static function (ModifyEditFormUserAccessEvent $event) {
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$eventDispatcher->expects(self::once())->method('dispatch')->willReturnCallback(static function (ModifyEditFormUserAccessEvent $event) {
$event->allowUserAccess();
return $event;
});
GeneralUtility::addInstance(EventDispatcherInterface::class, $eventDispatcher);
$result = (new DatabaseUserPermissionCheck())->addData($input);
$result = (new DatabaseUserPermissionCheck($eventDispatcher))->addData($input);
self::assertSame(Permission::CONTENT_EDIT, $result['userPermissionOnPage']);
}
......@@ -441,11 +402,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->beUserMock->method('check')->with('tables_modify', $input['tableName'])->willReturn(true);
$this->beUserMock->method('calcPerms')->with($input['parentPageRow'])->willReturn(Permission::PAGE_NEW);
$this->beUserMock->method('recordEditAccessInternals')->with($input['tableName'], self::anything())->willReturn(true);
GeneralUtility::addInstance(EventDispatcherInterface::class, new NoopEventDispatcher());
$result = (new DatabaseUserPermissionCheck())->addData($input);
$result = (new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
self::assertSame(Permission::PAGE_NEW, $result['userPermissionOnPage']);
}
......@@ -466,11 +423,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->beUserMock->method('check')->with('tables_modify', $input['tableName'])->willReturn(true);
$this->beUserMock->method('calcPerms')->with($input['parentPageRow'])->willReturn(Permission::CONTENT_EDIT);
$this->beUserMock->method('recordEditAccessInternals')->with($input['tableName'], self::anything())->willReturn(true);
GeneralUtility::addInstance(EventDispatcherInterface::class, new NoopEventDispatcher());
$result = (new DatabaseUserPermissionCheck())->addData($input);
$result = (new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
self::assertSame(Permission::CONTENT_EDIT, $result['userPermissionOnPage']);
}
......@@ -488,11 +441,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->beUserMock->method('check')->with('tables_modify', $input['tableName'])->willReturn(true);
$this->beUserMock->method('recordEditAccessInternals')->with($input['tableName'], self::anything())->willReturn(true);
$GLOBALS['TCA'][$input['tableName']]['ctrl']['security']['ignoreRootLevelRestriction'] = true;
GeneralUtility::addInstance(EventDispatcherInterface::class, new NoopEventDispatcher());
$result = (new DatabaseUserPermissionCheck())->addData($input);
$result = (new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
self::assertSame(Permission::ALL, $result['userPermissionOnPage']);
}
......@@ -512,9 +461,6 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
$this->expectException(AccessDeniedRootNodeException::class);
$this->expectExceptionCode(1437745221);
GeneralUtility::addInstance(EventDispatcherInterface::class, new NoopEventDispatcher());
(new DatabaseUserPermissionCheck())->addData($input);
(new DatabaseUserPermissionCheck(new NoopEventDispatcher()))->addData($input);
}
}
......@@ -34,8 +34,8 @@ use TYPO3\CMS\Core\Database\Schema\SchemaDiff;
use TYPO3\CMS\Core\Database\Schema\SchemaMigrator;
use TYPO3\CMS\Core\Database\Schema\SqlReader;
use TYPO3\CMS\Core\Database\Schema\TableDiff;
use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
use TYPO3\CMS\Core\Package\PackageManager;
use TYPO3\CMS\Core\Tests\Unit\Fixtures\EventDispatcher\MockEventDispatcher;
use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
use TYPO3\TestingFramework\Core\Testbase;
......@@ -120,7 +120,7 @@ final class SchemaMigratorTest extends FunctionalTestCase
// Ensure SqlReader is not taking any extension into account to retrieve extension table structure files.
$packageManagerMock = $this->createMock(PackageManager::class);
$packageManagerMock->method('getActivePackages')->willReturn([]);
return new SqlReader(new MockEventDispatcher(), $packageManagerMock);
return new SqlReader(new NoopEventDispatcher(), $packageManagerMock);
}
private function createSchemaMigrator(): SchemaMigrator
......
<?php
declare(strict_types=1);
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
namespace TYPO3\CMS\Core\Tests\Unit\Fixtures\EventDispatcher;
use Psr\EventDispatcher\EventDispatcherInterface;
/**
* A mock event dispatcher that does nothing but records what events are passed.
*
* Use in tests for classes that depend on an event dispatcher
* but interaction with the dispatcher is not what's being tested,
* or where "event X is triggered" is the behavior being tested.
*/
class MockEventDispatcher implements EventDispatcherInterface
{
/** @var object[] */
public array $events = [];
/** @var \Closure[] */
public array $listeners = [];
public function dispatch(object $event): object
{
$this->events[] = $event;
foreach ($this->listeners as $listener) {
$listener($event);
}
return $event;
}
public function addListener(\Closure $listener): void
{
$this->listeners[] = $listener;
}
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment