12
12
namespace Symfony \Bundle \MakerBundle \Maker \Security ;
13
13
14
14
use Doctrine \Bundle \DoctrineBundle \DoctrineBundle ;
15
+ use Doctrine \ORM \EntityManager ;
15
16
use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
17
+ use Symfony \Bundle \FrameworkBundle \Test \WebTestCase ;
16
18
use Symfony \Bundle \MakerBundle \ConsoleStyle ;
17
19
use Symfony \Bundle \MakerBundle \DependencyBuilder ;
18
20
use Symfony \Bundle \MakerBundle \Exception \RuntimeCommandException ;
19
21
use Symfony \Bundle \MakerBundle \FileManager ;
20
22
use Symfony \Bundle \MakerBundle \Generator ;
21
23
use Symfony \Bundle \MakerBundle \InputConfiguration ;
22
24
use Symfony \Bundle \MakerBundle \Maker \AbstractMaker ;
25
+ use Symfony \Bundle \MakerBundle \Maker \Common \CanGenerateTestsTrait ;
23
26
use Symfony \Bundle \MakerBundle \Security \InteractiveSecurityHelper ;
24
27
use Symfony \Bundle \MakerBundle \Security \SecurityConfigUpdater ;
25
28
use Symfony \Bundle \MakerBundle \Security \SecurityControllerBuilder ;
33
36
use Symfony \Component \Console \Command \Command ;
34
37
use Symfony \Component \Console \Input \InputInterface ;
35
38
use Symfony \Component \HttpFoundation \Response ;
39
+ use Symfony \Component \PasswordHasher \Hasher \UserPasswordHasherInterface ;
36
40
use Symfony \Component \Routing \Attribute \Route ;
37
41
use Symfony \Component \Security \Http \Authentication \AuthenticationUtils ;
38
42
use Symfony \Component \Yaml \Yaml ;
48
52
*/
49
53
final class MakeFormLogin extends AbstractMaker
50
54
{
55
+ use CanGenerateTestsTrait;
56
+
51
57
private const SECURITY_CONFIG_PATH = 'config/packages/security.yaml ' ;
52
58
private YamlSourceManipulator $ ysm ;
53
59
private string $ controllerName ;
54
60
private string $ firewallToUpdate ;
61
+ private string $ userClass ;
55
62
private string $ userNameField ;
56
63
private bool $ willLogout ;
57
64
@@ -70,6 +77,8 @@ public static function getCommandName(): string
70
77
public function configureCommand (Command $ command , InputConfiguration $ inputConfig ): void
71
78
{
72
79
$ command ->setHelp (file_get_contents (\dirname (__DIR__ , 2 ).'/Resources/help/security/MakeFormLogin.txt ' ));
80
+
81
+ $ this ->configureCommandWithTestsOption ($ command );
73
82
}
74
83
75
84
public static function getCommandDescription (): string
@@ -116,9 +125,11 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
116
125
117
126
$ securityHelper = new InteractiveSecurityHelper ();
118
127
$ 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 ' ]);
121
130
$ this ->willLogout = $ io ->confirm ('Do you want to generate a \'/logout \' URL? ' );
131
+
132
+ $ this ->interactSetGenerateTests ($ input , $ io );
122
133
}
123
134
124
135
public function generate (InputInterface $ input , ConsoleStyle $ io , Generator $ generator ): void
@@ -167,6 +178,39 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
167
178
$ securityData = $ this ->securityConfigUpdater ->updateForLogout ($ securityData , $ this ->firewallToUpdate );
168
179
}
169
180
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
+
170
214
$ generator ->dumpFile (self ::SECURITY_CONFIG_PATH , $ securityData );
171
215
172
216
$ generator ->writeChanges ();
0 commit comments