Passed
Push — master ( 8a373e...617e52 )
by Arthur
22:06
created

FileGeneratorTest::testCreateAttribute()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 14
nc 1
nop 0
dl 0
loc 19
rs 9.7998
c 0
b 0
f 0
1
<?php
2
3
namespace Foundation\Tests;
4
5
use Foundation\Abstracts\Tests\TestCase;
6
use Foundation\Core\Larapi;
7
use Foundation\Generator\Abstracts\ResourceGeneratedEvent;
8
use Foundation\Generator\Contracts\ResourceGenerationContract;
9
use Foundation\Generator\Events\AttributeGeneratedEvent;
10
use Foundation\Generator\Events\CommandGeneratedEvent;
11
use Foundation\Generator\Events\ComposerGeneratedEvent;
12
use Foundation\Generator\Events\ControllerGeneratedEvent;
13
use Foundation\Generator\Events\FactoryGeneratedEvent;
14
use Foundation\Generator\Events\JobGeneratedEvent;
15
use Foundation\Generator\Events\ListenerGeneratedEvent;
16
use Foundation\Generator\Events\MiddlewareGeneratedEvent;
17
use Foundation\Generator\Events\MigrationGeneratedEvent;
18
use Foundation\Generator\Events\ModelGeneratedEvent;
19
use Foundation\Generator\Events\NotificationGeneratedEvent;
20
use Foundation\Generator\Events\PermissionGeneratedEvent;
21
use Foundation\Generator\Events\PolicyGeneratedEvent;
22
use Foundation\Generator\Events\ProviderGeneratedEvent;
23
use Foundation\Generator\Events\RequestGeneratedEvent;
24
use Foundation\Generator\Events\RouteGeneratedEvent;
25
use Foundation\Generator\Events\RuleGeneratedEvent;
26
use Foundation\Generator\Events\SeederGeneratedEvent;
27
use Foundation\Generator\Events\ServiceGeneratedEvent;
28
use Foundation\Generator\Events\TestGeneratedEvent;
29
use Foundation\Generator\Events\TransformerGeneratedEvent;
30
use Foundation\Generator\Managers\GeneratorManager;
31
use Foundation\Traits\DispatchedEvents;
32
use Foundation\Traits\DisableRefreshDatabase;
33
use \Illuminate\Support\Facades\Event;
34
use Illuminate\Support\Str;
35
36
/**
37
 * Created by PhpStorm.
38
 * User: arthur
39
 * Date: 10.03.19
40
 * Time: 18:35
41
 */
