artisan('make:crud', ['name' => $this->model_name, '--uuid' => true, '--no-interaction' => true]); $migrationFilePath = database_path('migrations/'.date('Y_m_d_His').'_create_'.$this->table_name.'_table.php'); $this->assertFileExists($migrationFilePath); $modelClassContent = "plural_model_name}Table extends Migration { public function up() { Schema::create('{$this->table_name}', function (Blueprint \$table) { \$table->uuid('id')->primary(); \$table->string('title', 60); \$table->string('description')->nullable(); \$table->foreignId('creator_id')->constrained('users')->onDelete('restrict'); \$table->timestamps(); }); } public function down() { Schema::dropIfExists('{$this->table_name}'); } } "; $this->assertEquals($modelClassContent, file_get_contents($migrationFilePath)); } /** @test */ public function it_creates_correct_model_factory_content_for_uuid_primary_key() { $this->artisan('make:crud', ['name' => $this->model_name, '--uuid' => true, '--no-interaction' => true]); $modelFactoryPath = database_path('factories/'.$this->model_name.'Factory.php'); $this->assertFileExists($modelFactoryPath); $modelFactoryContent = "full_model_name}; use Illuminate\Database\Eloquent\Factories\Factory; class {$this->model_name}Factory extends Factory { protected \$model = {$this->model_name}::class; public function definition() { return [ 'id' => \$this->faker->uuid, 'title' => \$this->faker->word, 'description' => \$this->faker->sentence, 'creator_id' => function () { return User::factory()->create()->id; }, ]; } } "; $this->assertEquals($modelFactoryContent, file_get_contents($modelFactoryPath)); } /** @test */ public function it_creates_correct_model_class_content_for_uuid_primary_key() { config(['auth.providers.users.model' => 'App\Models\User']); $this->artisan('make:crud', ['name' => $this->model_name, '--uuid' => true, '--no-interaction' => true]); $modelPath = app_path('Models/'.$this->model_name.'.php'); $this->assertFileExists($modelPath); $modelClassContent = "model_name} extends Model { use HasFactory; public \$incrementing = false; protected \$keyType = 'string'; protected \$fillable = ['id', 'title', 'description', 'creator_id']; public function getTitleLinkAttribute() { \$title = __('app.show_detail_title', [ 'title' => \$this->title, 'type' => __('{$this->lang_name}.{$this->lang_name}'), ]); \$link = 'table_name}.show', \$this).'\"'; \$link .= ' title=\"'.\$title.'\">'; \$link .= \$this->title; \$link .= ''; return \$link; } public function creator() { return \$this->belongsTo(User::class); } } "; $this->assertEquals($modelClassContent, file_get_contents($modelPath)); } /** @test */ public function it_creates_correct_controller_class_content_for_uuid_primary_key() { $this->artisan('make:crud-simple', ['name' => $this->model_name, '--uuid' => true, '--no-interaction' => true]); $this->assertFileExists(app_path("Http/Controllers/{$this->model_name}Controller.php")); $ctrlClassContent = "full_model_name}; use Illuminate\Http\Request; use Ramsey\Uuid\Uuid; class {$this->model_name}Controller extends Controller { public function index(Request \$request) { \$editable{$this->model_name} = null; \${$this->single_model_var_name}Query = {$this->model_name}::query(); \${$this->single_model_var_name}Query->where('title', 'like', '%'.\$request->get('q').'%'); \${$this->single_model_var_name}Query->orderBy('title'); \${$this->collection_model_var_name} = \${$this->single_model_var_name}Query->paginate(25); if (in_array(request('action'), ['edit', 'delete']) && request('id') != null) { \$editable{$this->model_name} = {$this->model_name}::find(request('id')); } return view('{$this->table_name}.index', compact('{$this->collection_model_var_name}', 'editable{$this->model_name}')); } public function store(Request \$request) { \$this->authorize('create', new {$this->model_name}); \$new{$this->model_name} = \$request->validate([ 'title' => 'required|max:60', 'description' => 'nullable|max:255', ]); \$new{$this->model_name}['id'] = Uuid::uuid4()->toString(); \$new{$this->model_name}['creator_id'] = auth()->id(); {$this->model_name}::create(\$new{$this->model_name}); return redirect()->route('{$this->table_name}.index'); } public function update(Request \$request, {$this->model_name} \${$this->single_model_var_name}) { \$this->authorize('update', \${$this->single_model_var_name}); \${$this->single_model_var_name}Data = \$request->validate([ 'title' => 'required|max:60', 'description' => 'nullable|max:255', ]); \${$this->single_model_var_name}->update(\${$this->single_model_var_name}Data); \$routeParam = request()->only('page', 'q'); return redirect()->route('{$this->table_name}.index', \$routeParam); } public function destroy(Request \$request, {$this->model_name} \${$this->single_model_var_name}) { \$this->authorize('delete', \${$this->single_model_var_name}); \$request->validate(['{$this->lang_name}_id' => 'required']); if (\$request->get('{$this->lang_name}_id') == \${$this->single_model_var_name}->id && \${$this->single_model_var_name}->delete()) { \$routeParam = request()->only('page', 'q'); return redirect()->route('{$this->table_name}.index', \$routeParam); } return back(); } } "; $this->assertEquals($ctrlClassContent, file_get_contents(app_path("Http/Controllers/{$this->model_name}Controller.php"))); } /** @test */ public function it_creates_correct_full_controller_class_content_for_uuid_primary_key() { $this->artisan('make:crud', ['name' => $this->model_name, '--uuid' => true, '--no-interaction' => true]); $this->assertFileExists(app_path("Http/Controllers/{$this->model_name}Controller.php")); $ctrlClassContent = "full_model_name}; use Illuminate\Http\Request; use Ramsey\Uuid\Uuid; class {$this->model_name}Controller extends Controller { public function index(Request \$request) { \${$this->single_model_var_name}Query = {$this->model_name}::query(); \${$this->single_model_var_name}Query->where('title', 'like', '%'.\$request->get('q').'%'); \${$this->single_model_var_name}Query->orderBy('title'); \${$this->collection_model_var_name} = \${$this->single_model_var_name}Query->paginate(25); return view('{$this->table_name}.index', compact('{$this->collection_model_var_name}')); } public function create() { \$this->authorize('create', new {$this->model_name}); return view('{$this->table_name}.create'); } public function store(Request \$request) { \$this->authorize('create', new {$this->model_name}); \$new{$this->model_name} = \$request->validate([ 'title' => 'required|max:60', 'description' => 'nullable|max:255', ]); \$new{$this->model_name}['id'] = Uuid::uuid4()->toString(); \$new{$this->model_name}['creator_id'] = auth()->id(); \${$this->single_model_var_name} = {$this->model_name}::create(\$new{$this->model_name}); return redirect()->route('{$this->table_name}.show', \${$this->single_model_var_name}); } public function show({$this->model_name} \${$this->single_model_var_name}) { return view('{$this->table_name}.show', compact('{$this->single_model_var_name}')); } public function edit({$this->model_name} \${$this->single_model_var_name}) { \$this->authorize('update', \${$this->single_model_var_name}); return view('{$this->table_name}.edit', compact('{$this->single_model_var_name}')); } public function update(Request \$request, {$this->model_name} \${$this->single_model_var_name}) { \$this->authorize('update', \${$this->single_model_var_name}); \${$this->single_model_var_name}Data = \$request->validate([ 'title' => 'required|max:60', 'description' => 'nullable|max:255', ]); \${$this->single_model_var_name}->update(\${$this->single_model_var_name}Data); return redirect()->route('{$this->table_name}.show', \${$this->single_model_var_name}); } public function destroy(Request \$request, {$this->model_name} \${$this->single_model_var_name}) { \$this->authorize('delete', \${$this->single_model_var_name}); \$request->validate(['{$this->lang_name}_id' => 'required']); if (\$request->get('{$this->lang_name}_id') == \${$this->single_model_var_name}->id && \${$this->single_model_var_name}->delete()) { return redirect()->route('{$this->table_name}.index'); } return back(); } } "; $this->assertEquals($ctrlClassContent, file_get_contents(app_path("Http/Controllers/{$this->model_name}Controller.php"))); } }