Licitator 1.0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
6.5 KiB

5 years ago
  1. <?php
  2. namespace Prometeo\CommandsBundle\Commands;
  3. use Symfony\Bundle\MakerBundle\Maker\AbstractMaker;
  4. use Symfony\Bundle\FrameworkBundle\Test\WebTestAssertionsTrait;
  5. use Symfony\Bundle\MakerBundle\ConsoleStyle;
  6. use Symfony\Bundle\MakerBundle\DependencyBuilder;
  7. use Symfony\Bundle\MakerBundle\Generator;
  8. use Symfony\Bundle\MakerBundle\InputConfiguration;
  9. use Symfony\Component\BrowserKit\History;
  10. use Symfony\Component\Console\Command\Command;
  11. use Symfony\Component\Console\Input\InputArgument;
  12. use Symfony\Component\Console\Input\InputInterface;
  13. use Symfony\Component\CssSelector\CssSelectorConverter;
  14. use Symfony\Component\Panther\PantherTestCaseTrait;
  15. use Symfony\Component\Routing\Router;
  16. use Symfony\Component\Routing\RouteCollection;
  17. use Symfony\Component\DependencyInjection\Container;
  18. /**
  19. * @author Javier Eguiluz <javier.eguiluz@gmail.com>
  20. * @author Ryan Weaver <weaverryan@gmail.com>
  21. */
  22. class MakeFunctionalTest extends AbstractMaker
  23. {
  24. /**
  25. * @var Container
  26. */
  27. public $container;
  28. /**
  29. * Constructor
  30. *
  31. * @param Container $container
  32. */
  33. public function __construct(Container $container)
  34. {
  35. $this->container = $container;
  36. }
  37. public static function getCommandName(): string
  38. {
  39. return 'prometeo:make:functional-test';
  40. }
  41. public function configureCommand(Command $command, InputConfiguration $inputConf)
  42. {
  43. $command
  44. ->setDescription('Creates a new functional test class')
  45. ->addArgument('name', InputArgument::OPTIONAL, 'The name of the functional test class (e.g. <fg=yellow>DefaultControllerTest</>)')
  46. ->addArgument('classtype', InputArgument::OPTIONAL, 'Type of class to test (e.g. <fg=yellow>Admin</>)')
  47. ->addArgument('username', InputArgument::OPTIONAL, 'Username for tests')
  48. ->addArgument('password', InputArgument::OPTIONAL, 'Password for test')
  49. ->setHelp(file_get_contents(__DIR__.'/../Resources/help/MakeFunctionalTest.txt'))
  50. ;
  51. }
  52. /**
  53. * @param $filter
  54. * @return array
  55. * @throws \Exception
  56. */
  57. public function getRoutes($filter)
  58. {
  59. /** @var Router $router */
  60. $router = $this->container->get('router');
  61. $allRoutes = $router->getRouteCollection();
  62. $routes = $allRoutes->all();
  63. $filtered_routes=[];
  64. $controllerAdmin='';
  65. /** @var $params \Symfony\Component\Routing\Route */
  66. foreach ($routes as $route => $params)
  67. {
  68. $defaults = $params->getDefaults();
  69. if (isset($defaults['_controller']))
  70. {
  71. $controllerAction = explode(':', $defaults['_controller']);
  72. $controller = $controllerAction[0];
  73. //Filtramos los controller de los admin
  74. if(strpos($controller, 'App\Controller\Admin\\'.$filter)!==false){
  75. $controllerAdmin=$controller;
  76. if (!isset($filtered_routes[$controller])) {
  77. $filtered_routes[$controller]['routes'] = array();
  78. $filtered_routes[$controller]['urls'] = array();
  79. }
  80. $filtered_routes[$controller]['routes'][]= $route;
  81. $filtered_routes[$controller]['urls'][]=strtok( $router->generate($route, array('id'=>1, 'position'=>1, 'childId'=>1)),'?');
  82. }
  83. }
  84. }
  85. return [
  86. 'routes' => $filtered_routes[$controllerAdmin]
  87. ];
  88. }
  89. /**
  90. * @param \Symfony\Component\Routing\Route $route
  91. * @throws \Exception
  92. */
  93. private function convertController(\Symfony\Component\Routing\Route $route)
  94. {
  95. $nameParser = $this->container->get('controller_name_converter');
  96. if ($route->hasDefault('_controller')) {
  97. try {
  98. $route->setDefault('_controller', $nameParser->build($route->getDefault('_controller')));
  99. } catch (\InvalidArgumentException $e) {
  100. }
  101. }
  102. }
  103. public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator)
  104. {
  105. $originClass=$input->getArgument('name');
  106. $username=$input->getArgument('username');
  107. $password=$input->getArgument('password');
  108. $testClassNameDetails = $generator->createClassNameDetails(
  109. $input->getArgument('name'),
  110. 'Tests\\Admin',
  111. 'Test'
  112. );
  113. if($input->getArgument('classtype')) {
  114. switch ($input->getArgument('classtype')) {
  115. case 'Admin':
  116. $endclass = explode('\\', $originClass);
  117. $originClass = end($endclass);
  118. $routes=$this->getRoutes($originClass);
  119. $generator->generateClass(
  120. $testClassNameDetails->getFullName(),
  121. __DIR__ . '/../Resources/skeleton/test/Functional.tpl.php',
  122. [
  123. 'username'=>$username,
  124. 'password'=>$password,
  125. 'routes'=>$routes,
  126. 'originClass' => $originClass,
  127. 'web_assertions_are_available' => trait_exists(WebTestAssertionsTrait::class),
  128. 'panther_is_available' => trait_exists(PantherTestCaseTrait::class),
  129. ]
  130. );
  131. break;
  132. }
  133. }else{
  134. $generator->generateClass(
  135. $testClassNameDetails->getFullName(),
  136. __DIR__.'/../Resources/skeleton/test/Functional.tpl.php',
  137. [
  138. 'originClass'=>$originClass,
  139. 'web_assertions_are_available' => trait_exists(WebTestAssertionsTrait::class),
  140. 'panther_is_available' => trait_exists(PantherTestCaseTrait::class),
  141. ]
  142. );
  143. }
  144. $generator->writeChanges();
  145. $this->writeSuccessMessage($io);
  146. $io->text([
  147. 'Next: Open your new test class and start customizing it.',
  148. 'Find the documentation at <fg=yellow>https://symfony.com/doc/current/testing.html#functional-tests</>',
  149. ]);
  150. }
  151. public function configureDependencies(DependencyBuilder $dependencies)
  152. {
  153. $dependencies->addClassDependency(
  154. History::class,
  155. 'browser-kit',
  156. true,
  157. true
  158. );
  159. $dependencies->addClassDependency(
  160. CssSelectorConverter::class,
  161. 'css-selector',
  162. true,
  163. true
  164. );
  165. }
  166. }