mirror of https://github.com/FriendsOfTYPO3/tea.git synced 2024-11-22 02:16:12 +01:00

Compare commits

...

18 commits

Author SHA1 Message Date
Karsten Nowak
a7101db787 [BUGFIX] Fix error with spread operator in php 7.4
In php 7.4 error occured:
`Cannot unpack array with string keys`

Related #1120
2024-08-20 09:15:23 +02:00
Karsten Nowak
73b8069137 [BUGFIX] Fix some php stan errors
Related #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
3c240fef23 [TASK] Remove unused imports
Related #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
2b04b06efa [TASK] Rename test functions
Related #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
7cce622b3d [TASK] Check that existing teas in other pids were not deleted
Related #1120
2024-08-20 08:56:13 +02:00
50ff004199 Fix broken functional test
SQLite does reset the UID autoincrement during deletion.
That way the assertions do not match.
We now use a different set up and remove the uids from assertions.

That way we still ensure that the imported data is removed and new data
is imported. We do not need to care about UID.
2024-08-20 08:56:13 +02:00
Karsten Nowak
7d1176c024 [TASK] Add functional test for createTestDataCommand
Related #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
febf422b9b [TASK] Remove unnecessary is_int check of pageUid
Related #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
1430186268 [TASK] Update reference index after changing test data
Related #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
91e2a2d16f [TASK] use assert to state data restrictions
Related #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
4f6e145326 [TASK] Rename pageId to pageUid
Related #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
a0e5b1c69b [TASK] Move comment directly above the class
Related #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
742a6fc34f Update Classes/Command/CreateTestDataCommand.php
Co-authored-by: Oliver Klee <typo3-coding@oliverklee.de>
2024-08-20 08:56:13 +02:00
Karsten Nowak
38e2380198 Update Classes/Command/CreateTestDataCommand.php
Co-authored-by: Oliver Klee <typo3-coding@oliverklee.de>
2024-08-20 08:56:13 +02:00
Karsten Nowak
33ce1f2e66 [BUGFIX] Fix errors from php cs fixer
Related: #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
f5fe3a81b0 [DOCS] Add documentation part for command controller
Related: #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
6b9fa2cb95 [TASK] Remove phpDocumentor reflection type
Related: #1120
2024-08-20 08:56:13 +02:00
Karsten Nowak
90ace1025d [FEATURE] Add command controller to create test data
Related: #11120
2024-08-20 08:56:13 +02:00
11 changed files with 275 additions and 0 deletions

View file

@ -0,0 +1,86 @@
<?php
declare(strict_types=1);
namespace TTN\Tea\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use TYPO3\CMS\Core\Database\Connection;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\ReferenceIndex;
use TYPO3\CMS\Core\Utility\GeneralUtility;
/*
* Command to create test data for the tea extension.
*/
final class CreateTestDataCommand extends Command
{
/**
* @var list<array{title: non-empty-string, description: non-empty-string, sys_language_uid: int<0, max>}>
*/
protected array $teaData = [
[
'title' => 'Darjeeling',
'description' => 'I love that tea!',
'sys_language_uid' => 0,
],
[
'title' => 'Earl Grey',
'description' => 'A nice tea!',
'sys_language_uid' => 0,
],
];
protected function configure(): void
{
$this
->setHelp('Create test data for the tea extension in an already existing page (sysfolder).')
->addArgument(
'pageUid',
InputArgument::REQUIRED,
'Existing sysfolder page id.'
)
->addOption(
'delete-data-before',
'd',
InputOption::VALUE_NONE,
'Delete all tea data in the defined pid before creating new data.'
);
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$pageUid = $input->getArgument('pageUid') ?? 0;
\assert(\is_int($pageUid));
$deleteDataBefore = $input->getOption('delete-data-before') ?? false;
\assert(\is_bool($deleteDataBefore));
$table = 'tx_tea_domain_model_tea';
$connectionForTable = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($table);
if ($deleteDataBefore) {
$query = $connectionForTable;
$query->delete($table, ['pid' => $pageUid], [Connection::PARAM_INT]);
$output->writeln(sprintf('Existing data in page %s deleted.', $pageUid));
}
$query = $connectionForTable;
foreach ($this->teaData as $item) {
$item = ['pid' => $pageUid, 'title' => $item['title'], 'description' => $item['description']];
$query->insert(
$table,
$item
);
}
$output->writeln(sprintf('Test data in page %s created.', $pageUid));
$referenceIndex = GeneralUtility::makeInstance(ReferenceIndex::class);
$referenceIndex->updateIndex(false);
$output->writeln('Reference index updated.');
return Command::SUCCESS;
}
}

View file

