1212namespace Symfony \Bundle \MakerBundle \Maker \Security ;
1313
1414use Doctrine \Bundle \DoctrineBundle \DoctrineBundle ;
15+ use Doctrine \ORM \EntityManager ;
1516use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
17+ use Symfony \Bundle \FrameworkBundle \KernelBrowser ;
18+ use Symfony \Bundle \FrameworkBundle \Test \WebTestCase ;
1619use Symfony \Bundle \MakerBundle \ConsoleStyle ;
1720use Symfony \Bundle \MakerBundle \DependencyBuilder ;
1821use Symfony \Bundle \MakerBundle \Exception \RuntimeCommandException ;
1922use Symfony \Bundle \MakerBundle \FileManager ;
2023use Symfony \Bundle \MakerBundle \Generator ;
2124use Symfony \Bundle \MakerBundle \InputConfiguration ;
2225use Symfony \Bundle \MakerBundle \Maker \AbstractMaker ;
26+ use Symfony \Bundle \MakerBundle \Maker \Common \CanGenerateTestsTrait ;
2327use Symfony \Bundle \MakerBundle \Security \InteractiveSecurityHelper ;
2428use Symfony \Bundle \MakerBundle \Security \SecurityConfigUpdater ;
2529use Symfony \Bundle \MakerBundle \Security \SecurityControllerBuilder ;
3337use Symfony \Component \Console \Command \Command ;
3438use Symfony \Component \Console \Input \InputInterface ;
3539use Symfony \Component \HttpFoundation \Response ;
40+ use Symfony \Component \PasswordHasher \Hasher \UserPasswordHasherInterface ;
3641use Symfony \Component \Routing \Attribute \Route ;
3742use Symfony \Component \Security \Http \Authentication \AuthenticationUtils ;
3843use Symfony \Component \Yaml \Yaml ;
4853 */
4954final class MakeFormLogin extends AbstractMaker
5055{
56+ use CanGenerateTestsTrait;
57+
5158 private const SECURITY_CONFIG_PATH = 'config/packages/security.yaml ' ;
5259 private YamlSourceManipulator $ ysm ;
5360 private string $ controllerName ;
5461 private string $ firewallToUpdate ;
62+ private string $ userClass ;
5563 private string $ userNameField ;
5664 private bool $ willLogout ;
5765
@@ -70,6 +78,8 @@ public static function getCommandName(): string
7078 public function configureCommand (Command $ command , InputConfiguration $ inputConfig ): void
7179 {
7280 $ command ->setHelp (file_get_contents (\dirname (__DIR__ , 2 ).'/Resources/help/security/MakeFormLogin.txt ' ));
81+
82+ $ this ->configureCommandWithTestsOption ($ command );
7383 }
7484
7585 public static function getCommandDescription (): string
@@ -116,9 +126,11 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
116126
117127 $ securityHelper = new InteractiveSecurityHelper ();
118128 $ this ->firewallToUpdate = $ securityHelper ->guessFirewallName ($ io , $ securityData );
119- $ userClass = $ securityHelper ->guessUserClass ($ io , $ securityData ['security ' ]['providers ' ]);
120- $ this ->userNameField = $ securityHelper ->guessUserNameField ($ io , $ userClass , $ securityData ['security ' ]['providers ' ]);
129+ $ this -> userClass = $ securityHelper ->guessUserClass ($ io , $ securityData ['security ' ]['providers ' ]);
130+ $ this ->userNameField = $ securityHelper ->guessUserNameField ($ io , $ this -> userClass , $ securityData ['security ' ]['providers ' ]);
121131 $ this ->willLogout = $ io ->confirm ('Do you want to generate a \'/logout \' URL? ' );
132+
133+ $ this ->interactSetGenerateTests ($ input , $ io );
122134 }
123135
124136 public function generate (InputInterface $ input , ConsoleStyle $ io , Generator $ generator ): void
@@ -167,6 +179,40 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
167179 $ securityData = $ this ->securityConfigUpdater ->updateForLogout ($ securityData , $ this ->firewallToUpdate );
168180 }
169181
182+ if ($ this ->shouldGenerateTests ()) {
183+ $ userClassNameDetails = $ generator ->createClassNameDetails (
184+ '\\' .$ this ->userClass ,
185+ 'Entity \\'
186+ );
187+
188+ $ testClassDetails = $ generator ->createClassNameDetails (
189+ 'LoginControllerTest ' ,
190+ 'Test \\' ,
191+ );
192+
193+ $ useStatements = new UseStatementGenerator ([
194+ $ userClassNameDetails ->getFullName (),
195+ KernelBrowser::class,
196+ EntityManager::class,
197+ WebTestCase::class,
198+ UserPasswordHasherInterface::class,
199+ ]);
200+
201+ $ generator ->generateFile (
202+ targetPath: sprintf ('tests/%s.php ' , $ testClassDetails ->getShortName ()),
203+ templateName: 'security/formLogin/Test.LoginController.tpl.php ' ,
204+ variables: [
205+ 'use_statements ' => $ useStatements ,
206+ 'user_class ' => $ this ->userClass ,
207+ 'user_short_name ' => $ userClassNameDetails ->getShortName (),
208+ ],
209+ );
210+
211+ if (!class_exists (WebTestCase::class)) {
212+ $ io ->caution ('You \'ll need to install the `symfony/test-pack` to execute the tests for your new controller. ' );
213+ }
214+ }
215+
170216 $ generator ->dumpFile (self ::SECURITY_CONFIG_PATH , $ securityData );
171217
172218 $ generator ->writeChanges ();
0 commit comments