22
33namespace Leeovery \LaravelPlaywright \Http \Controllers ;
44
5- use Illuminate \Support \Arr ;
6- use Illuminate \Support \Str ;
5+ use Illuminate \Database \Eloquent \Factories \Factory ;
76use Illuminate \Http \Request ;
7+ use Illuminate \Routing \Route as RoutingRoute ;
8+ use Illuminate \Support \Arr ;
9+ use Illuminate \Support \Facades \Artisan ;
810use Illuminate \Support \Facades \DB ;
911use Illuminate \Support \Facades \Route ;
10- use Illuminate \Support \Facades \ Artisan ;
11- use Illuminate \ Routing \ Route as RoutingRoute ;
12- use Illuminate \ Database \ Eloquent \ Factories \ Factory ;
12+ use Illuminate \Support \Str ;
13+ use Leeovery \ LaravelPlaywright \ Exceptions \ LaravelPlaywrightException ;
14+ use Throwable ;
1315
1416class LaravelPlaywrightController
1517{
@@ -119,11 +121,11 @@ public function tearDownEnv()
119121 public function routes ()
120122 {
121123 return collect (Route::getRoutes ()->getRoutes ())
122- ->reject (fn (RoutingRoute $ route ) => Str::of ($ route ->getName ())
124+ ->reject (fn (RoutingRoute $ route ) => Str::of ($ route ->getName ())
123125 ->contains (config ('laravel-playwright.route.ignore_names ' ))
124126 )
125- ->reject (fn (RoutingRoute $ route ) => is_null ($ route ->getName ()))
126- ->mapWithKeys (fn (RoutingRoute $ route ) => [
127+ ->reject (fn (RoutingRoute $ route ) => is_null ($ route ->getName ()))
128+ ->mapWithKeys (fn (RoutingRoute $ route ) => [
127129 $ route ->getName () => [
128130 'name ' => $ route ->getName (),
129131 'uri ' => $ route ->uri (),
@@ -150,7 +152,7 @@ public function login(Request $request)
150152 ->first ();
151153 }
152154
153- if (!$ user ) {
155+ if (! $ user ) {
154156 $ user = DB ::transaction (function () use ($ request ) {
155157 return $ this
156158 ->factoryBuilder ($ this ->userClassName ($ request ), $ request ->input ('state ' , []))
@@ -176,19 +178,31 @@ protected function userClassName(Request $request)
176178 return config ('laravel-playwright.factory.user ' );
177179 }
178180
181+ /**
182+ * @throws Throwable
183+ */
179184 protected function resolveModelAlias (string $ alias )
180185 {
181- return data_get (config ('laravel-playwright.factory.model_aliases ' ), $ alias , $ alias );
186+ $ model = data_get (config ('laravel-playwright.factory.model_aliases ' ), $ alias , $ alias );
187+
188+ throw_unless (class_exists ($ model ),
189+ LaravelPlaywrightException::resolvedModelDoesNotExist ($ model )
190+ );
191+
192+ return $ model ;
182193 }
183194
195+ /**
196+ * @throws Throwable
197+ */
184198 protected function factoryBuilder ($ model , $ states = []): Factory
185199 {
186200 $ factory = $ this ->resolveModelAlias ($ model )::factory ();
187201
188202 foreach (Arr::wrap ($ states ) as $ state ) {
189203 $ attributes = [];
190204 if (is_array ($ state )) {
191- $ attributes = $ this ->buildUpStateAttributes ($ state );
205+ $ attributes = $ this ->resolveStateAttributes ($ state );
192206 $ state = array_key_first ($ state );
193207 }
194208 $ factory = $ factory ->{$ state }(...$ attributes );
@@ -234,54 +248,71 @@ public function factory(Request $request)
234248 )
235249 ->count ($ request ->integer ('count ' , 1 ))
236250 ->create ($ request ->input ('attributes ' ))
237- ->each (fn ($ model ) => $ model ->setHidden ([])->setVisible ([]))
251+ ->each (fn ($ model ) => $ model ->setHidden ([])->setVisible ([]))
238252 ->load ($ request ->input ('load ' ) ?? [])
239- ->pipe (fn ($ collection ) => $ collection ->count () > 1
253+ ->pipe (fn ($ collection ) => $ collection ->count () > 1
240254 ? $ collection
241255 : $ collection ->first ());
242256 });
243257 }
244258
245- protected function buildUpStateAttributes ($ state ): array
259+ protected function resolveStateAttributes ($ state ): array
246260 {
247- if (!is_array ($ state )) {
261+ if (! is_array ($ state )) {
248262 return [];
249263 }
250264
251- $ aliasSeparator = config ('laravel-playwright.factory.alias_separator ' );
252- $ paramSeparator = config ('laravel-playwright.factory.param_separator ' );
265+ $ modelDesignator = config ('laravel-playwright.factory.model_designator ' );
266+ $ modelSeparator = config ('laravel-playwright.factory.model_separator ' );
253267 $ columnSeparator = config ('laravel-playwright.factory.column_separator ' );
268+ $ paramSeparator = config ('laravel-playwright.factory.param_separator ' );
254269
255270 return collect (...array_values ($ state ))->map (function ($ attribute ) use (
271+ $ modelDesignator ,
272+ $ modelSeparator ,
256273 $ columnSeparator ,
257274 $ paramSeparator ,
258- $ aliasSeparator
259275 ) {
260- if (!is_string ($ attribute ) || !str_contains ($ attribute , $ aliasSeparator )) {
276+ if (
277+ ! is_string ($ attribute )
278+ || ! str_contains ($ attribute , $ modelDesignator )
279+ || (! str_contains ($ attribute , '( ' ) && ! str_contains ($ attribute , ') ' ))
280+ ) {
261281 return $ attribute ;
262282 }
263283
264- if (str_contains ($ attribute , '[ ' ) && str_contains ($ attribute , '] ' )) {
265- [$ alias , $ options ] = explode ($ aliasSeparator , $ attribute );
266- $ options = str ($ options )
267- ->remove ('[ ' )
268- ->remove ('] ' )
284+ if (str_contains ($ attribute , '( ' ) && str_contains ($ attribute , ') ' )) {
285+ $ paramAlias = Str::before ($ attribute , '( ' );
286+ $ params = str ($ attribute )
287+ ->between ('( ' , ') ' )
269288 ->explode ($ paramSeparator )
270- ->map (fn ($ option ) => trim ($ option ));
271- return value ($ this ->resolveParamAlias ($ alias ), ...$ options );
289+ ->map (fn ($ option ) => trim ($ option ));
290+
291+ return value ($ this ->resolveParamAlias ($ paramAlias ), ...$ params );
272292 }
273293
274- [$ modelAlias , $ options ] = explode ($ aliasSeparator , $ attribute );
294+ $ attribute = Str::after ($ attribute , $ modelDesignator );
295+
296+ [$ model , $ options ] = explode ($ modelSeparator , $ attribute );
275297 [$ value , $ column ] = array_pad (explode ($ columnSeparator , $ options ), 2 , null );
276298 $ column ??= 'id ' ;
277299
278- return $ this ->resolveModelAlias ($ modelAlias )::where ($ column , $ value )->first ();
300+ return $ this ->resolveModelAlias ($ model )::where ($ column , $ value )->first ();
279301 })->filter ()->all ();
280302 }
281303
304+ /**
305+ * @throws Throwable
306+ */
282307 protected function resolveParamAlias (string $ alias ): callable
283308 {
284- return data_get (config ('laravel-playwright.factory.param_aliases ' ), $ alias , $ alias );
309+ $ paramAlias = data_get (config ('laravel-playwright.factory.param_aliases ' ), $ alias );
310+
311+ throw_if (is_null ($ paramAlias ),
312+ LaravelPlaywrightException::resolvedParamAliasDoesNotExist ($ alias )
313+ );
314+
315+ return $ paramAlias ;
285316 }
286317
287318 public function logout ()
0 commit comments