Add functional tests (#7)

This replaces the existing unit tests for the controller.
Functional tests are way better suited for testing the controller.
This commit is contained in:
Daniel Siepmann 2023-01-04 08:12:17 +01:00 committed by GitHub
parent c944a3c78f
commit 77dd56ad43
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 536 additions and 359 deletions

View file

@ -114,7 +114,9 @@ class CalendarController extends ActionController
{
if ($this->request->hasArgument('day') === false) {
$this->request->setArguments([
'day' => new \DateTimeImmutable(),
'day' => [
'day' => date('Y-m-d'),
],
]);
}

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<dataset>
<pages>
<uid>1</uid>
<pid>0</pid>
<doktype>1</doktype>
<is_siteroot>1</is_siteroot>
<slug>/</slug>
<title>Page Title</title>
</pages>
<sys_template>
<uid>1</uid>
<pid>1</pid>
<root>1</root>
<clear>3</clear>
<constants>databasePlatform = mysql</constants>
<config><![CDATA[
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:calendar_example/Configuration/TypoScript/Setup.typoscript">
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:fluid_styled_content/Configuration/TypoScript/setup.typoscript">
]]></config>
</sys_template>
</dataset>

View file

@ -0,0 +1,32 @@
base: /
languages:
-
title: English
enabled: true
base: /
typo3Language: default
locale: en_GB.UTF-8
iso-639-1: en
websiteTitle: ''
navigationTitle: English
hreflang: en-GB
direction: ''
flag: gb
languageId: 0
fallbackType: strict
fallbacks: '0'
-
title: Deutsch
enabled: true
base: /de
typo3Language: de
locale: de_DE.UTF-8
iso-639-1: de
navigationTitle: Deutsch
hreflang: de-DE
direction: ''
flag: de
websiteTitle: ''
languageId: 1
rootPageId: 1
websiteTitle: 'Example Website'

View file

@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2023 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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\CalendarExample\Domain;
use WerkraumMedia\Calendar\Domain\Model\Day;
use WerkraumMedia\Calendar\Domain\Model\ForeignDataFactory;
class ExampleDataFactory implements ForeignDataFactory
{
public function getData(Day $day)
{
return [
'exampleKey' => 'exampleValue',
];
}
}

View file

@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2023 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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\CalendarExample\EventListener;
use WerkraumMedia\Calendar\Events\AssignTemplateVariables as AssignTemplateVariablesEvent;
class AssignTemplateVariables
{
public function __invoke(AssignTemplateVariablesEvent $event): void
{
$event->setVariables(array_merge($event->getVariables(), [
'customVariable' => 'modifiedVariable',
]));
}
}

View file

@ -0,0 +1,17 @@
services:
_defaults:
autowire: true
autoconfigure: true
public: false
WerkraumMedia\CalendarExample\:
resource: '../Classes/*'
WerkraumMedia\Calendar\Domain\Model\ForeignDataFactory:
class: 'WerkraumMedia\CalendarExample\Domain\ExampleDataFactory'
public: true
WerkraumMedia\CalendarExample\EventListener\AssignTemplateVariables:
tags:
- name: 'event.listener'
event: 'WerkraumMedia\Calendar\Events\AssignTemplateVariables'

View file

@ -0,0 +1,12 @@
plugin.tx_calendar_example {
view {
templateRootPaths {
10 = EXT:calendar_example/Resources/Private/Templates/
}
}
}
page = PAGE
page {
10 =< tt_content.calendar_example.20
}

View file

@ -0,0 +1,10 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<h2>{day.dateTimeInstance -> f:format.date(format: 'd.m.Y')}</h2>
{day.foreignData.exampleKey}
{customVariable}
</html>

View file

@ -0,0 +1,14 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true">
<h2>{month.dateTimeInstance -> f:format.date(format: '%B %Y')}</h2>
<f:for each="{month.weeks}" as="week">
<f:for each="{week.days}" as="day">
{day.dateTimeInstance -> f:format.date(format: 'd')}
{day.foreignData.exampleKey}
</f:for>
</f:for>
{customVariable}
</html>

View file

@ -0,0 +1,12 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true">
<h2>{week.dateTimeInstance -> f:format.date(format: '%V %Y')}</h2>
<f:for each="{week.days}" as="day">
{day.dateTimeInstance -> f:format.date(format: 'd')}
{day.foreignData.exampleKey}
</f:for>
{customVariable}
</html>

View file

@ -0,0 +1,16 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true">
<h2>{year.dateTimeInstance -> f:format.date(format: 'Y')}</h2>
<f:for each="{year.months}" as="month">
<f:for each="{month.weeks}" as="week">
<f:for each="{week.days}" as="day">
{day.dateTimeInstance -> f:format.date(format: 'd')}
{day.foreignData.exampleKey}
</f:for>
</f:for>
</f:for>
{customVariable}
</html>

View file

@ -0,0 +1,21 @@
{
"name": "werkraummedia/calendar_example",
"description": "Add calendar data",
"type": "typo3-cms-extension",
"license": "GPL-2.0-or-later",
"autoload": {
"psr-4": {
"WerkraumMedia\\CalendarExample\\": "Classes/"
}
},
"require": {
"typo3/cms-core": "*",
"typo3/cms-fluid-styled-content": "*",
"werkraummedia/calendar": "*"
},
"extra": {
"typo3/cms": {
"extension-key": "calendar_example"
}
}
}

View file

@ -0,0 +1,21 @@
<?php
$EM_CONF['calendar_example'] = [
'title' => 'Calendar Example',
'description' => 'Example extension to demonstrate integration',
'category' => 'misc',
'author' => 'Daniel Siepmann',
'author_email' => 'coding@daniel-siepmann.de',
'author_company' => 'Codappix GmbH',
'state' => 'alpha',
'uploadfolder' => 0,
'clearCacheOnLoad' => 0,
'version' => '1.0.0',
'constraints' => [
'depends' => [
'typo3' => '*',
],
'conflicts' => [],
'suggests' => [],
],
];

View file

@ -0,0 +1,18 @@
<?php
(function () {
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Calendar',
'Example',
[
\WerkraumMedia\Calendar\Controller\Frontend\CalendarController::class => implode(',', [
'day',
'week',
'month',
'year',
]),
],
[],
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::PLUGIN_TYPE_CONTENT_ELEMENT
);
})();

View file

@ -0,0 +1,246 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2023 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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\Functional;
use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\InternalRequest;
use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
use WerkraumMedia\Calendar\Controller\Frontend\CalendarController;
/**
* @coversNothing
* @testdox Calendar controller renders with
*/
class CalendarControllerTest extends FunctionalTestCase
{
protected $coreExtensionsToLoad = [
'fluid_styled_content',
];
protected $testExtensionsToLoad = [
'typo3conf/ext/calendar',
'typo3conf/ext/calendar/Tests/Fixtures/calendar_example',
];
protected $pathsToLinkInTestInstance = [
'typo3conf/ext/calendar/Tests/Fixtures/Sites' => 'typo3conf/sites',
];
protected function setUp(): void
{
parent::setUp();
$this->importDataSet(__DIR__ . '/../Fixtures/BasicDatabase.xml');
}
/**
* @test
*/
public function modifiedVariablesForCurrentDay(): void
{
$request = new InternalRequest();
$request = $request->withPageId(1);
$result = $this->executeFrontendRequest($request);
self::assertSame(200, $result->getStatusCode());
$html = $result->getBody()->__toString();
self::assertStringContainsString('modifiedVariable', $html);
}
/**
* @test
*/
public function customDataForCurrentDay(): void
{
$request = new InternalRequest();
$request = $request->withPageId(1);
$result = $this->executeFrontendRequest($request);
self::assertSame(200, $result->getStatusCode());
$html = $result->getBody()->__toString();
self::assertStringContainsString(date('d.m.Y'), $html);
self::assertStringContainsString('exampleValue', $html);
}
/**
* @test
*/
public function customDataForProvidedDay(): void
{
$request = new InternalRequest();
$request = $request->withPageId(1);
$request = $request->withQueryParameter('tx_calendar_example[day][day]', '2020-11-03');
$result = $this->executeFrontendRequest($request);
self::assertSame(200, $result->getStatusCode());
$html = $result->getBody()->__toString();
self::assertStringContainsString('03.11.2020', $html);
self::assertStringContainsString('exampleValue', $html);
}
/**
* @test
*/
public function modifiedVariablesForCurrentWeek(): 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('modifiedVariable', $html);
}
/**
* @test
*/
public function customDataForCurrentWeek(): 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(date('W Y'), $html);
self::assertStringContainsString('exampleValue', $html);
}
/**
* @test
*/
public function customDataForProvidedWeek(): void
{
$request = new InternalRequest();
$request = $request->withPageId(1);
$request = $request->withQueryParameter('tx_calendar_example[action]', 'week');
$request = $request->withQueryParameter('tx_calendar_example[week][week]', '02');
$request = $request->withQueryParameter('tx_calendar_example[week][year]', '2020');
$result = $this->executeFrontendRequest($request);
self::assertSame(200, $result->getStatusCode());
$html = $result->getBody()->__toString();
self::assertStringContainsString('02 2020', $html);
self::assertStringContainsString('exampleValue', $html);
}
/**
* @test
*/
public function modifiedVariablesForCurrentMonth(): 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('modifiedVariable', $html);
}
/**
* @test
*/
public function customDataForCurrentMonth(): 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(strftime('%B %Y'), $html);
self::assertStringContainsString('exampleValue', $html);
}
/**
* @test
*/
public function customDataForProvidedMonth(): void
{
$request = new InternalRequest();
$request = $request->withPageId(1);
$request = $request->withQueryParameter('tx_calendar_example[action]', 'month');
$request = $request->withQueryParameter('tx_calendar_example[month][month]', '11');
$request = $request->withQueryParameter('tx_calendar_example[month][year]', '2020');
$result = $this->executeFrontendRequest($request);
self::assertSame(200, $result->getStatusCode());
$html = $result->getBody()->__toString();
self::assertStringContainsString('November 2020', $html);
self::assertStringContainsString('exampleValue', $html);
}
/**
* @test
*/
public function modifiedVariablesForCurrentYear(): 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('modifiedVariable', $html);
}
/**
* @test
*/
public function customDataForCurrentYear(): 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(date('Y'), $html);
self::assertStringContainsString('exampleValue', $html);
}
/**
* @test
*/
public function customDataForProvidedYear(): void
{
$request = new InternalRequest();
$request = $request->withPageId(1);
$request = $request->withQueryParameter('tx_calendar_example[action]', 'year');
$request = $request->withQueryParameter('tx_calendar_example[year][year]', '2020');
$result = $this->executeFrontendRequest($request);
self::assertSame(200, $result->getStatusCode());
$html = $result->getBody()->__toString();
self::assertStringContainsString('2020', $html);
self::assertStringContainsString('exampleValue', $html);
}
}

