16
16
use Symfony \Bridge \Twig \AppVariable ;
17
17
use Symfony \Bridge \Twig \Mime \TemplatedEmail ;
18
18
use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
19
+ use Symfony \Bundle \FrameworkBundle \KernelBrowser ;
20
+ use Symfony \Bundle \FrameworkBundle \Test \WebTestCase ;
19
21
use Symfony \Bundle \MakerBundle \ConsoleStyle ;
20
22
use Symfony \Bundle \MakerBundle \DependencyBuilder ;
21
23
use Symfony \Bundle \MakerBundle \Doctrine \DoctrineHelper ;
26
28
use Symfony \Bundle \MakerBundle \FileManager ;
27
29
use Symfony \Bundle \MakerBundle \Generator ;
28
30
use Symfony \Bundle \MakerBundle \InputConfiguration ;
31
+ use Symfony \Bundle \MakerBundle \Maker \Common \CanGenerateTestsTrait ;
29
32
use Symfony \Bundle \MakerBundle \Maker \Common \UidTrait ;
30
33
use Symfony \Bundle \MakerBundle \Security \InteractiveSecurityHelper ;
31
34
use Symfony \Bundle \MakerBundle \Util \ClassNameDetails ;
51
54
use Symfony \Component \OptionsResolver \OptionsResolver ;
52
55
use Symfony \Component \PasswordHasher \Hasher \UserPasswordHasherInterface ;
53
56
use Symfony \Component \Routing \Attribute \Route ;
57
+ use Symfony \Component \Routing \Route as RouteObject ;
58
+ use Symfony \Component \Routing \RouterInterface ;
54
59
use Symfony \Component \Translation \Translator ;
55
60
use Symfony \Component \Validator \Constraints \Length ;
56
61
use Symfony \Component \Validator \Constraints \NotBlank ;
81
86
*/
82
87
class MakeResetPassword extends AbstractMaker
83
88
{
89
+ use CanGenerateTestsTrait;
84
90
use UidTrait;
85
91
86
92
private string $ fromEmailAddress ;
87
93
private string $ fromEmailName ;
88
94
private string $ controllerResetSuccessRedirect ;
95
+ private ?RouteObject $ controllerResetSuccessRoute = null ;
89
96
private string $ userClass ;
90
97
private string $ emailPropertyName ;
91
98
private string $ emailGetterMethodName ;
@@ -95,6 +102,7 @@ public function __construct(
95
102
private FileManager $ fileManager ,
96
103
private DoctrineHelper $ doctrineHelper ,
97
104
private EntityClassGenerator $ entityClassGenerator ,
105
+ private ?RouterInterface $ router = null ,
98
106
) {
99
107
}
100
108
@@ -115,6 +123,7 @@ public function configureCommand(Command $command, InputConfiguration $inputConf
115
123
;
116
124
117
125
$ this ->addWithUuidOption ($ command );
126
+ $ this ->configureCommandWithTestsOption ($ command );
118
127
}
119
128
120
129
public function configureDependencies (DependencyBuilder $ dependencies ): void
@@ -172,6 +181,10 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
172
181
Validator::notBlank (...)
173
182
);
174
183
184
+ if ($ this ->router instanceof RouterInterface) {
185
+ $ this ->controllerResetSuccessRoute = $ this ->router ->getRouteCollection ()->get ($ this ->controllerResetSuccessRedirect );
186
+ }
187
+
175
188
$ io ->section ('- Email - ' );
176
189
$ emailText [] = 'These are used to generate the email code. Don \'t worry, you can change them in the code later! ' ;
177
190
$ io ->text ($ emailText );
@@ -187,6 +200,8 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
187
200
null ,
188
201
Validator::notBlank (...)
189
202
);
203
+
204
+ $ this ->interactSetGenerateTests ($ input , $ io );
190
205
}
191
206
192
207
public function generate (InputInterface $ input , ConsoleStyle $ io , Generator $ generator ): void
@@ -334,6 +349,44 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
334
349
'resetPassword/twig_reset.tpl.php '
335
350
);
336
351
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
+
337
390
$ generator ->writeChanges ();
338
391
339
392
$ this ->writeSuccessMessage ($ io );
0 commit comments