42
class FileGeneratorTest extends TestCase
43
{
44
    use DisableRefreshDatabase, DispatchedEvents;
45
46
    public function setUp(): void
47
    {
48
        parent::setUp();
49
50
        /* Do not remove this line. It prevents the listener that generates the files from executing */
51
        Event::fake();
52
    }
53
54
    protected function getModuleGenerator(string $moduleName): GeneratorManager
55
    {
56
        return GeneratorManager::module($moduleName, true);
57
    }
58
59
    public function testCreateSqlMigration()
60
    {
61
        $module = 'User';
62
        $class = "CreateUserTable";
63
        $table = "users";
64
        $mongo = false;
65
        $this->getModuleGenerator($module)->createMigration($class, $table, $mongo);
66
67
        $stub = "migration.stub";
68
        $table = "users";
69
70
        /* @var MigrationGeneratedEvent $event */
71
        $event = $this->getFirstDispatchedEvent(MigrationGeneratedEvent::class);
72
        $this->assertNotNull($event);
73
        $this->assertEquals($module, $event->getModuleName());
74
        $this->assertEquals($stub, $event->getStub()->getName());
75
        $this->assertEquals($class, $event->getClassName());
76
        $this->assertEquals($table, $event->getTableName());
77
        $this->assertEquals($mongo,$event->isMongoMigration());
78
    }
79
80
    public function testCreateMongoMigration()
81
    {
82
        $module = 'User';
83
        $class = "CreateUserTable";
84
        $table = "users";
85
        $mongo = true;
86
        $this->getModuleGenerator($module)->createMigration($class, $table, $mongo);
87
88
        $stub = "migration-mongo.stub";
89
        $table = "users";
90
91
        /* @var MigrationGeneratedEvent $event */
92
        $event = $this->getFirstDispatchedEvent(MigrationGeneratedEvent::class);
93
        $this->assertNotNull($event);
94
        $this->assertEquals($module, $event->getModuleName());
95
        $this->assertEquals($stub, $event->getStub()->getName());
96
        $this->assertEquals($class, $event->getClassName());
97
        $this->assertEquals($table, $event->getTableName());
98
        $this->assertEquals($mongo,$event->isMongoMigration());
99
    }
100
101
    public function testCreateFactory()
102
    {
103
        $module = "User";
104
        $model = $module;
105
        $class = $model . "Factory";
106
        $this->getModuleGenerator($module)->createFactory($module);
107
108
        $path = Larapi::getModule($module)->getFactories()->getPath() . "/$class.php";
109
        $stub = "factory.stub";
110
        $modelNamespace  = "Modules\User\Entities\User";
111
112
        /* @var FactoryGeneratedEvent $event */
113
        $event = $this->getFirstDispatchedEvent(FactoryGeneratedEvent::class);
114
        $this->assertFileBasics(
115
            $event,
116
            $module,
117
            $stub,
118
            $path);
119
        $this->assertEquals($class,$event->getClassName());
120
        $this->assertEquals($model,$event->getModel());
121
        $this->assertEquals($modelNamespace,$event->getModelNamespace());
122
123
    }
124
125
    public function testCreateController()
126
    {
127
        $module = "User";
128
        $class = "UserController";
129
        $this->getModuleGenerator($module)->createController($class);
130
131
        $path = Larapi::getModule($module)->getControllers()->getPath() . "/$class.php";
132
        $stub = "controller.stub";
133
        $namespace = "Modules\User\Http\Controllers";
134
135
        /* @var ControllerGeneratedEvent $event */
136
        $event = $this->getFirstDispatchedEvent(ControllerGeneratedEvent::class);
137
        $this->assertClassBasics(
138
            $event,
139
            $module,
140
            $stub,
141
            $class,
142
            $namespace,
143
            $path);
144
    }
145
146
    public function testCreateAttribute()
147
    {
148
        $module = "User";
149
        $class = "UserAttribute";
150
        $this->getModuleGenerator($module)->createAttribute($class);
151
152
        $path = Larapi::getModule($module)->getAttributes()->getPath() . "/$class.php";
153
        $stub = "attribute.stub";
154
        $namespace = "Modules\User\Attributes";
155
156
        /* @var AttributeGeneratedEvent $event */
157
        $event = $this->getFirstDispatchedEvent(AttributeGeneratedEvent::class);
158
        $this->assertClassBasics(
159
            $event,
160
            $module,
161
            $stub,
162
            $class,
163
            $namespace,
164
            $path);
165
    }
166
167
    public function testCreateListener()
168
    {
169
        $module = "User";
170
        $class = "SendWelcomeMail";
171
        $eventClass = "UserRegisteredEvent";
172
        $queued = false;
173
        $this->getModuleGenerator($module)->createListener($class, $eventClass, $queued);
174
175
        $path = Larapi::getModule($module)->getListeners()->getPath() . '/SendWelcomeMail.php';
176
        $stub = "listener.stub";
177
        $namespace = "Modules\User\Listeners";
178
        $eventNamespace = "Modules\User\Events\UserRegisteredEvent";
179
180
        /* @var ListenerGeneratedEvent $event */
181
        $event = $this->getFirstDispatchedEvent(ListenerGeneratedEvent::class);
182
        $this->assertClassBasics(
183
            $event,
184
            $module,
185
            $stub,
186
            $class,
187
            $namespace,
188
            $path);
189
        $this->assertEquals($queued, $event->isQueued());
190
        $this->assertEquals($eventClass, $event->getEvent());
191
        $this->assertEquals($eventNamespace, $event->getEventNamespace());
192
    }
193
194
    public function testCreateQueuedListener()
195
    {
196
        $module = "User";
197
        $class = "SendWelcomeMail";
198
        $eventClass = "UserRegisteredEvent";
199
        $queued = true;
200
        $this->getModuleGenerator($module)->createListener($class, $eventClass, $queued);
201
202
        $path = Larapi::getModule($module)->getListeners()->getPath() . '/SendWelcomeMail.php';
203
        $stub = "listener-queued.stub";
204
        $namespace = "Modules\User\Listeners";
205
        $eventNamespace = "Modules\User\Events\UserRegisteredEvent";
206
207
        /* @var ListenerGeneratedEvent $event */
208
        $event = $this->getFirstDispatchedEvent(ListenerGeneratedEvent::class);
209
        $this->assertClassBasics(
210
            $event,
211
            $module,
212
            $stub,
213
            $class,
214
            $namespace,
215
            $path);
216
        $this->assertEquals($queued, $event->isQueued());
217
        $this->assertEquals($eventClass, $event->getEvent());
218
        $this->assertEquals($eventNamespace, $event->getEventNamespace());
219
    }
220
221
    public function testCreateJob()
222
    {
223
        $module = "User";
224
        $class = "RandomUserJob";
225
        $synchronous = false;
226
227
        $this->getModuleGenerator($module)->createJob($class, $synchronous);
228
229
        $path = Larapi::getModule($module)->getJobs()->getPath() . "/$class.php";
230
        $stub = "job-queued.stub";
231
        $namespace = "Modules\User\Jobs";
232
233
        /* @var JobGeneratedEvent $event */
234
        $event = $this->getFirstDispatchedEvent(JobGeneratedEvent::class);
235
        $this->assertClassBasics(
236
            $event,
237
            $module,
238
            $stub,
239
            $class,
240
            $namespace,
241
            $path);
242
        $this->assertEquals($synchronous, $event->isSynchronous());
243
    }
244
245
    public function testCreateSynchronousJob()
246
    {
247
        $module = "User";
248
        $class = "RandomUserJob";
249
        $synchronous = true;
250
251
        $this->getModuleGenerator($module)->createJob($class, $synchronous);
252
253
        $path = Larapi::getModule($module)->getJobs()->getPath() . "/$class.php";
254
        $stub = "job.stub";
255
        $namespace = "Modules\User\Jobs";
256
257
        /* @var JobGeneratedEvent $event */
258
        $event = $this->getFirstDispatchedEvent(JobGeneratedEvent::class);
259
        $this->assertClassBasics(
260
            $event,
261
            $module,
262
            $stub,
263
            $class,
264
            $namespace,
265
            $path);
266
        $this->assertEquals($synchronous, $event->isSynchronous());
267
    }
268
269
    public function testCreateCommand()
270
    {
271
        $module = "User";
272
        $class = "RandomCommand";
273
        $consoleCommand = "user:dosomethingrandom";
274
275
        $this->getModuleGenerator($module)->createCommand($class, $consoleCommand);
276
277
        $path = Larapi::getModule($module)->getCommands()->getPath() . "/$class.php";
278
        $stub = "command.stub";
279
        $namespace = "Modules\User\Console";
280
281
282
        /* @var CommandGeneratedEvent $event */
283
        $event = $this->getFirstDispatchedEvent(CommandGeneratedEvent::class);
284
        $this->assertClassBasics(
285
            $event,
286
            $module,
287
            $stub,
288
            $class,
289
            $namespace,
290
            $path);
291
        $this->assertEquals($consoleCommand, $event->getConsoleCommand());
292
    }
293
294
    public function testCreateMiddleware()
295
    {
296
        $module = "User";
297
        $class = "RandomMiddleware";
298
299
        $this->getModuleGenerator($module)->createMiddleware($class);
300
301
        $path = Larapi::getModule($module)->getMiddleWare()->getPath() . "/$class.php";
302
        $stub = "middleware.stub";
303
        $namespace = "Modules\User\Http\Middleware";
304
305
        /* @var MiddlewareGeneratedEvent $event */
306
        $event = $this->getFirstDispatchedEvent(MiddlewareGeneratedEvent::class);
307
        $this->assertClassBasics(
308
            $event,
309
            $module,
310
            $stub,
311
            $class,
312
            $namespace,
313
            $path);
314
    }
315
316
    public function testCreateProvider()
317
    {
318
        $module = "User";
319
        $class = "RandomServiceProvider";
320
321
        $this->getModuleGenerator($module)->createServiceProvider($class);
322
323
        $path = Larapi::getModule($module)->getServiceProviders()->getPath() . "/$class.php";
324
        $stub = "provider.stub";
325
        $namespace = "Modules\User\Providers";
326
327
        /* @var ProviderGeneratedEvent $event */
328
        $event = $this->getFirstDispatchedEvent(ProviderGeneratedEvent::class);
329
        $this->assertClassBasics(
330
            $event,
331
            $module,
332
            $stub,
333
            $class,
334
            $namespace,
335
            $path);
336
    }
337
338
    public function testCreateService()
339
    {
340
        $module = "User";
341
        $class = "UserService";
342
343
        $this->getModuleGenerator($module)->createService($class);
344
345
        $path = Larapi::getModule($module)->getServices()->getPath() . "/$class.php";
346
        $stub = "service.stub";
347
        $namespace = "Modules\User\Services";
348
349
        /* @var ServiceGeneratedEvent $event */
350
        $event = $this->getFirstDispatchedEvent(ServiceGeneratedEvent::class);
351
        $this->assertClassBasics(
352
            $event,
353
            $module,
354
            $stub,
355
            $class,
356
            $namespace,
357
            $path);
358
    }
359
360
    public function testCreateNotification()
361
    {
362
        $module = "User";
363
        $class = "RandomNotification";
364
365
        $this->getModuleGenerator($module)->createNotification($class);
366
367
        $path = Larapi::getModule($module)->getNotifications()->getPath() . "/$class.php";
368
        $stub = "notification.stub";
369
        $namespace = "Modules\User\Notifications";
370
371
        /* @var NotificationGeneratedEvent $event */
372
        $event = $this->getFirstDispatchedEvent(NotificationGeneratedEvent::class);
373
        $this->assertClassBasics(
374
            $event,
375
            $module,
376
            $stub,
377
            $class,
378
            $namespace,
379
            $path);
380
    }
381
382
    public function testCreateModel()
383
    {
384
        $module = "User";
385
        $modelName = "Address";
386
        $class = $module . $modelName;
387
        $needsMigration = true;
388
        $isMongoModel = false;
389
390
        $this->getModuleGenerator($module)->createModel($class, $isMongoModel, $needsMigration);
391
392
        $path = Larapi::getModule($module)->getModels()->getPath() . "/$module$modelName.php";
393
        $stub = "model.stub";
394
        $namespace = "Modules\User\Entities";
395
396
        /* @var ModelGeneratedEvent $event */
397
        $event = $this->getFirstDispatchedEvent(ModelGeneratedEvent::class);
398
        $this->assertClassBasics(
399
            $event,
400
            $module,
401
            $stub,
402
            $class,
403
            $namespace,
404
            $path);
405
406
        $stub = "migration.stub";
407
        $table = "user_addresses";
408
        $migrationClass = "CreateUserAddressTable";
409
410
        /* @var MigrationGeneratedEvent $event */
411
        $event = $this->getFirstDispatchedEvent(MigrationGeneratedEvent::class);
412
        $this->assertNotNull($event);
413
        $this->assertEquals($module, $event->getModuleName());
414
        $this->assertEquals($stub, $event->getStub()->getName());
415
        $this->assertEquals($migrationClass, $event->getClassName());
416
        $this->assertEquals($table, $event->getTableName());
417
    }
418
419
    public function testCreatePolicy()
420
    {
421
        $module = "User";
422
        $class = "UserOwnershipPolicy";
423
424
        $this->getModuleGenerator($module)->createPolicy($class);
425
426
        $path = Larapi::getModule($module)->getPolicies()->getPath() . "/$class.php";
427
        $stub = "policy.stub";
428
        $namespace = "Modules\User\Policies";
429
430
        /* @var PolicyGeneratedEvent $event */
431
        $event = $this->getFirstDispatchedEvent(PolicyGeneratedEvent::class);
432
        $this->assertClassBasics(
433
            $event,
434
            $module,
435
            $stub,
436
            $class,
437
            $namespace,
438
            $path);
439
    }
440
441
    public function testCreateTransformer()
442
    {
443
        $module = "User";
444
        $model = "User";
445
        $class = "BlablaTransformer";
446
447
        $this->getModuleGenerator($module)->createTransformer($class, $model);
448
449
        $path = Larapi::getModule($module)->getTransformers()->getPath() . "/$class.php";
450
        $stub = "transformer.stub";
451
        $namespace = "Modules\User\Transformers";
452
        $modelNamespace = "Modules\User\Entities\User";
453
454
        /* @var TransformerGeneratedEvent $event */
455
        $event = $this->getFirstDispatchedEvent(TransformerGeneratedEvent::class);
456
        $this->assertClassBasics(
457
            $event,
458
            $module,
459
            $stub,
460
            $class,
461
            $namespace,
462
            $path);
463
        $this->assertEquals($model, $event->getModel());
464
        $this->assertEquals($modelNamespace, $event->getModelNamespace());
465
    }
466
467
    public function testCreateUnitTest()
468
    {
469
        $module = "User";
470
        $class = "AUserUnitTest";
471
472
        $this->getModuleGenerator($module)->createTest($class, 'unit');
473
474
        $path = Larapi::getModule($module)->getTests()->getPath() . "/$class.php";
475
        $stub = "unit-test.stub";
476
        $namespace = "Modules\User\Tests";
477
        $type = "unit";
478
479
        /* @var TestGeneratedEvent $event */
480
        $event = $this->getFirstDispatchedEvent(TestGeneratedEvent::class);
481
        $this->assertClassBasics(
482
            $event,
483
            $module,
484
            $stub,
485
            $class,
486
            $namespace,
487
            $path);
488
        $this->assertEquals($type, $event->getType());
489
    }
490
491
    public function testCreateRequest()
492
    {
493
        $module = "User";
494
        $class = "ARequest";
495
496
        $this->getModuleGenerator($module)->createRequest($class);
497
498
        $path = Larapi::getModule($module)->getRequests()->getPath() . "/$class.php";
499
        $stub = "request.stub";
500
        $namespace = "Modules\User\Http\Requests";
501
502
        /* @var RequestGeneratedEvent $event */
503
        $event = $this->getFirstDispatchedEvent(RequestGeneratedEvent::class);
504
        $this->assertClassBasics(
505
            $event,
506
            $module,
507
            $stub,
508
            $class,
509
            $namespace,
510
            $path);
511
    }
512
513
    public function testCreateRule()
514
    {
515
        $module = "User";
516
        $fileName = "BlalkaRule";
517
518
        $this->getModuleGenerator($module)->createRule($fileName);
519
520
        $path = Larapi::getModule($module)->getRules()->getPath() . "/$fileName.php";
521
        $stub = "rule.stub";
522
        $class = "BlalkaRule";
523
        $namespace = "Modules\User\Rules";
524
525
        /* @var RuleGeneratedEvent $event */
526
        $event = $this->getFirstDispatchedEvent(RuleGeneratedEvent::class);
527
        $this->assertClassBasics(
528
            $event,
529
            $module,
530
            $stub,
531
            $class,
532
            $namespace,
533
            $path);
534
    }
535
536
    public function testCreateSeeder()
537
    {
538
        $module = "User";
539
        $class = "BlablaSeeder";
540
541
        $this->getModuleGenerator($module)->createSeeder($class);
542
543
        $path = Larapi::getModule($module)->getSeeders()->getPath() . "/$class.php";
544
        $stub = "seeder.stub";
545
        $namespace = "Modules\User\Database\Seeders";
546
547
        /* @var SeederGeneratedEvent $event */
548
        $event = $this->getFirstDispatchedEvent(SeederGeneratedEvent::class);
549
        $this->assertClassBasics(
550
            $event,
551
            $module,
552
            $stub,
553
            $class,
554
            $namespace,
555
            $path);
556
    }
557
558
    public function testCreatePermission()
559
    {
560
        $module = "User";
561
        $class = "UserPermission";
562
563
        $this->getModuleGenerator($module)->createPermission($class);
564
565
        $path = Larapi::getModule($module)->getPermissions()->getPath() . "/$class.php";
566
        $stub = "permission.stub";
567
        $namespace = "Modules\User\Permissions";
568
569
        /* @var PermissionGeneratedEvent $event */
570
        $event = $this->getFirstDispatchedEvent(PermissionGeneratedEvent::class);
571
        $this->assertClassBasics(
572
            $event,
573
            $module,
574
            $stub,
575
            $class,
576
            $namespace,
577
            $path);
578
    }
579
580
    public function testCreateRoute()
581
    {
582
        $moduleName = "Demo";
583
        $routename = strtolower(Str::plural($moduleName)) . '.v1';
584
585
        $this->getModuleGenerator($moduleName)->createRoute();
586
587
        $expectedFileName = Larapi::getModule($moduleName)->getRoutes()->getPath() . "/$routename.php";
588
        $expectedStubName = "route.stub";
589
        $expectedVersion = "v1";
590
591
        /* @var RouteGeneratedEvent $event */
592
        $event = $this->getFirstDispatchedEvent(RouteGeneratedEvent::class);
593
        $this->assertNotNull($event);
594
595
        $this->assertEquals($expectedFileName, $event->getFilePath());
596
        $this->assertEquals($expectedStubName, $event->getStub()->getName());
597
        $this->assertEquals($expectedVersion, $event->getVersion());
598
    }
599
600
    public function testCreateComposer()
601
    {
602
        $moduleName = "Demo";
603
604
        $this->getModuleGenerator($moduleName)->createComposer();
605
606
        $expectedFileName = Larapi::getModule($moduleName)->getPath() . "/composer.json";
607
        $expectedStubName = "composer.stub";
608
        $authorName = 'arthur devious';
609
        $authorMail = '[email protected]';
610
611
        /* @var ComposerGeneratedEvent $event */
612
        $event = $this->getFirstDispatchedEvent(ComposerGeneratedEvent::class);
613
        $this->assertNotNull($event);
614
615
        $this->assertEquals($expectedFileName, $event->getFilePath());
616
        $this->assertEquals($expectedStubName, $event->getStub()->getName());
617
        $this->assertEquals($authorName, $event->getAuthorName());
618
        $this->assertEquals($authorMail, $event->getAuthorMail());
619
    }
620
621
622
    /**
623
     * @param ResourceGenerationContract $event
624
     * @param string $module
625
     * @param $stub
626
     * @param string $class
627
     * @param string $namespace
628
     * @param string $path
629
     */
630
    private function assertClassBasics(?ResourceGenerationContract $event, string $module, $stub, string $class, string $namespace, string $path)
631
    {
632
        $this->assertFileBasics($event, $module, $stub, $path);
633
        $this->assertEquals($namespace, $event->getNamespace());
0 ignored issues
show
Bug introduced by
The method getNamespace() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

633
        $this->assertEquals($namespace, $event->/** @scrutinizer ignore-call */ getNamespace());

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
634
        $this->assertEquals($class, $event->getClassName());
635
        $this->assertEquals($path, $event->getFilePath());
636
    }
637
638
    private function assertFileBasics(?ResourceGenerationContract $event, string $module, $stub, string $path)
639
    {
640
        $this->assertNotNull($event);
641
        $this->assertEquals($module, $event->getModuleName());
642
        $this->assertEquals($stub, $event->getStub()->getName());
643
        $this->assertEquals($path, $event->getFilePath());
644
    }
645
}
646