22
33namespace Leeovery \LaravelPlaywright \Http \Controllers ;
44
5- use Illuminate \Database \Eloquent \Factories \Factory ;
6- use Illuminate \Http \Request ;
7- use Illuminate \Routing \Route as RoutingRoute ;
85use Illuminate \Support \Arr ;
9- use Illuminate \Support \Facades \Artisan ;
6+ use Illuminate \Support \Str ;
7+ use Illuminate \Http \Request ;
108use Illuminate \Support \Facades \DB ;
119use Illuminate \Support \Facades \Route ;
12- use Illuminate \Support \Str ;
10+ use Illuminate \Support \Facades \Artisan ;
11+ use Illuminate \Routing \Route as RoutingRoute ;
12+ use Illuminate \Database \Eloquent \Factories \Factory ;
1313
1414class LaravelPlaywrightController
1515{
@@ -119,11 +119,11 @@ public function tearDownEnv()
119119 public function routes ()
120120 {
121121 return collect (Route::getRoutes ()->getRoutes ())
122- ->reject (fn (RoutingRoute $ route ) => Str::of ($ route ->getName ())
122+ ->reject (fn (RoutingRoute $ route ) => Str::of ($ route ->getName ())
123123 ->contains (config ('laravel-playwright.route.ignore_names ' ))
124124 )
125- ->reject (fn (RoutingRoute $ route ) => is_null ($ route ->getName ()))
126- ->mapWithKeys (fn (RoutingRoute $ route ) => [
125+ ->reject (fn (RoutingRoute $ route ) => is_null ($ route ->getName ()))
126+ ->mapWithKeys (fn (RoutingRoute $ route ) => [
127127 $ route ->getName () => [
128128 'name ' => $ route ->getName (),
129129 'uri ' => $ route ->uri (),
@@ -150,7 +150,7 @@ public function login(Request $request)
150150 ->first ();
151151 }
152152
153- if (! $ user ) {
153+ if (!$ user ) {
154154 $ user = DB ::transaction (function () use ($ request ) {
155155 return $ this
156156 ->factoryBuilder ($ this ->userClassName ($ request ), $ request ->input ('state ' , []))
@@ -170,45 +170,27 @@ public function login(Request $request)
170170 protected function userClassName (Request $ request )
171171 {
172172 if ($ request ->has ('userModel ' )) {
173- return $ this ->resolveClassAlias ($ request ->input ('userModel ' ));
173+ return $ this ->resolveModelAlias ($ request ->input ('userModel ' ));
174174 }
175175
176176 return config ('laravel-playwright.factory.user ' );
177177 }
178178
179- protected function resolveClassAlias (string $ alias )
179+ protected function resolveModelAlias (string $ alias )
180180 {
181- return data_get (config ('laravel-playwright.factory.aliases ' ), $ alias , $ alias );
181+ return data_get (config ('laravel-playwright.factory.model_aliases ' ), $ alias , $ alias );
182182 }
183183
184184 protected function factoryBuilder ($ model , $ states = []): Factory
185185 {
186- $ factory = $ this ->resolveClassAlias ($ model )::factory ();
187-
188- $ stateSeparator = config ('laravel-playwright.factory.state_separator ' );
189- $ modelSeparator = config ('laravel-playwright.factory.model_separator ' );
186+ $ factory = $ this ->resolveModelAlias ($ model )::factory ();
190187
191188 foreach (Arr::wrap ($ states ) as $ state ) {
192189 $ attributes = [];
193190 if (is_array ($ state )) {
194- $ attributes = collect (...array_values ($ state ))->map (function ($ attribute ) use (
195- $ modelSeparator ,
196- $ stateSeparator
197- ) {
198- if (! is_string ($ attribute ) || ! str_contains ($ attribute , $ stateSeparator )) {
199- return $ attribute ;
200- }
201-
202- [$ model , $ id ] = explode ($ stateSeparator , $ attribute );
203- [$ id , $ column ] = array_pad (explode ($ modelSeparator , $ id ), 2 , null );
204- $ column ??= 'id ' ;
205-
206- return $ this ->resolveClassAlias ($ model )::where ($ column , $ id )->first ();
207- })->filter ()->all ();
208-
191+ $ attributes = $ this ->buildUpStateAttributes ($ state );
209192 $ state = array_key_first ($ state );
210193 }
211-
212194 $ factory = $ factory ->{$ state }(...$ attributes );
213195 }
214196
@@ -252,14 +234,52 @@ public function factory(Request $request)
252234 )
253235 ->count ($ request ->integer ('count ' , 1 ))
254236 ->create ($ request ->input ('attributes ' ))
255- ->each (fn ($ model ) => $ model ->setHidden ([])->setVisible ([]))
237+ ->each (fn ($ model ) => $ model ->setHidden ([])->setVisible ([]))
256238 ->load ($ request ->input ('load ' ) ?? [])
257- ->pipe (fn ($ collection ) => $ collection ->count () > 1
239+ ->pipe (fn ($ collection ) => $ collection ->count () > 1
258240 ? $ collection
259241 : $ collection ->first ());
260242 });
261243 }
262244
245+ protected function buildUpStateAttributes ($ state ): array
246+ {
247+ if (!is_array ($ state )) {
248+ return [];
249+ }
250+
251+ $ aliasSeparator = config ('laravel-playwright.factory.alias_separator ' );
252+ $ paramSeparator = config ('laravel-playwright.factory.param_separator ' );
253+ $ columnSeparator = config ('laravel-playwright.factory.column_separator ' );
254+
255+ return collect (...array_values ($ state ))->map (function ($ attribute ) use (
256+ $ columnSeparator ,
257+ $ paramSeparator ,
258+ $ aliasSeparator
259+ ) {
260+ if (!is_string ($ attribute ) || !str_contains ($ attribute , $ aliasSeparator )) {
261+ return $ attribute ;
262+ }
263+
264+ if (str_contains ($ attribute , '[ ' ) && str_contains ($ attribute , '] ' )) {
265+ [$ alias , $ options ] = explode ($ aliasSeparator , $ attribute );
266+ $ options = str ($ options )->remove ('[ ' )->remove ('] ' )->explode ($ paramSeparator );
267+ return value ($ this ->resolveParamAlias ($ alias ), ...$ options );
268+ }
269+
270+ [$ modelAlias , $ options ] = explode ($ aliasSeparator , $ attribute );
271+ [$ value , $ column ] = array_pad (explode ($ columnSeparator , $ options ), 2 , null );
272+ $ column ??= 'id ' ;
273+
274+ return $ this ->resolveModelAlias ($ modelAlias )::where ($ column , $ value )->first ();
275+ })->filter ()->all ();
276+ }
277+
278+ protected function resolveParamAlias (string $ alias ): callable
279+ {
280+ return data_get (config ('laravel-playwright.factory.param_aliases ' ), $ alias , $ alias );
281+ }
282+
263283 public function logout ()
264284 {
265285 auth ()->logout ();
0 commit comments