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