* @author Ryan Weaver */ 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. DefaultControllerTest)') ->addArgument('classtype', InputArgument::OPTIONAL, 'Type of class to test (e.g. 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 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 ); } }