From 4613dc1e44ef53f38d9a5c531926db988ed1da2d Mon Sep 17 00:00:00 2001 From: Marko Kunic Date: Mon, 23 Jul 2018 22:40:05 +0200 Subject: [PATCH] tests --- README.md | 4 +- phpunit.xml.dist | 1 + tests/Admin/ImportAdminExtensionTest.php | 72 +++++++++ tests/DataFixtures/Admin.php | 11 ++ tests/DataFixtures/Controller.php | 14 ++ tests/DataFixtures/ImportConfiguration.php | 29 ++++ .../AutoConfigureCompilerPassTest.php | 140 ++++++++++++++++++ .../SonataImporterExtensionTest.php | 31 ++++ tests/Form/AdminImportTest.php | 53 +++++++ tests/SonataImporterBundleTest.php | 45 ++++++ 10 files changed, 398 insertions(+), 2 deletions(-) create mode 100644 tests/Admin/ImportAdminExtensionTest.php create mode 100644 tests/DataFixtures/Admin.php create mode 100644 tests/DataFixtures/Controller.php create mode 100644 tests/DataFixtures/ImportConfiguration.php create mode 100644 tests/DependencyInjection/Compiler/AutoConfigureCompilerPassTest.php create mode 100644 tests/DependencyInjection/SonataImporterExtensionTest.php create mode 100644 tests/Form/AdminImportTest.php create mode 100644 tests/SonataImporterBundleTest.php diff --git a/README.md b/README.md index e564654..631c255 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ Easier handling of Import in Sonata Admin. Built on top of [Importer](https://github.com/kunicmarko20/importer). [![PHP Version](https://img.shields.io/badge/php-%5E7.1-blue.svg)](https://img.shields.io/badge/php-%5E7.1-blue.svg) -[![Latest Stable Version](https://poser.pugx.org/kunicmarko/SonataImporterBundle/v/stable)](https://packagist.org/packages/kunicmarko/SonataImporterBundle) -[![Latest Unstable Version](https://poser.pugx.org/kunicmarko/SonataImporterBundle/v/unstable)](https://packagist.org/packages/kunicmarko/SonataImporterBundle) +[![Latest Stable Version](https://poser.pugx.org/kunicmarko/sonata-importer-bundle/v/stable)](https://packagist.org/packages/kunicmarko/sonata-importer-bundle) +[![Latest Unstable Version](https://poser.pugx.org/kunicmarko/sonata-importer-bundle/v/unstable)](https://packagist.org/packages/kunicmarko/sonata-importer-bundle) [![Build Status](https://travis-ci.org/kunicmarko20/SonataImporterBundle.svg?branch=master)](https://travis-ci.org/kunicmarko20/SonataImporterBundle) [![Coverage Status](https://coveralls.io/repos/github/kunicmarko20/SonataImporterBundle/badge.svg?branch=master)](https://coveralls.io/github/kunicmarko20/SonataImporterBundle?branch=master) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index dac926f..0ac0a9e 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -21,6 +21,7 @@ ./src/ ./vendor/ + ./src/Exception/ diff --git a/tests/Admin/ImportAdminExtensionTest.php b/tests/Admin/ImportAdminExtensionTest.php new file mode 100644 index 0000000..d114201 --- /dev/null +++ b/tests/Admin/ImportAdminExtensionTest.php @@ -0,0 +1,72 @@ + + */ +class ImportAdminExtensionTest extends TestCase +{ + /** + * @var ImportAdminExtension + */ + private $extension; + + public function setUp() + { + $this->extension = new ImportAdminExtension([ + 'action_button' => 'action_button_template', + 'dashboard_action' => 'dashboard_action_template', + ]); + } + + public function testConfigureRoutes() + { + $routeCollection = $this->prophesize(RouteCollection::class); + $routeCollection->add(Argument::type('string'))->shouldBeCalled(); + + $this->extension->configureRoutes(new class('', '', '') extends AbstractAdmin implements AdminWithImport { + + }, $routeCollection->reveal()); + } + + public function testConfigureRoutesNoCall() + { + $routeCollection = $this->prophesize(RouteCollection::class); + $routeCollection->add()->shouldNotBeCalled(); + + $this->extension->configureRoutes($this->getAdmin(), $routeCollection->reveal()); + } + + private function getAdmin(): AdminInterface + { + return new class('', '', '') extends AbstractAdmin { + }; + } + + public function testConfigureActionButtons(): void + { + $result = $this->extension->configureActionButtons($this->getAdmin(), [], null, null); + + $this->assertArrayHasKey('import', $result); + $this->assertArrayHasKey('template', $result['import']); + $this->assertSame('action_button_template', $result['import']['template']); + } + + public function testConfigureDashboardActions(): void + { + $result = $this->extension->configureDashboardActions($this->getAdmin(), []); + + $this->assertArrayHasKey('import', $result); + $this->assertArrayHasKey('template', $result['import']); + $this->assertSame('dashboard_action_template', $result['import']['template']); + } +} diff --git a/tests/DataFixtures/Admin.php b/tests/DataFixtures/Admin.php new file mode 100644 index 0000000..7d37fb8 --- /dev/null +++ b/tests/DataFixtures/Admin.php @@ -0,0 +1,11 @@ + + */ +class AutoConfigureCompilerPassTest extends TestCase +{ + /** + * @var AutoConfigureCompilerPass + */ + private $compilerPass; + + /** + * @var ContainerBuilder + */ + private $containerBuilder; + + public function setUp(): void + { + $this->compilerPass = new AutoConfigureCompilerPass(); + $this->containerBuilder = new ContainerBuilder(); + } + + public function testProcess(): void + { + $this->containerBuilder->setDefinition( + 'admin', + ($adminDefinition = new Definition( + Admin::class, + [ + 0, + 1, + 'SonataAdminBundle:CRUD' + ] + ) + )->setTags([ + 'sonata.importer.admin' => [], + 'sonata.admin' => [], + ]) + ); + + $this->containerBuilder->setDefinition( + 'controller', + ($controllerDefinition = new Definition( + Controller::class + ) + )->setTags([ + 'sonata.importer.controller' => [], + ]) + ); + + $this->containerBuilder->setDefinition( + 'importConfiguration', + (new Definition( + ImportConfiguration::class + ) + )->setTags([ + 'sonata.importer.configuration' => [], + ]) + ); + + $this->compilerPass->process($this->containerBuilder); + + $this->assertSame(ImportCRUDController::class, $adminDefinition->getArgument(2)); + + $methodCall = $controllerDefinition->getMethodCalls()[0]; + $methodName = $methodCall[0]; + $methodArguments = $methodCall[1][0]; + + $this->assertSame('setImportConfigurations', $methodName); + $this->assertCount(1, $methodArguments); + $this->assertSame(Admin::class, key($methodArguments)); + $this->assertSame('csv', key($methodArguments[Admin::class])); + $this->assertSame(ImportConfiguration::class, $methodArguments[Admin::class]['csv']->getClass()); + } + + /** + * @expectedException \KunicMarko\SonataImporterBundle\Exception\ImportConfigurationMissingInterface + */ + public function testProcessImportConfigurationMissing(): void + { + $this->containerBuilder->setDefinition( + 'importConfigurationMissing', + (new Definition( + self::class + ) + )->setTags([ + 'sonata.importer.configuration' => [], + ]) + ); + + $this->compilerPass->process($this->containerBuilder); + } + + /** + * @expectedException \KunicMarko\SonataImporterBundle\Exception\ControllerMissingMethod + */ + public function testProcessControllerMissingMethod(): void + { + $this->containerBuilder->setDefinition( + 'import admin that isn\'t sonata admin', + (new Definition( + Admin::class, + [ + 0, + 1, + 'SonataAdminBundle:CRUD' + ] + ) + )->setTags([ + 'sonata.importer.admin' => [], + ]) + ); + + $this->containerBuilder->setDefinition( + 'controllerMissingMethod', + (new Definition( + self::class + ) + )->setTags([ + 'sonata.importer.controller' => [], + ]) + ); + + $this->compilerPass->process($this->containerBuilder); + } +} diff --git a/tests/DependencyInjection/SonataImporterExtensionTest.php b/tests/DependencyInjection/SonataImporterExtensionTest.php new file mode 100644 index 0000000..e0097b5 --- /dev/null +++ b/tests/DependencyInjection/SonataImporterExtensionTest.php @@ -0,0 +1,31 @@ + + */ +final class SonataImporterExtensionTest extends AbstractExtensionTestCase +{ + public function testLoadsFormServiceDefinition(): void + { + $this->container->setParameter('kernel.project_dir', $param = 'test'); + + $this->load(); + + $this->assertContainerBuilderHasService( + ImportCRUDController::class + ); + } + + protected function getContainerExtensions(): array + { + return [new SonataImporterExtension()]; + } +} diff --git a/tests/Form/AdminImportTest.php b/tests/Form/AdminImportTest.php new file mode 100644 index 0000000..a90b094 --- /dev/null +++ b/tests/Form/AdminImportTest.php @@ -0,0 +1,53 @@ + + */ +class AdminImportTest extends TypeTestCase +{ + /** + * @var UploadedFile + */ + private $uploadedFile; + + private $file; + + public function setUp() + { + parent::setUp(); + + $this->uploadedFile = new UploadedFile( + $this->file = tempnam(sys_get_temp_dir(), 'test'), + 'imp.csv' + ); + } + + public function testSubmitValidData(): void + { + $form = $this->factory->create( + AdminImportForm::class, + new AdminImportDTO() + ); + + $form->submit([ + 'file' => $this->uploadedFile + ]); + + $this->assertTrue($form->isSynchronized()); + $view = $form->createView(); + + $this->assertArrayHasKey('file', $view->children); + } + + public function tearDown() + { + unlink($this->file); + } +} diff --git a/tests/SonataImporterBundleTest.php b/tests/SonataImporterBundleTest.php new file mode 100644 index 0000000..1a01d61 --- /dev/null +++ b/tests/SonataImporterBundleTest.php @@ -0,0 +1,45 @@ + + */ +final class SonataImporterBundleTest extends TestCase +{ + /** + * @var SonataImporterBundle + */ + private $bundle; + + protected function setUp() + { + $this->bundle = new SonataImporterBundle(); + } + + public function testBundle(): void + { + $this->assertInstanceOf(Bundle::class, $this->bundle); + } + + public function testCompilerPasses(): void + { + $containerBuilder = $this->prophesize(ContainerBuilder::class); + + $containerBuilder->addCompilerPass( + Argument::type(AutoConfigureCompilerPass::class), + Argument::cetera() + )->shouldBeCalledTimes(1); + + $this->bundle->build($containerBuilder->reveal()); + } +}