Skip to content

Commit

Permalink
[TASK] Move decision about embedding markup into event listener
Browse files Browse the repository at this point in the history
  • Loading branch information
brotkrueml committed Apr 4, 2020
1 parent 7ddf632 commit 54104ac
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 59 deletions.
29 changes: 29 additions & 0 deletions Classes/EventListener/EmbedMarkupDependingOnNoIndexPageField.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php
declare(strict_types=1);

/*
* This file is part of the "schema" extension for TYPO3 CMS.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*/

namespace Brotkrueml\Schema\EventListener;

use Brotkrueml\Schema\Event\ShouldEmbedMarkupEvent;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;

class EmbedMarkupDependingOnNoIndexPageField
{
public function __invoke(ShouldEmbedMarkupEvent $event): void
{
if (!ExtensionManagementUtility::isLoaded('seo')) {
return;
}

$page = $event->getPage();
if ($page['no_index'] ?? false) {
$event->setEmbedMarkup(false);
}
}
}
9 changes: 1 addition & 8 deletions Classes/Hooks/PageRenderer/SchemaMarkupInjection.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
use TYPO3\CMS\Core\Configuration\ExtensionConfiguration;
use TYPO3\CMS\Core\EventDispatcher\EventDispatcher;
use TYPO3\CMS\Core\Page\PageRenderer;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\VersionNumberUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
Expand Down Expand Up @@ -103,14 +102,8 @@ public function execute(?array &$params, PageRenderer &$pageRenderer): void

