From f1d9466045cb6400ae2d184d527427f7a3ac8ceb Mon Sep 17 00:00:00 2001 From: Daniel Siepmann Date: Wed, 4 Jan 2023 08:42:36 +0100 Subject: [PATCH] Add features to build an archive (#8) * Add context to factory * Allow configuring default arguments if missing in request * Add plugin name to AssignTemplateVariables event --- .../Frontend/CalendarController.php | 75 ++++++- Classes/Domain/Model/Context.php | 64 ++++++ .../Domain/Model/ContextSpecificFactory.php | 31 +++ Classes/Domain/Model/Day.php | 1 + Classes/Events/AssignTemplateVariables.php | 14 +- Documentation/Changelog.rst | 13 ++ Documentation/Changelog/1.1.0.rst | 58 ++++++ Documentation/Index.rst | 15 ++ Documentation/Settings.cfg | 49 +++++ Documentation/Sitemap.rst | 9 + README.rst | 19 ++ .../Classes/Domain/ExampleDataFactory.php | 18 +- .../EventListener/AssignTemplateVariables.php | 1 + .../Configuration/TypoScript/Setup.typoscript | 13 ++ .../Templates/Frontend/Calendar/Day.html | 3 + .../Templates/Frontend/Calendar/Month.html | 3 + .../Templates/Frontend/Calendar/Week.html | 3 + .../Templates/Frontend/Calendar/Year.html | 3 + Tests/Functional/CalendarControllerTest.php | 195 +++++++++++++++++- Tests/Unit/Domain/Model/ContextTest.php | 88 ++++++++ .../Events/AssignTemplateVariablesTest.php | 24 ++- composer.json | 3 +- ext_emconf.php | 2 +- 23 files changed, 684 insertions(+), 20 deletions(-) create mode 100644 Classes/Domain/Model/Context.php create mode 100644 Classes/Domain/Model/ContextSpecificFactory.php create mode 100644 Documentation/Changelog.rst create mode 100644 Documentation/Changelog/1.1.0.rst create mode 100644 Documentation/Index.rst create mode 100644 Documentation/Settings.cfg create mode 100644 Documentation/Sitemap.rst create mode 100644 Tests/Unit/Domain/Model/ContextTest.php diff --git a/Classes/Controller/Frontend/CalendarController.php b/Classes/Controller/Frontend/CalendarController.php index dba9226..1be5855 100644 --- a/Classes/Controller/Frontend/CalendarController.php +++ b/Classes/Controller/Frontend/CalendarController.php @@ -21,11 +21,15 @@ namespace WerkraumMedia\Calendar\Controller\Frontend; * 02110-1301, USA. */ +use TYPO3\CMS\Core\TypoScript\TypoScriptService; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Annotation as Extbase; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; use TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter; +use WerkraumMedia\Calendar\Domain\Model\Context; +use WerkraumMedia\Calendar\Domain\Model\ContextSpecificFactory; use WerkraumMedia\Calendar\Domain\Model\Day; +use WerkraumMedia\Calendar\Domain\Model\ForeignDataFactory; use WerkraumMedia\Calendar\Domain\Model\Month; use WerkraumMedia\Calendar\Domain\Model\Week; use WerkraumMedia\Calendar\Domain\Model\Year; @@ -33,12 +37,39 @@ use WerkraumMedia\Calendar\Events\AssignTemplateVariables; class CalendarController extends ActionController { + /** + * @var ForeignDataFactory + */ + private $foreignDataFactory; + + /** + * @var TypoScriptService + */ + private $typoScriptService; + + public function __construct( + ForeignDataFactory $foreignDataFactory, + TypoScriptService $typoScriptService + ) { + $this->foreignDataFactory = $foreignDataFactory; + $this->typoScriptService = $typoScriptService; + } + + public function initializeAction() + { + if ($this->foreignDataFactory instanceof ContextSpecificFactory) { + $this->foreignDataFactory->setContext( + Context::createFromContentObjectRenderer($this->configurationManager->getContentObject()) + ); + } + } + public function initializeYearAction() { if ($this->request->hasArgument('year') === false) { $this->request->setArguments([ 'year' => [ - 'year' => date('Y'), + 'year' => $this->getDefaultArgumentValue('year'), ], ]); } @@ -63,8 +94,8 @@ class CalendarController extends ActionController if ($this->request->hasArgument('month') === false) { $this->request->setArguments([ 'month' => [ - 'month' => date('m'), - 'year' => date('Y'), + 'month' => $this->getDefaultArgumentValue('month'), + 'year' => $this->getDefaultArgumentValue('year'), ], ]); } @@ -89,8 +120,8 @@ class CalendarController extends ActionController if ($this->request->hasArgument('week') === false) { $this->request->setArguments([ 'week' => [ - 'week' => date('W'), - 'year' => date('Y'), + 'week' => $this->getDefaultArgumentValue('week'), + 'year' => $this->getDefaultArgumentValue('year'), ], ]); } @@ -115,7 +146,7 @@ class CalendarController extends ActionController if ($this->request->hasArgument('day') === false) { $this->request->setArguments([ 'day' => [ - 'day' => date('Y-m-d'), + 'day' => $this->getDefaultArgumentValue('day'), ], ]); } @@ -145,8 +176,38 @@ class CalendarController extends ActionController private function assignVariables(array $variables): void { - $event = GeneralUtility::makeInstance(AssignTemplateVariables::class, $variables); + $event = GeneralUtility::makeInstance( + AssignTemplateVariables::class, + $variables, + $this->request->getPluginName() + ); $this->eventDispatcher->dispatch($event); $this->view->assignMultiple($event->getVariables()); } + + /** + * Checks for TypoScript and transforms TypoScript into expected value. + * Allows to define defaults other than "now" for arguments. + */ + private function getDefaultArgumentValue(string $argumentName): string + { + $arguments = $this->typoScriptService->convertPlainArrayToTypoScriptArray( + $this->settings['arguments'] ?? [] + ); + + $fallbackValues = [ + 'year' => date('Y'), + 'month' => date('m'), + 'week' => date('W'), + 'day' => date('Y-m-d'), + ]; + + $value = $this->configurationManager->getContentObject()->stdWrapValue( + $argumentName, + $arguments, + $fallbackValues[$argumentName] + ); + + return $value; + } } diff --git a/Classes/Domain/Model/Context.php b/Classes/Domain/Model/Context.php new file mode 100644 index 0000000..d8a1777 --- /dev/null +++ b/Classes/Domain/Model/Context.php @@ -0,0 +1,64 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +namespace WerkraumMedia\Calendar\Domain\Model; + +use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; + +class Context +{ + /** + * @var string + */ + protected $tableName = ''; + + /** + * @var array + */ + protected $databaseRow = []; + + private function __construct() + { + } + + public static function createFromContentObjectRenderer( + ContentObjectRenderer $contentObjectRenderer + ): self { + $instance = new self(); + + $instance->tableName = $contentObjectRenderer->getCurrentTable(); + $instance->databaseRow = $contentObjectRenderer->data; + + return $instance; + } + + public function getTableName(): string + { + return $this->tableName; + } + + public function getDatabaseRow(): array + { + return $this->databaseRow; + } +} diff --git a/Classes/Domain/Model/ContextSpecificFactory.php b/Classes/Domain/Model/ContextSpecificFactory.php new file mode 100644 index 0000000..7eb55a3 --- /dev/null +++ b/Classes/Domain/Model/ContextSpecificFactory.php @@ -0,0 +1,31 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +interface ContextSpecificFactory +{ + /** + * Might be called prior ot getData(). + * Allows getData() to know the current context and make decisions. + */ + public function setContext(Context $context): void; +} diff --git a/Classes/Domain/Model/Day.php b/Classes/Domain/Model/Day.php index 598c9f5..43991cd 100644 --- a/Classes/Domain/Model/Day.php +++ b/Classes/Domain/Model/Day.php @@ -85,5 +85,6 @@ class Day $this->foreignData = GeneralUtility::makeInstance(ForeignDataFactory::class) ->getData($this); + $this->initialized = true; } } diff --git a/Classes/Events/AssignTemplateVariables.php b/Classes/Events/AssignTemplateVariables.php index 35c4e0f..862c7c2 100644 --- a/Classes/Events/AssignTemplateVariables.php +++ b/Classes/Events/AssignTemplateVariables.php @@ -28,10 +28,22 @@ final class AssignTemplateVariables */ private $variables; + /** + * @var string + */ + private $pluginName; + public function __construct( - array $variables + array $variables, + string $pluginName ) { $this->variables = $variables; + $this->pluginName = $pluginName; + } + + public function getPluginName(): string + { + return $this->pluginName; } public function getVariables(): array diff --git a/Documentation/Changelog.rst b/Documentation/Changelog.rst new file mode 100644 index 0000000..d78bc52 --- /dev/null +++ b/Documentation/Changelog.rst @@ -0,0 +1,13 @@ +.. _changelog: + +========= +Changelog +========= + + +.. toctree:: + :glob: + :reversed: + + Changelog/* + diff --git a/Documentation/Changelog/1.1.0.rst b/Documentation/Changelog/1.1.0.rst new file mode 100644 index 0000000..108a41d --- /dev/null +++ b/Documentation/Changelog/1.1.0.rst @@ -0,0 +1,58 @@ +1.1.0 +===== + +Breaking +-------- + +Nothing + +Features +-------- + +* Add context to foreign data factory. + The factory can optionally implement the ``WerkraumMedia\Calendar\Domain\Model\ContextSpecificFactory`` interface. + That way it will receive a bit of context to react on the current situation. + +* Add Extbase Settings to configure default arguments for each action: + + .. code-block:: typoscript + + plugin.tx_calendar_example { + settings { + arguments { + year = 1988 + month = 11 + week = 12 + day = 1988-11-03 + } + } + } + + StdWrap is applied, so more complex setups are possible, e.g.: + + .. code-block:: typoscript + + arguments { + year { + strtotime = midnight first day of -1 year + strftime = %Y + } + } + +* The current plugin name is available to the ``AssignTemplateVariables`` event. + +Fixes +----- + +Nothing + +Tasks +----- + +Nothing + +Deprecation +----------- + +Nothing + diff --git a/Documentation/Index.rst b/Documentation/Index.rst new file mode 100644 index 0000000..2296ee8 --- /dev/null +++ b/Documentation/Index.rst @@ -0,0 +1,15 @@ +.. _start: + +============ +EXT:calendar +============ + +Table of Contents +================= + +.. toctree:: + :maxdepth: 1 + :titlesonly: + + Changelog + Sitemap diff --git a/Documentation/Settings.cfg b/Documentation/Settings.cfg new file mode 100644 index 0000000..266fce4 --- /dev/null +++ b/Documentation/Settings.cfg @@ -0,0 +1,49 @@ +[general] + +# ................................................................................. +# ... (required) title (displayed in left sidebar (desktop) or top panel (mobile) +# ................................................................................. +project = TYPO3 EXT:calendar + +# ................................................................................. +# ... (recommended) version, displayed next to title (desktop) and in context = $context; + } + public function getData(Day $day) { return [ 'exampleKey' => 'exampleValue', + 'context' => [ + 'tableName' => $this->context->getTableName(), + 'databaseRow' => $this->context->getDatabaseRow(), + ], ]; } } diff --git a/Tests/Fixtures/calendar_example/Classes/EventListener/AssignTemplateVariables.php b/Tests/Fixtures/calendar_example/Classes/EventListener/AssignTemplateVariables.php index cb26338..7e6bbc5 100644 --- a/Tests/Fixtures/calendar_example/Classes/EventListener/AssignTemplateVariables.php +++ b/Tests/Fixtures/calendar_example/Classes/EventListener/AssignTemplateVariables.php @@ -30,6 +30,7 @@ class AssignTemplateVariables public function __invoke(AssignTemplateVariablesEvent $event): void { $event->setVariables(array_merge($event->getVariables(), [ + 'pluginName' => $event->getPluginName(), 'customVariable' => 'modifiedVariable', ])); } diff --git a/Tests/Fixtures/calendar_example/Configuration/TypoScript/Setup.typoscript b/Tests/Fixtures/calendar_example/Configuration/TypoScript/Setup.typoscript index f7e747c..9031a3e 100644 --- a/Tests/Fixtures/calendar_example/Configuration/TypoScript/Setup.typoscript +++ b/Tests/Fixtures/calendar_example/Configuration/TypoScript/Setup.typoscript @@ -10,3 +10,16 @@ page = PAGE page { 10 =< tt_content.calendar_example.20 } + +[request.getQueryParams()['typoScriptDefaults'] == 1] + plugin.tx_calendar_example { + settings { + arguments { + year = 1988 + month = 11 + week = 12 + day = 1988-11-03 + } + } + } +[GLOBAL] diff --git a/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Day.html b/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Day.html index eb18a1a..06e13ac 100644 --- a/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Day.html +++ b/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Day.html @@ -5,6 +5,9 @@

{day.dateTimeInstance -> f:format.date(format: 'd.m.Y')}

{day.foreignData.exampleKey} + Table: {day.foreignData.context.tableName} + Title: {day.foreignData.context.databaseRow.title} {customVariable} + PluginName: {pluginName} diff --git a/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Month.html b/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Month.html index a7771a5..d467fe3 100644 --- a/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Month.html +++ b/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Month.html @@ -7,8 +7,11 @@ {day.dateTimeInstance -> f:format.date(format: 'd')} {day.foreignData.exampleKey} + Table: {day.foreignData.context.tableName} + Title: {day.foreignData.context.databaseRow.title} {customVariable} + PluginName: {pluginName} diff --git a/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Week.html b/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Week.html index db6a7e9..cd68cad 100644 --- a/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Week.html +++ b/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Week.html @@ -6,7 +6,10 @@ {day.dateTimeInstance -> f:format.date(format: 'd')} {day.foreignData.exampleKey} + Table: {day.foreignData.context.tableName} + Title: {day.foreignData.context.databaseRow.title} {customVariable} + PluginName: {pluginName} diff --git a/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Year.html b/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Year.html index fbde290..c60887f 100644 --- a/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Year.html +++ b/Tests/Fixtures/calendar_example/Resources/Private/Templates/Frontend/Calendar/Year.html @@ -8,9 +8,12 @@ {day.dateTimeInstance -> f:format.date(format: 'd')} {day.foreignData.exampleKey} + Table: {day.foreignData.context.tableName} + Title: {day.foreignData.context.databaseRow.title} {customVariable} + PluginName: {pluginName} diff --git a/Tests/Functional/CalendarControllerTest.php b/Tests/Functional/CalendarControllerTest.php index 1ac8451..d0e5ce5 100644 --- a/Tests/Functional/CalendarControllerTest.php +++ b/Tests/Functional/CalendarControllerTest.php @@ -67,6 +67,35 @@ class CalendarControllerTest extends FunctionalTestCase self::assertStringContainsString('modifiedVariable', $html); } + /** + * @test + */ + public function pluginNameForCurrentDay(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('PluginName: Example', $html); + } + + /** + * @test + */ + public function contextForCurrentDay(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('Table: pages', $html); + self::assertStringContainsString('Title: Page Title', $html); + } + /** * @test */ @@ -85,7 +114,22 @@ class CalendarControllerTest extends FunctionalTestCase /** * @test */ - public function customDataForProvidedDay(): void + public function configuredDay(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('typoScriptDefaults', '1'); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('03.11.1988', $html); + } + + /** + * @test + */ + public function providedDay(): void { $request = new InternalRequest(); $request = $request->withPageId(1); @@ -95,7 +139,6 @@ class CalendarControllerTest extends FunctionalTestCase self::assertSame(200, $result->getStatusCode()); $html = $result->getBody()->__toString(); self::assertStringContainsString('03.11.2020', $html); - self::assertStringContainsString('exampleValue', $html); } /** @@ -113,6 +156,37 @@ class CalendarControllerTest extends FunctionalTestCase self::assertStringContainsString('modifiedVariable', $html); } + /** + * @test + */ + public function pluginNameForCurrentWeek(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_calendar_example[action]', 'week'); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('PluginName: Example', $html); + } + + /** + * @test + */ + public function contextForCurrentWeek(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_calendar_example[action]', 'week'); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('Table: pages', $html); + self::assertStringContainsString('Title: Page Title', $html); + } + /** * @test */ @@ -132,7 +206,23 @@ class CalendarControllerTest extends FunctionalTestCase /** * @test */ - public function customDataForProvidedWeek(): void + public function configuredWeek(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_calendar_example[action]', 'week'); + $request = $request->withQueryParameter('typoScriptDefaults', '1'); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('12 1988', $html); + } + + /** + * @test + */ + public function providedWeek(): void { $request = new InternalRequest(); $request = $request->withPageId(1); @@ -144,7 +234,6 @@ class CalendarControllerTest extends FunctionalTestCase self::assertSame(200, $result->getStatusCode()); $html = $result->getBody()->__toString(); self::assertStringContainsString('02 2020', $html); - self::assertStringContainsString('exampleValue', $html); } /** @@ -162,6 +251,37 @@ class CalendarControllerTest extends FunctionalTestCase self::assertStringContainsString('modifiedVariable', $html); } + /** + * @test + */ + public function pluginNameForCurrentMonth(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_calendar_example[action]', 'month'); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('PluginName: Example', $html); + } + + /** + * @test + */ + public function contextForCurrentMonth(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_calendar_example[action]', 'month'); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('Table: pages', $html); + self::assertStringContainsString('Title: Page Title', $html); + } + /** * @test */ @@ -181,7 +301,23 @@ class CalendarControllerTest extends FunctionalTestCase /** * @test */ - public function customDataForProvidedMonth(): void + public function configuredMonth(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_calendar_example[action]', 'month'); + $request = $request->withQueryParameter('typoScriptDefaults', '1'); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('November 1988', $html); + } + + /** + * @test + */ + public function providedMonth(): void { $request = new InternalRequest(); $request = $request->withPageId(1); @@ -211,6 +347,37 @@ class CalendarControllerTest extends FunctionalTestCase self::assertStringContainsString('modifiedVariable', $html); } + /** + * @test + */ + public function pluginNameForCurrentYear(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_calendar_example[action]', 'year'); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('PluginName: Example', $html); + } + + /** + * @test + */ + public function contextForCurrentYear(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_calendar_example[action]', 'year'); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('Table: pages', $html); + self::assertStringContainsString('Title: Page Title', $html); + } + /** * @test */ @@ -230,7 +397,23 @@ class CalendarControllerTest extends FunctionalTestCase /** * @test */ - public function customDataForProvidedYear(): void + public function configuredYear(): void + { + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_calendar_example[action]', 'year'); + $request = $request->withQueryParameter('typoScriptDefaults', '1'); + $result = $this->executeFrontendRequest($request); + + self::assertSame(200, $result->getStatusCode()); + $html = $result->getBody()->__toString(); + self::assertStringContainsString('1988', $html); + } + + /** + * @test + */ + public function providedYear(): void { $request = new InternalRequest(); $request = $request->withPageId(1); diff --git a/Tests/Unit/Domain/Model/ContextTest.php b/Tests/Unit/Domain/Model/ContextTest.php new file mode 100644 index 0000000..783bee9 --- /dev/null +++ b/Tests/Unit/Domain/Model/ContextTest.php @@ -0,0 +1,88 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +namespace WerkraumMedia\Calendar\Tests\Unit\Domain\Model; + +use PHPUnit\Framework\TestCase; +use Prophecy\PhpUnit\ProphecyTrait; +use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; +use WerkraumMedia\Calendar\Domain\Model\Context; + +/** + * @covers \WerkraumMedia\Calendar\Domain\Model\Context + */ +class ContextTest extends TestCase +{ + use ProphecyTrait; + + /** + * @test + */ + public function canNotBeCreatedViaNew(): void + { + $this->expectError(); + $this->expectErrorMessage('Call to private WerkraumMedia\Calendar\Domain\Model\Context::__construct() from context \'WerkraumMedia\Calendar\Tests\Unit\Domain\Model\ContextTest\''); + $subject = new Context(); + } + + /** + * @test + */ + public function canBeCreatedFromContentObjectRenderer(): void + { + $contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class); + $subject = Context::createFromContentObjectRenderer($contentObjectRenderer->reveal()); + + self::assertInstanceOf(Context::class, $subject); + } + + /** + * @test + */ + public function providesTableNameInheritedFromContentObjectRenderer(): void + { + $contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class); + $contentObjectRenderer->getCurrentTable()->willReturn('tx_calendar_example_table'); + $subject = Context::createFromContentObjectRenderer($contentObjectRenderer->reveal()); + + self::assertSame('tx_calendar_example_table', $subject->getTableName()); + } + + /** + * @test + */ + public function providesDatabaseRowInheritedFromContentObjectRenderer(): void + { + $contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class); + $contentObjectRenderer->data = [ + 'uid' => 10, + 'pid' => 1, + ]; + $subject = Context::createFromContentObjectRenderer($contentObjectRenderer->reveal()); + + self::assertSame([ + 'uid' => 10, + 'pid' => 1, + ], $subject->getDatabaseRow()); + } +} diff --git a/Tests/Unit/Events/AssignTemplateVariablesTest.php b/Tests/Unit/Events/AssignTemplateVariablesTest.php index b4c6dee..f5d738b 100644 --- a/Tests/Unit/Events/AssignTemplateVariablesTest.php +++ b/Tests/Unit/Events/AssignTemplateVariablesTest.php @@ -35,12 +35,28 @@ class AssignTemplateVariablesTest extends TestCase public function canBeCreated(): void { $subject = new AssignTemplateVariables( - [] + [], + '' ); self::assertInstanceOf(AssignTemplateVariables::class, $subject); } + /** + * @test + */ + public function returnsPluginName(): void + { + $subject = new AssignTemplateVariables( + [], + 'Example' + ); + + $result = $subject->getPluginName(); + + self::assertSame('Example', $result); + } + /** * @test */ @@ -49,7 +65,8 @@ class AssignTemplateVariablesTest extends TestCase $subject = new AssignTemplateVariables( [ 'variable1' => 'value1', - ] + ], + '' ); $result = $subject->getVariables(); @@ -67,7 +84,8 @@ class AssignTemplateVariablesTest extends TestCase $subject = new AssignTemplateVariables( [ 'variable1' => 'value1', - ] + ], + '' ); $subject->setVariables([ diff --git a/composer.json b/composer.json index 62220d2..34cda36 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,8 @@ "require": { "php": "^7.3.0 || ^7.4.0", "typo3/cms-core": "^10.4", - "typo3/cms-extbase": "^10.4" + "typo3/cms-extbase": "^10.4", + "typo3/cms-frontend": "^10.4" }, "autoload": { "psr-4": { diff --git a/ext_emconf.php b/ext_emconf.php index 166046b..01b4dca 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -10,7 +10,7 @@ $EM_CONF['calendar'] = [ 'state' => 'alpha', 'uploadfolder' => 0, 'clearCacheOnLoad' => 0, - 'version' => '1.0.0', + 'version' => '1.1.0', 'constraints' => [ 'depends' => [ 'typo3' => '*',