1616use Symfony \Bridge \Twig \AppVariable ;
1717use Symfony \Bridge \Twig \Mime \TemplatedEmail ;
1818use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
19+ use Symfony \Bundle \FrameworkBundle \KernelBrowser ;
20+ use Symfony \Bundle \FrameworkBundle \Test \WebTestCase ;
1921use Symfony \Bundle \MakerBundle \ConsoleStyle ;
2022use Symfony \Bundle \MakerBundle \DependencyBuilder ;
2123use Symfony \Bundle \MakerBundle \Doctrine \DoctrineHelper ;
2628use Symfony \Bundle \MakerBundle \FileManager ;
2729use Symfony \Bundle \MakerBundle \Generator ;
2830use Symfony \Bundle \MakerBundle \InputConfiguration ;
31+ use Symfony \Bundle \MakerBundle \Maker \Common \CanGenerateTestsTrait ;
2932use Symfony \Bundle \MakerBundle \Maker \Common \UidTrait ;
3033use Symfony \Bundle \MakerBundle \Security \InteractiveSecurityHelper ;
3134use Symfony \Bundle \MakerBundle \Util \ClassNameDetails ;
5154use Symfony \Component \OptionsResolver \OptionsResolver ;
5255use Symfony \Component \PasswordHasher \Hasher \UserPasswordHasherInterface ;
5356use Symfony \Component \Routing \Attribute \Route ;
57+ use Symfony \Component \Routing \Route as RouteObject ;
58+ use Symfony \Component \Routing \RouterInterface ;
5459use Symfony \Component \Translation \Translator ;
5560use Symfony \Component \Validator \Constraints \Length ;
5661use Symfony \Component \Validator \Constraints \NotBlank ;
8186 */
8287class MakeResetPassword extends AbstractMaker
8388{
89+ use CanGenerateTestsTrait;
8490 use UidTrait;
8591
8692 private string $ fromEmailAddress ;
8793 private string $ fromEmailName ;
8894 private string $ controllerResetSuccessRedirect ;
95+ private ?RouteObject $ controllerResetSuccessRoute = null ;
8996 private string $ userClass ;
9097 private string $ emailPropertyName ;
9198 private string $ emailGetterMethodName ;
@@ -95,6 +102,7 @@ public function __construct(
95102 private FileManager $ fileManager ,
96103 private DoctrineHelper $ doctrineHelper ,
97104 private EntityClassGenerator $ entityClassGenerator ,
105+ private ?RouterInterface $ router = null ,
98106 ) {
99107 }
100108
@@ -115,6 +123,7 @@ public function configureCommand(Command $command, InputConfiguration $inputConf
115123 ;
116124
117125 $ this ->addWithUuidOption ($ command );
126+ $ this ->configureCommandWithTestsOption ($ command );
118127 }
119128
120129 public function configureDependencies (DependencyBuilder $ dependencies ): void
@@ -172,6 +181,10 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
172181 Validator::notBlank (...)
173182 );
174183
184+ if ($ this ->router instanceof RouterInterface) {
185+ $ this ->controllerResetSuccessRoute = $ this ->router ->getRouteCollection ()->get ($ this ->controllerResetSuccessRedirect );
186+ }
187+
175188 $ io ->section ('- Email - ' );
176189 $ emailText [] = 'These are used to generate the email code. Don \'t worry, you can change them in the code later! ' ;
177190 $ io ->text ($ emailText );
@@ -187,6 +200,8 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
187200 null ,
188201 Validator::notBlank (...)
189202 );
203+
204+ $ this ->interactSetGenerateTests ($ input , $ io );
190205 }
191206
192207 public function generate (InputInterface $ input , ConsoleStyle $ io , Generator $ generator ): void
@@ -334,6 +349,44 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
334349 'resetPassword/twig_reset.tpl.php '
335350 );
336351
352+ // Generate PHPUnit tests
353+ if ($ this ->shouldGenerateTests ()) {
354+ $ testClassDetails = $ generator ->createClassNameDetails (
355+ 'ResetPasswordControllerTest ' ,
356+ 'Test \\' ,
357+ );
358+
359+ $ userRepositoryDetails = $ generator ->createClassNameDetails (
360+ sprintf ('%sRepository ' , $ userClassNameDetails ->getShortName ()),
361+ 'Repository \\'
362+ );
363+
364+ $ useStatements = new UseStatementGenerator ([
365+ $ userClassNameDetails ->getFullName (),
366+ $ userRepositoryDetails ->getFullName (),
367+ EntityManagerInterface::class,
368+ KernelBrowser::class,
369+ WebTestCase::class,
370+ UserPasswordHasherInterface::class,
371+ ]);
372+
373+ $ generator ->generateFile (
374+ targetPath: sprintf ('tests/%s.php ' , $ testClassDetails ->getShortName ()),
375+ templateName: 'resetPassword/Test.ResetPasswordController.tpl.php ' ,
376+ variables: [
377+ 'use_statements ' => $ useStatements ,
378+ 'user_short_name ' => $ userClassNameDetails ->getShortName (),
379+ 'user_repo_short_name ' => $ userRepositoryDetails ->getShortName (),
380+ 'success_route_path ' => null !== $ this ->controllerResetSuccessRoute ? $ this ->controllerResetSuccessRoute ->getPath () : '/ ' ,
381+ 'from_email ' => $ this ->fromEmailAddress ,
382+ ],
383+ );
384+
385+ if (!class_exists (WebTestCase::class)) {
386+ $ io ->caution ('You \'ll need to install the `symfony/test-pack` to execute the tests for your new controller. ' );
387+ }
388+ }
389+
337390 $ generator ->writeChanges ();
338391
339392 $ this ->writeSuccessMessage ($ io );
0 commit comments