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 \Test \WebTestCase ;
1618use Symfony \Bundle \MakerBundle \ConsoleStyle ;
1719use Symfony \Bundle \MakerBundle \DependencyBuilder ;
1820use Symfony \Bundle \MakerBundle \Exception \RuntimeCommandException ;
1921use Symfony \Bundle \MakerBundle \FileManager ;
2022use Symfony \Bundle \MakerBundle \Generator ;
2123use Symfony \Bundle \MakerBundle \InputConfiguration ;
2224use Symfony \Bundle \MakerBundle \Maker \AbstractMaker ;
25+ use Symfony \Bundle \MakerBundle \Maker \Common \CanGenerateTestsTrait ;
2326use Symfony \Bundle \MakerBundle \Security \InteractiveSecurityHelper ;
2427use Symfony \Bundle \MakerBundle \Security \SecurityConfigUpdater ;
2528use Symfony \Bundle \MakerBundle \Security \SecurityControllerBuilder ;
3336use Symfony \Component \Console \Command \Command ;
3437use Symfony \Component \Console \Input \InputInterface ;
3538use Symfony \Component \HttpFoundation \Response ;
39+ use Symfony \Component \PasswordHasher \Hasher \UserPasswordHasherInterface ;
3640use Symfony \Component \Routing \Attribute \Route ;
3741use Symfony \Component \Security \Http \Authentication \AuthenticationUtils ;
3842use Symfony \Component \Yaml \Yaml ;
4852 */
4953final class MakeFormLogin extends AbstractMaker
5054{
55+ use CanGenerateTestsTrait;
56+
5157 private const SECURITY_CONFIG_PATH = 'config/packages/security.yaml ' ;
5258 private YamlSourceManipulator $ ysm ;
5359 private string $ controllerName ;
5460 private string $ firewallToUpdate ;
61+ private string $ userClass ;
5562 private string $ userNameField ;
5663 private bool $ willLogout ;
5764
@@ -70,6 +77,8 @@ public static function getCommandName(): string
7077 public function configureCommand (Command $ command , InputConfiguration $ inputConfig ): void
7178 {
7279 $ command ->setHelp (file_get_contents (\dirname (__DIR__ , 2 ).'/Resources/help/security/MakeFormLogin.txt ' ));
80+
81+ $ this ->configureCommandWithTestsOption ($ command );
7382 }
7483
7584 public static function getCommandDescription (): string
@@ -116,9 +125,11 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
116125
117126 $ securityHelper = new InteractiveSecurityHelper ();
118127 $ this ->firewallToUpdate = $ securityHelper ->guessFirewallName ($ io , $ securityData );
119- $ userClass = $ securityHelper ->guessUserClass ($ io , $ securityData ['security ' ]['providers ' ]);
120- $ this ->userNameField = $ securityHelper ->guessUserNameField ($ io , $ userClass , $ securityData ['security ' ]['providers ' ]);
128+ $ this -> userClass = $ securityHelper ->guessUserClass ($ io , $ securityData ['security ' ]['providers ' ]);
129+ $ this ->userNameField = $ securityHelper ->guessUserNameField ($ io , $ this -> userClass , $ securityData ['security ' ]['providers ' ]);
121130 $ this ->willLogout = $ io ->confirm ('Do you want to generate a \'/logout \' URL? ' );
131+
132+ $ this ->interactSetGenerateTests ($ input , $ io );
122133 }
123134
124135 public function generate (InputInterface $ input , ConsoleStyle $ io , Generator $ generator ): void
@@ -167,6 +178,39 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
167178 $ securityData = $ this ->securityConfigUpdater ->updateForLogout ($ securityData , $ this ->firewallToUpdate );
168179 }
169180
181+ if ($ this ->shouldGenerateTests ()) {
182+ $ testClassDetails = $ generator ->createClassNameDetails (
183+ 'LoginControllerTest ' ,
184+ 'Test \\' ,
185+ );
186+
187+ $ useStatements = new UseStatementGenerator ([
188+ sprintf ('\%s ' , $ this ->userClass ),
189+ // $userClassNameDetails->getFullName(),
190+ // $userRepositoryDetails->getFullName(),
191+ EntityManager::class,
192+ WebTestCase::class,
193+ UserPasswordHasherInterface::class,
194+ ]);
195+
196+ $ generator ->generateFile (
197+ targetPath: sprintf ('tests/%s.php ' , $ testClassDetails ->getShortName ()),
198+ templateName: 'security/formLogin/Test.LoginController.tpl.php ' ,
199+ variables: [
200+ 'use_statements ' => $ useStatements ,
201+ 'user_class ' => $ this ->userClass ,
202+ // 'user_short_name' => $userClassNameDetails->getShortName(),
203+ // 'user_repo_short_name' => $userRepositoryDetails->getShortName(),
204+ // 'success_route_path' => null !== $this->controllerResetSuccessRoute ? $this->controllerResetSuccessRoute->getPath() : '/',
205+ // 'from_email' => $this->fromEmailAddress,
206+ ],
207+ );
208+
209+ if (!class_exists (WebTestCase::class)) {
210+ $ io ->caution ('You \'ll need to install the `symfony/test-pack` to execute the tests for your new controller. ' );
211+ }
212+ }
213+
170214 $ generator ->dumpFile (self ::SECURITY_CONFIG_PATH , $ securityData );
171215
172216 $ generator ->writeChanges ();
0 commit comments