private function shouldEmbedMarkup(): bool
{
$embedMarkup = true;

if (ExtensionManagementUtility::isLoaded('seo')) {
$embedMarkup = $this->controller->page['no_index'] === 0;
}

$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
$event = new ShouldEmbedMarkupEvent($this->controller->page, $embedMarkup);
$event = new ShouldEmbedMarkupEvent($this->controller->page, true);

if (VersionNumberUtility::convertVersionNumberToInteger(TYPO3_branch) >= 10000000) {
$eventDispatcher = $objectManager->get(EventDispatcher::class);
Expand Down
6 changes: 6 additions & 0 deletions Configuration/Services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ services:
arguments:
$cache: '@cache.tx_schema_core'

Brotkrueml\Schema\EventListener\EmbedMarkupDependingOnNoIndexPageField:
tags:
- name: event.listener
identifier: 'ext-schema/embedMarkupDependingOnNoIndexPageField'
event: Brotkrueml\Schema\Event\ShouldEmbedMarkupEvent

Brotkrueml\Schema\EventListener\RegisterTypePropertiesMovedFromOfficialToPending:
tags:
- name: event.listener
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php
declare(strict_types=1);

/*
* This file is part of the "schema" extension for TYPO3 CMS.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*/

namespace Brotkrueml\Schema\Tests\Unit\EventListener;

use Brotkrueml\Schema\Event\ShouldEmbedMarkupEvent;
use Brotkrueml\Schema\EventListener\EmbedMarkupDependingOnNoIndexPageField;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use TYPO3\CMS\Core\Package\PackageManager;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;

/**
* @coversDefaultClass \Brotkrueml\Schema\EventListener\EmbedMarkupDependingOnNoIndexPageField
*/
class EmbedMarkupDependingOnNoIndexPageFieldTest extends TestCase
{
/** @var EmbedMarkupDependingOnNoIndexPageField */
private $subject;

protected function setUp(): void
{
$this->subject = new EmbedMarkupDependingOnNoIndexPageField();
}

/**
* @test
* @covers ::__invoke
*/
public function seoExtensionIsNotInstalledThenMarkupShouldBeEmbedded(): void
{
$this->setSeoExtensionInstallationState(false);

$event = new ShouldEmbedMarkupEvent([], true);
$this->subject->__invoke($event);

self::assertTrue($event->getEmbedMarkup());
}

/**
* @test
* @covers ::__invoke
*/
public function seoExtensionIsInstalledAndNoIndexIsNotSetThenMarkupShouldBeEmbedded(): void
{
$this->setSeoExtensionInstallationState(true);

$event = new ShouldEmbedMarkupEvent(['no_index' => 0], true);
$this->subject->__invoke($event);

self::assertTrue($event->getEmbedMarkup());
}

/**
* @test
* @covers ::__invoke
*/
public function seoExtensionIsInstalledAndNoIndexIsSetThenMarkupShouldNotBeEmbedded(): void
{
$this->setSeoExtensionInstallationState(true);

$event = new ShouldEmbedMarkupEvent(['no_index' => 1], true);
$this->subject->__invoke($event);

self::assertFalse($event->getEmbedMarkup());
}

protected function setSeoExtensionInstallationState(bool $state): void
{
/** @var MockObject|PackageManager $packageManagerMock */
$packageManagerMock = $this->createMock(PackageManager::class);
$packageManagerMock
->expects(self::once())
->method('isPackageActive')
->with('seo')
->willReturn($state);

ExtensionManagementUtility::setPackageManager($packageManagerMock);
}
}
51 changes: 0 additions & 51 deletions Tests/Unit/Hooks/PageRenderer/SchemaMarkupInjectionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@
use PHPUnit\Framework\TestCase;
use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
use TYPO3\CMS\Core\Configuration\ExtensionConfiguration;
use TYPO3\CMS\Core\Package\PackageManager;
use TYPO3\CMS\Core\Page\PageRenderer;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\SignalSlot\Dispatcher;
Expand Down Expand Up @@ -157,8 +155,6 @@ public function executeWithoutDefinedMarkupAndNoAspectsDoesNotEmbedAnything()
->expects(self::never())
->method('addFooterData');

$this->setSeoExtensionInstallationState(false);

$params = [];
$this->subject->execute($params, $this->pageRendererMock);
}
Expand All @@ -169,7 +165,6 @@ public function executeWithoutDefinedMarkupAndNoAspectsDoesNotEmbedAnything()
public function executeWithMarkupDefinedCallsAddHeaderDataIfShouldEmbeddedIntoHead(): void
{
$this->defineConstants('9.5', 'FE');
$this->setSeoExtensionInstallationState(true);

$schemaManager = GeneralUtility::makeInstance(SchemaManager::class);
$schemaManager->addType((new FixtureThing())->setProperty('name', 'some name'));
Expand Down Expand Up @@ -206,7 +201,6 @@ public function executeWithMarkupDefinedCallsAddHeaderDataIfShouldEmbeddedIntoHe
public function executeWithSchemaCallsAddFooterDataOnceIfShouldEmbeddedIntoBody(): void
{
$this->defineConstants('9.5', 'FE');
$this->setSeoExtensionInstallationState(true);

$schemaManager = GeneralUtility::makeInstance(SchemaManager::class);
$schemaManager->addType((new FixtureThing())->setProperty('name', 'some name'));
Expand Down Expand Up @@ -243,7 +237,6 @@ public function executeWithSchemaCallsAddFooterDataOnceIfShouldEmbeddedIntoBody(
public function seoExtensionIsNotInstalledAddsHeaderData(): void
{
$this->defineConstants('9.5', 'FE');
$this->setSeoExtensionInstallationState(false);

$controllerMock = $this->createMock(TypoScriptFrontendController::class);
$controllerMock->page = ['uid' => 42];
Expand Down Expand Up @@ -273,55 +266,12 @@ public function seoExtensionIsNotInstalledAddsHeaderData(): void
$subject->execute($params, $this->pageRendererMock);
}

/**
* @test
*/
public function seoExtensionIsInstalledAndNoIndexIsSetNoHeaderDataIsEmbedded(): void
{
$this->defineConstants('9.5', 'FE');
$this->setSeoExtensionInstallationState(true);

$controllerMock = $this->createMock(TypoScriptFrontendController::class);
$controllerMock->page = ['no_index' => 1];

$subject = new SchemaMarkupInjection(
$controllerMock,
$this->extensionConfigurationMock,
null,
$this->cacheMock
);

$schemaManager = GeneralUtility::makeInstance(SchemaManager::class);
$schemaManager->addType((new FixtureThing())->setProperty('name', 'some name'));

$this->pageRendererMock
->expects(self::never())
->method('addHeaderData');

$params = [];
$subject->execute($params, $this->pageRendererMock);
}

protected function setSeoExtensionInstallationState(bool $state): void
{
/** @var MockObject|PackageManager $packageManagerMock */
$packageManagerMock = $this->createMock(PackageManager::class);
$packageManagerMock
->expects(self::once())
->method('isPackageActive')
->with('seo')
->willReturn($state);

ExtensionManagementUtility::setPackageManager($packageManagerMock);
}

/**
* @test
*/
public function whenCacheIDefinedItIsUsedToGetMarkup(): void
{
$this->defineConstants('9.5', 'FE');
$this->setSeoExtensionInstallationState(true);

$cacheMock = $this->createMock(FrontendInterface::class);
$cacheMock
Expand Down Expand Up @@ -351,7 +301,6 @@ public function whenCacheIDefinedItIsUsedToGetMarkup(): void
public function whenCacheIsDefinedItIsUsedToStoreMarkup(): void
{
$this->defineConstants('9.5', 'FE');
$this->setSeoExtensionInstallationState(true);

$schemaManager = GeneralUtility::makeInstance(SchemaManager::class);
$schemaManager->addType((new FixtureThing())->setProperty('name', 'some name'));
Expand Down
6 changes: 6 additions & 0 deletions ext_localconf.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@
$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
TYPO3\CMS\Extbase\SignalSlot\Dispatcher::class
);
$signalSlotDispatcher->connect(
\Brotkrueml\Schema\Hooks\PageRenderer\SchemaMarkupInjection::class,
'shouldEmbedMarkup',
\Brotkrueml\Schema\EventListener\EmbedMarkupDependingOnNoIndexPageField::class,
'__invoke'
);
$signalSlotDispatcher->connect(
\Brotkrueml\Schema\Core\Model\AbstractType::class,
'registerAdditionalTypeProperties',
Expand Down

0 comments on commit 54104ac

Please sign in to comment.