From f6153ae803ebb6da7c3de4cc69fe343c07198ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=2E=20Nagy=20Gerg=C5=91?= Date: Fri, 28 Jun 2024 13:35:03 +0200 Subject: [PATCH] fixes, more tests --- src/Fields/MorphTo.php | 12 +++--- src/Http/Controllers/MorphToController.php | 4 +- tests/Http/MorphToControllerTest.php | 39 +++++++++++++++++++ tests/Http/ResourceControllerTest.php | 6 +++ tests/Resources/ResourceTest.php | 4 +- tests/Resources/UserResource.php | 10 +++++ tests/User.php | 17 +++++++- .../2024_06_14_213755_alter_users_table.php | 34 ++++++++++++++++ ...14_213755_create_team_user_table copy.php} | 0 9 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 tests/Http/MorphToControllerTest.php create mode 100644 tests/migrations/2024_06_14_213755_alter_users_table.php rename tests/migrations/{2024_06_14_213755_create_team_user_table.php => 2024_06_14_213755_create_team_user_table copy.php} (100%) diff --git a/src/Fields/MorphTo.php b/src/Fields/MorphTo.php index c09db227..6f27919e 100644 --- a/src/Fields/MorphTo.php +++ b/src/Fields/MorphTo.php @@ -55,13 +55,13 @@ public function resolveRelatableQuery(Request $request, Model $model): Builder */ public function resolveHydrate(Request $request, Model $model, mixed $value): void { - $value = explode(':', $value); + $value = is_null($value) ? $value : explode(':', $value); - $model->setAttribute($this->getRelation($model)->getMorphType(), $value[0]); - - $related = tap(new $value[0], static function (Model $related) use ($value): void { - $related->forceFill([$related->getKeyName() => $value[1]]); - }); + $related = is_null($value) + ? $value + : tap(new $value[0], static function (Model $related) use ($value): void { + $related->forceFill([$related->getKeyName() => $value[1]]); + }); parent::resolveHydrate($request, $model, $related); } diff --git a/src/Http/Controllers/MorphToController.php b/src/Http/Controllers/MorphToController.php index e4cfb2ba..977ac594 100644 --- a/src/Http/Controllers/MorphToController.php +++ b/src/Http/Controllers/MorphToController.php @@ -12,11 +12,11 @@ class MorphToController extends Controller /** * Handle the incoming request. */ - public function __invoke(Request $request, Model $model, ?Model $related = null): Response + public function __invoke(Request $request, Model $model): Response { $field = $request->route('field'); - $data = $field->toInput($request, $related ?: $model); + $data = $field->toInput($request, $model); return ResponseFactory::view($data['template'], $data); } diff --git a/tests/Http/MorphToControllerTest.php b/tests/Http/MorphToControllerTest.php new file mode 100644 index 00000000..48f1f3bd --- /dev/null +++ b/tests/Http/MorphToControllerTest.php @@ -0,0 +1,39 @@ +field = Root::instance() + ->resources + ->resolve('users') + ->resolveFields($this->app['request']) + ->first(function ($field) { + return $field->getModelAttribute() === 'employer'; + }); + + $this->admin = User::factory()->create(); + } + + public function test_a_relation_controller_handles_request(): void + { + $this->actingAs($this->admin) + ->get('/root/users/'.$this->admin->getKey().'/fields/employer') + ->assertOk() + ->assertViewIs('root::fields.morph-to') + ->assertViewHas($this->field->toInput($this->app['request'], $this->admin)); + } +} diff --git a/tests/Http/ResourceControllerTest.php b/tests/Http/ResourceControllerTest.php index 8ccffc2c..40fd52a8 100644 --- a/tests/Http/ResourceControllerTest.php +++ b/tests/Http/ResourceControllerTest.php @@ -84,6 +84,12 @@ public function test_a_resource_controller_handles_destroy(): void { $user = User::factory()->create(); + $this->actingAs($this->admin) + ->delete($this->resource->getUri().'/'.$user->getKey()) + ->assertRedirect(); + + $this->assertTrue($user->refresh()->trashed()); + $this->actingAs($this->admin) ->delete($this->resource->getUri().'/'.$user->getKey()) ->assertRedirect(); diff --git a/tests/Resources/ResourceTest.php b/tests/Resources/ResourceTest.php index 8db26d3e..e60ab921 100644 --- a/tests/Resources/ResourceTest.php +++ b/tests/Resources/ResourceTest.php @@ -53,7 +53,7 @@ public function test_a_resource_resolves_query(): void $this->assertSame(['documents'], array_keys($query->getEagerLoads())); $this->assertSame( - 'select * from "users"', + 'select * from "users" where "users"."deleted_at" is null', $query->toRawSql() ); } @@ -68,7 +68,7 @@ public function test_a_resource_resolves_filtered_query(): void $query = $this->resource->resolveFilteredQuery($this->app['request']); $this->assertSame( - 'select * from "users" where ("users"."name" like \'%test%\' or "users"."email" like \'%test%\') order by "users"."id" asc', + 'select * from "users" where ("users"."name" like \'%test%\' or "users"."email" like \'%test%\') and "users"."deleted_at" is null order by "users"."id" asc', $query->toRawSql() ); } diff --git a/tests/Resources/UserResource.php b/tests/Resources/UserResource.php index 9b8f803d..93d1f408 100644 --- a/tests/Resources/UserResource.php +++ b/tests/Resources/UserResource.php @@ -7,10 +7,12 @@ use Cone\Root\Fields\HasMany; use Cone\Root\Fields\ID; use Cone\Root\Fields\Media; +use Cone\Root\Fields\MorphTo; use Cone\Root\Fields\Select; use Cone\Root\Fields\Text; use Cone\Root\Resources\Resource; use Cone\Root\Tests\Actions\SendPasswordResetNotification; +use Cone\Root\Tests\Team; use Cone\Root\Tests\User; use Cone\Root\Tests\Widgets\UsersCount; use Cone\Root\Tests\Widgets\UsersTrend; @@ -59,6 +61,14 @@ public function fields(Request $request): array ]), ]; }), + + MorphTo::make('Employer') + ->display('name') + ->nullable() + ->types([ + User::class, + Team::class, + ]), ]; } diff --git a/tests/User.php b/tests/User.php index 5dbe3753..a10c287f 100644 --- a/tests/User.php +++ b/tests/User.php @@ -8,13 +8,14 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Eloquent\SoftDeletes; class User extends Model implements MustVerifyEmail { use HasFactory; - // use SoftDeletes; + use SoftDeletes; protected $guarded = []; @@ -25,6 +26,15 @@ protected static function newFactory(): UserFactory return new class() extends UserFactory { protected $model = User::class; + + public function definition(): array + { + return array_merge(parent::definition(), [ + 'employer_id' => null, + 'employer_type' => null, + 'deleted_at' => null, + ]); + } }; } @@ -53,4 +63,9 @@ public function teams(): BelongsToMany return $this->belongsToMany(Team::class) ->withPivot(['id', 'role']); } + + public function employer(): MorphTo + { + return $this->morphTo(); + } } diff --git a/tests/migrations/2024_06_14_213755_alter_users_table.php b/tests/migrations/2024_06_14_213755_alter_users_table.php new file mode 100644 index 00000000..b92f5965 --- /dev/null +++ b/tests/migrations/2024_06_14_213755_alter_users_table.php @@ -0,0 +1,34 @@ +after('id', function (Blueprint $table) { + $table->nullableMorphs('employer'); + }); + $table->after('updated_at', function (Blueprint $table) { + $table->softDeletes(); + }); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropMorphs('employer'); + $table->dropSoftDeletes(); + }); + } +}; diff --git a/tests/migrations/2024_06_14_213755_create_team_user_table.php b/tests/migrations/2024_06_14_213755_create_team_user_table copy.php similarity index 100% rename from tests/migrations/2024_06_14_213755_create_team_user_table.php rename to tests/migrations/2024_06_14_213755_create_team_user_table copy.php