|
|
<?php
namespace Prometeo\CommandsBundle\Commands;
use Symfony\Bundle\MakerBundle\Maker\AbstractMaker;use Symfony\Bundle\FrameworkBundle\Test\WebTestAssertionsTrait;use Symfony\Bundle\MakerBundle\ConsoleStyle;use Symfony\Bundle\MakerBundle\DependencyBuilder;use Symfony\Bundle\MakerBundle\Generator;use Symfony\Bundle\MakerBundle\InputConfiguration;use Symfony\Component\BrowserKit\History;use Symfony\Component\Console\Command\Command;use Symfony\Component\Console\Input\InputArgument;use Symfony\Component\Console\Input\InputInterface;use Symfony\Component\CssSelector\CssSelectorConverter;use Symfony\Component\Panther\PantherTestCaseTrait;use Symfony\Component\Routing\Router;use Symfony\Component\Routing\RouteCollection;use Symfony\Component\DependencyInjection\Container;/** * @author Javier Eguiluz <javier.eguiluz@gmail.com> * @author Ryan Weaver <weaverryan@gmail.com> */class MakeFunctionalTest extends AbstractMaker{ /** * @var Container */ public $container;
/** * Constructor * * @param Container $container */ public function __construct(Container $container) { $this->container = $container; } public static function getCommandName(): string { return 'prometeo:make:functional-test'; }
public function configureCommand(Command $command, InputConfiguration $inputConf) { $command ->setDescription('Creates a new functional test class') ->addArgument('name', InputArgument::OPTIONAL, 'The name of the functional test class (e.g. <fg=yellow>DefaultControllerTest</>)') ->addArgument('classtype', InputArgument::OPTIONAL, 'Type of class to test (e.g. <fg=yellow>Admin</>)') ->addArgument('username', InputArgument::OPTIONAL, 'Username for tests') ->addArgument('password', InputArgument::OPTIONAL, 'Password for test') ->setHelp(file_get_contents(__DIR__.'/../Resources/help/MakeFunctionalTest.txt')) ; }
/** * @param $filter * @return array * @throws \Exception */ public function getRoutes($filter) { /** @var Router $router */ $router = $this->container->get('router'); $allRoutes = $router->getRouteCollection(); $routes = $allRoutes->all(); $filtered_routes=[]; $controllerAdmin=''; /** @var $params \Symfony\Component\Routing\Route */ foreach ($routes as $route => $params) { $defaults = $params->getDefaults();
if (isset($defaults['_controller'])) { $controllerAction = explode(':', $defaults['_controller']); $controller = $controllerAction[0]; //Filtramos los controller de los admin
if(strpos($controller, 'App\Controller\Admin\\'.$filter)!==false){ $controllerAdmin=$controller; if (!isset($filtered_routes[$controller])) { $filtered_routes[$controller]['routes'] = array(); $filtered_routes[$controller]['urls'] = array(); }
$filtered_routes[$controller]['routes'][]= $route; $filtered_routes[$controller]['urls'][]=strtok( $router->generate($route, array('id'=>1, 'position'=>1, 'childId'=>1)),'?'); } } } return [ 'routes' => $filtered_routes[$controllerAdmin] ]; }
/** * @param \Symfony\Component\Routing\Route $route * @throws \Exception */ private function convertController(\Symfony\Component\Routing\Route $route) { $nameParser = $this->container->get('controller_name_converter'); if ($route->hasDefault('_controller')) { try { $route->setDefault('_controller', $nameParser->build($route->getDefault('_controller'))); } catch (\InvalidArgumentException $e) { } } } public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator) { $originClass=$input->getArgument('name'); $username=$input->getArgument('username'); $password=$input->getArgument('password');
$testClassNameDetails = $generator->createClassNameDetails( $input->getArgument('name'), 'Tests\\Admin', 'Test' );
if($input->getArgument('classtype')) { switch ($input->getArgument('classtype')) { case 'Admin': $endclass = explode('\\', $originClass); $originClass = end($endclass); $routes=$this->getRoutes($originClass); $generator->generateClass( $testClassNameDetails->getFullName(), __DIR__ . '/../Resources/skeleton/test/Functional.tpl.php', [ 'username'=>$username, 'password'=>$password, 'routes'=>$routes, 'originClass' => $originClass, 'web_assertions_are_available' => trait_exists(WebTestAssertionsTrait::class), 'panther_is_available' => trait_exists(PantherTestCaseTrait::class), ] ); break; } }else{ $generator->generateClass( $testClassNameDetails->getFullName(), __DIR__.'/../Resources/skeleton/test/Functional.tpl.php', [ 'originClass'=>$originClass, 'web_assertions_are_available' => trait_exists(WebTestAssertionsTrait::class), 'panther_is_available' => trait_exists(PantherTestCaseTrait::class), ] ); }
$generator->writeChanges();
$this->writeSuccessMessage($io);
$io->text([ 'Next: Open your new test class and start customizing it.', 'Find the documentation at <fg=yellow>https://symfony.com/doc/current/testing.html#functional-tests</>', ]); }
public function configureDependencies(DependencyBuilder $dependencies) { $dependencies->addClassDependency( History::class, 'browser-kit', true, true ); $dependencies->addClassDependency( CssSelectorConverter::class, 'css-selector', true, true ); }}
|