View file

@ -1,356 +0,0 @@
<?php
namespace WerkraumMedia\Calendar\Tests\Unit\Controller\Frontend;
/*
* Copyright (C) 2020 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
use PHPUnit\Framework\TestCase;
use Prophecy\Argument as ProphetArgument;
use Prophecy\PhpUnit\ProphecyTrait;
use Prophecy\Prophecy\ObjectProphecy;
use Psr\EventDispatcher\EventDispatcherInterface;
use TYPO3\CMS\Extbase\Mvc\Controller\Argument;
use TYPO3\CMS\Extbase\Mvc\Controller\Arguments;
use TYPO3\CMS\Extbase\Mvc\View\ViewInterface;
use TYPO3\CMS\Extbase\Mvc\Web\Request;
use TYPO3\CMS\Extbase\Property\PropertyMappingConfiguration;
use WerkraumMedia\Calendar\Controller\Frontend\CalendarController;
use WerkraumMedia\Calendar\Domain\Model\Day;
use WerkraumMedia\Calendar\Domain\Model\Month;
use WerkraumMedia\Calendar\Domain\Model\Week;
use WerkraumMedia\Calendar\Domain\Model\Year;
use WerkraumMedia\Calendar\Events\AssignTemplateVariables;
use WerkraumMedia\Calendar\Tests\ForcePropertyTrait;
/**
* @covers WerkraumMedia\Calendar\Controller\Frontend\CalendarController
* @testdox The calendar controller
*/
class CalendarControllerTest extends TestCase
{
use ProphecyTrait;
use ForcePropertyTrait;
/**
* @test
*/
public function setsCurrentYearAsDefaultArgument(): void
{
$subject = new CalendarController();
$arguments = $this->allowsMappingOfAllPropertiesForArgument('year')['arguments'];
$request = $this->prophesize(Request::class);
$request->hasArgument('year')->willReturn(false);
$request->setArguments([
'year' => [
'year' => date('Y'),
],
])->shouldBeCalled();
$this->forceProperty($subject, 'request', $request->reveal());
$this->forceProperty($subject, 'arguments', $arguments->reveal());
$subject->initializeYearAction();
$request->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function allowsYearToBeMapped(): void
{
$subject = new CalendarController();
$arguments = $this->allowsMappingOfAllPropertiesForArgument('year')['arguments'];
$request = $this->prophesize(Request::class);
$request->hasArgument('year')->willReturn(true);
$this->forceProperty($subject, 'request', $request->reveal());
$this->forceProperty($subject, 'arguments', $arguments->reveal());
$subject->initializeYearAction();
$arguments->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function addsYearToView(): void
{
$subject = new CalendarController();
$eventDispatcher = $this->prophesize(EventDispatcherInterface::class);
$eventDispatcher->dispatch(ProphetArgument::type(AssignTemplateVariables::class))->shouldBeCalled();
$subject->injectEventDispatcher($eventDispatcher->reveal());
$year = $this->prophesize(Year::class);
$view = $this->prophesize(ViewInterface::class);
$view->assignMultiple([
'year' => $year->reveal(),
])->shouldBeCalled();
$this->forceProperty($subject, 'view', $view->reveal());
$subject->yearAction($year->reveal());
$view->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function setsCurrentMonthAsDefaultArgument(): void
{
$subject = new CalendarController();
$arguments = $this->allowsMappingOfAllPropertiesForArgument('month')['arguments'];
$request = $this->prophesize(Request::class);
$request->hasArgument('month')->willReturn(false);
$request->setArguments([
'month' => [
'month' => date('m'),
'year' => date('Y'),
],
])->shouldBeCalled();
$this->forceProperty($subject, 'request', $request->reveal());
$this->forceProperty($subject, 'arguments', $arguments->reveal());
$subject->initializeMonthAction();
$request->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function allowsMonthToBeMapped(): void
{
$subject = new CalendarController();
$arguments = $this->allowsMappingOfAllPropertiesForArgument('month')['arguments'];
$request = $this->prophesize(Request::class);
$request->hasArgument('month')->willReturn(true);
$this->forceProperty($subject, 'request', $request->reveal());
$this->forceProperty($subject, 'arguments', $arguments->reveal());
$subject->initializeMonthAction();
$arguments->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function addsMonthToView(): void
{
$subject = new CalendarController();
$eventDispatcher = $this->prophesize(EventDispatcherInterface::class);
$eventDispatcher->dispatch(ProphetArgument::type(AssignTemplateVariables::class))->shouldBeCalled();
$subject->injectEventDispatcher($eventDispatcher->reveal());
$month = $this->prophesize(Month::class);
$view = $this->prophesize(ViewInterface::class);
$view->assignMultiple([
'month' => $month->reveal(),
])->shouldBeCalled();
$this->forceProperty($subject, 'view', $view->reveal());
$subject->monthAction($month->reveal());
$view->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function setsCurrentWeekAsDefaultArgument(): void
{
$subject = new CalendarController();
$arguments = $this->allowsMappingOfAllPropertiesForArgument('week')['arguments'];
$request = $this->prophesize(Request::class);
$request->hasArgument('week')->willReturn(false);
$request->setArguments([
'week' => [
'week' => date('W'),
'year' => date('Y'),
],
])->shouldBeCalled();
$this->forceProperty($subject, 'request', $request->reveal());
$this->forceProperty($subject, 'arguments', $arguments->reveal());
$subject->initializeWeekAction();
$request->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function allowsWeekToBeMapped(): void
{
$subject = new CalendarController();
$arguments = $this->allowsMappingOfAllPropertiesForArgument('week')['arguments'];
$request = $this->prophesize(Request::class);
$request->hasArgument('week')->willReturn(true);
$this->forceProperty($subject, 'request', $request->reveal());
$this->forceProperty($subject, 'arguments', $arguments->reveal());
$subject->initializeWeekAction();
$arguments->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function addsWeekToView(): void
{
$subject = new CalendarController();
$eventDispatcher = $this->prophesize(EventDispatcherInterface::class);
$eventDispatcher->dispatch(ProphetArgument::type(AssignTemplateVariables::class))->shouldBeCalled();
$subject->injectEventDispatcher($eventDispatcher->reveal());
$week = $this->prophesize(Week::class);
$view = $this->prophesize(ViewInterface::class);
$view->assignMultiple([
'week' => $week->reveal(),
])->shouldBeCalled();
$this->forceProperty($subject, 'view', $view->reveal());
$subject->weekAction($week->reveal());
$view->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function setsCurrentDayAsDefaultArgument(): void
{
$subject = new CalendarController();
$prophecies = $this->allowsMappingOfAllPropertiesForArgument('day');
$propertyConfiguration = $prophecies['propertyMappingConfiguration'];
$arguments = $prophecies['arguments'];
$request = $this->prophesize(Request::class);
$request->hasArgument('day')->willReturn(false);
$request->setArguments(ProphetArgument::that(function (array $arguments) {
return count($arguments) === 1
&& isset($arguments['day'])
&& $arguments['day'] instanceof \DateTimeImmutable
&& $arguments['day']->format('Y-m-d') === date('Y-m-d')
;
}))->shouldBeCalled();
$configuration = $this->prophesize(PropertyMappingConfiguration::class);
$configuration->setTypeConverterOption(
'',
'',
'Y-m-d'
);
$propertyConfiguration->forProperty('day')->willReturn($configuration);
$this->forceProperty($subject, 'request', $request->reveal());
$this->forceProperty($subject, 'arguments', $arguments->reveal());
$subject->initializeDayAction();
$request->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function configuredMappingForDay(): void
{
$subject = new CalendarController();
$prophecies = $this->allowsMappingOfAllPropertiesForArgument('day');
$propertyConfiguration = $prophecies['propertyMappingConfiguration'];
$arguments = $prophecies['arguments'];
$request = $this->prophesize(Request::class);
$request->hasArgument('day')->willReturn(true);
$configuration = $this->prophesize(PropertyMappingConfiguration::class);
$configuration->setTypeConverterOption(
'',
'',
'Y-m-d'
);
$propertyConfiguration->forProperty('day')->willReturn($configuration);
$this->forceProperty($subject, 'request', $request->reveal());
$this->forceProperty($subject, 'arguments', $arguments->reveal());
$subject->initializeDayAction();
$arguments->checkProphecyMethodsPredictions();
}
/**
* @test
*/
public function addsDayToView(): void
{
$subject = new CalendarController();
$eventDispatcher = $this->prophesize(EventDispatcherInterface::class);
$eventDispatcher->dispatch(ProphetArgument::type(AssignTemplateVariables::class))->shouldBeCalled();
$subject->injectEventDispatcher($eventDispatcher->reveal());
$day = $this->prophesize(Day::class);
$view = $this->prophesize(ViewInterface::class);
$view->assignMultiple([
'day' => $day->reveal(),
])->shouldBeCalled();
$this->forceProperty($subject, 'view', $view->reveal());
$subject->dayAction($day->reveal());
$view->checkProphecyMethodsPredictions();
}
private function allowsMappingOfAllPropertiesForArgument(string $argumentName): array
{
$propertyMappingConfiguration = $this->prophesize(PropertyMappingConfiguration::class);
$propertyMappingConfiguration->allowAllProperties()->shouldBeCalled();
$argument = $this->prophesize(Argument::class);
$argument->getPropertyMappingConfiguration()->willReturn($propertyMappingConfiguration);
$arguments = $this->prophesize(Arguments::class);
$arguments->getArgument($argumentName)->willReturn($argument->reveal());
return [
'propertyMappingConfiguration' => $propertyMappingConfiguration,
'argument' => $argument,
'arguments' => $arguments,
];
}
}

View file

@ -24,7 +24,8 @@
},
"autoload-dev": {
"psr-4": {
"WerkraumMedia\\Calendar\\Tests\\": "Tests/"
"WerkraumMedia\\Calendar\\Tests\\": "Tests/",
"WerkraumMedia\\CalendarExample\\": "Tests/Fixtures/calendar_example/Classes/"
}
},
"require-dev": {
@ -32,7 +33,9 @@
"maglnet/composer-require-checker": "^2.1",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5",
"symplify/easy-coding-standard": "^9.2"
"symplify/easy-coding-standard": "^9.2",
"typo3/cms-fluid-styled-content": "^10.4",
"typo3/testing-framework": "^6.6"
},
"extra": {
"typo3/cms": {
@ -40,5 +43,11 @@
"extension-key": "calendar",
"web-dir": ".Build/web"
}
},
"scripts": {
"post-autoload-dump": [
"@php -r 'is_dir($extFolder = __DIR__ . \"/.Build/web/typo3conf/ext/\") || mkdir($extFolder, 0777, true);'",
"@php -r 'file_exists($extFolder = __DIR__ . \"/.Build/web/typo3conf/ext/calendar\") || symlink(__DIR__, $extFolder);'"
]
}
}

View file

@ -4,6 +4,7 @@
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/typo3/testing-framework/Resources/Core/Build/FunctionalTestsBootstrap.php"
colors="true"
convertErrorsToExceptions="true"
convertWarningsToExceptions="true"
@ -20,6 +21,9 @@
<testsuite name="unit">
<directory>Tests/Unit/</directory>
</testsuite>
<testsuite name="functional">
<directory>Tests/Functional/</directory>
</testsuite>
</testsuites>
<coverage>
@ -27,4 +31,8 @@
<directory suffix=".php">Classes</directory>
</include>
</coverage>
<php>
<env name="typo3DatabaseDriver" value="pdo_sqlite"/>
</php>
</phpunit>