@ -4,6 +4,8 @@ declare(strict_types=1);
namespace Symfony\Component\DependencyInjection\Loader\Configurator; namespace Symfony\Component\DependencyInjection\Loader\Configurator;
use TTN\Tea\Command\CreateTestDataCommand;
return static function (ContainerConfigurator $containerConfigurator) { return static function (ContainerConfigurator $containerConfigurator) {
$services = $containerConfigurator->services() $services = $containerConfigurator->services()
->defaults() ->defaults()
@ -12,4 +14,13 @@ return static function (ContainerConfigurator $containerConfigurator) {
$services->load('TTN\\Tea\\', '../Classes/*') $services->load('TTN\\Tea\\', '../Classes/*')
->exclude('../Classes/Domain/Model/*'); ->exclude('../Classes/Domain/Model/*');
$services->set(CreateTestDataCommand::class)
->tag(
'console.command',
[
'command' => 'tea:createtestdata',
'description' => 'Create test data in existing sysfolder',
]
);
}; };

View file

@ -0,0 +1,28 @@
.. include:: /Includes.rst.txt
.. _command-controller:
==================
Command Controller
==================
The "tea" extension comes with a CommandController that can be used for the
automatic creation of test data. It also serves to illustrate how data can be
created in the database using a command controller.
You must set a page id as argument. Therefore it's necessary to create an
sysfolder before.
You can add option `-d` to delete already existing data.
.. code-block:: bash
vendor/bin/typo3 tea:createtestdata 3
.. seealso::
For further details to Console Commands read the
:ref:`Creating a basic command <t3coreapi:console-command-tutorial-create>`
tutorial.

View file

@ -47,6 +47,7 @@ continuous integration.
TestingFramework TestingFramework
Environment Environment
DependencyManager DependencyManager
CommandController
Running Running
ContinuousIntegration ContinuousIntegration
Documentation Documentation

View file

@ -0,0 +1,121 @@
<?php
declare(strict_types=1);
namespace TTN\Tea\Tests\Functional\Command;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Tester\CommandTester;
use TTN\Tea\Command\CreateTestDataCommand;
use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
/**
* @covers \TTN\Tea\Command\CreateTestDataCommand
*/
class CreateTestDataCommandTest extends FunctionalTestCase
{
private const COMMAND_NAME = 'tea:createtestdata';
protected array $testExtensionsToLoad = ['ttn/tea'];
private CreateTestDataCommand $subject;
private CommandTester $commandTester;
protected function setUp(): void
{
parent::setUp();
$this->importCSVDataSet(__DIR__ . '/Fixtures/Database/Pages.csv');
$this->subject = new CreateTestDataCommand(self::COMMAND_NAME);
$application = new Application();
$application->add($this->subject);
$command = $application->find('tea:createtestdata');
$this->commandTester = new CommandTester($command);
}
/**
* @test
*/
public function isConsoleCommand(): void
{
self::assertInstanceOf(Command::class, $this->subject);
}
/**
* @test
*/
public function hasDescription(): void
{
$expected = 'Create test data for the tea extension in an already existing page (sysfolder).';
self::assertSame($expected, $this->subject->getHelp());
}
/**
* @test
*/
public function hasHelpText(): void
{
$expected = 'Create test data for the tea extension in an already existing page (sysfolder).';
self::assertSame($expected, $this->subject->getHelp());
}
/**
* @test
*/
public function runReturnsSuccessStatus(): void
{
$result = $this->commandTester->execute(
[
'pageUid' => '1',
],
);
self::assertSame(Command::SUCCESS, $result);
}
/**
* @test
*/
public function createsTestData(): void
{
$this->commandTester->execute([
'pageUid' => '1',
]);
self::assertCSVDataSet(__DIR__ . '/Fixtures/Database/Teas.csv');
}
/**
* @test
*/
public function deletesExistingDataOnGivenPidBeforeCreatingNewData(): void
{
$this->importCSVDataSet(__DIR__ . '/Fixtures/Database/ExistingTeas.csv');
$this->commandTester->execute(
[
'pageUid' => '1',
'--delete-data-before' => true,
]
);
self::assertCSVDataSet(__DIR__ . '/Fixtures/Database/TeasAfterDelete.csv');
}
/**
* @test
*/
public function doesNotDeleteDataOnOtherPid(): void
{
$this->importCSVDataSet(__DIR__ . '/Fixtures/Database/OtherExistingTeas.csv');
$this->commandTester->execute(
[
'pageUid' => '1',
'--delete-data-before' => true,
]
);
self::assertCSVDataSet(__DIR__ . '/Fixtures/Database/TeasAfterDeleteOtherExistingTeas.csv');
}
}

View file

@ -0,0 +1,4 @@
"tx_tea_domain_model_tea"
,"uid","pid","title","description","deleted"
,1,1,"Darjeeling","Which already existed in the system",0
,2,1,"Earl Grey","Which already existed in the system",0
Can't render this file because it has a wrong number of fields in line 2.

View file

@ -0,0 +1,6 @@
"tx_tea_domain_model_tea"
,"uid","pid","title","description","deleted"
,3,1,"Darjeeling","Exists and should be deleted","0"
,4,1,"Earl Grey","Exists and should be deleted","0"
,1,2,"Darjeeling","Which already existed in the system",0
,2,2,"Earl Grey","Which already existed in the system",0
Can't render this file because it has a wrong number of fields in line 2.

View file

@ -0,0 +1,4 @@
"pages",,,,,,,,,
,"uid","pid","sorting","deleted","t3_origuid","title",,,
,1,0,256,0,0,"Tea data",,,
,2,0,512,0,0,"Other tea data",,,
1 pages
2 uid pid sorting deleted t3_origuid title
3 1 0 256 0 0 Tea data
4 2 0 512 0 0 Other tea data

View file

@ -0,0 +1,4 @@
"tx_tea_domain_model_tea"
,"uid","pid","title","description","deleted"
,1,1,"Darjeeling","I love that tea!",0
,2,1,"Earl Grey","A nice tea!",0
Can't render this file because it has a wrong number of fields in line 2.

View file

@ -0,0 +1,4 @@
"tx_tea_domain_model_tea"
,"pid","title","description","deleted"
,1,"Darjeeling","I love that tea!",0
,1,"Earl Grey","A nice tea!",0
Can't render this file because it has a wrong number of fields in line 2.

View file

@ -0,0 +1,6 @@
"tx_tea_domain_model_tea"
,"pid","title","description","deleted"
,1,"Darjeeling","I love that tea!",0
,1,"Earl Grey","A nice tea!",0
,2,"Darjeeling","Which already existed in the system",0
,2,"Earl Grey","Which already existed in the system",0
Can't render this file because it has a wrong number of fields in line 2.