'Rex', 'type' => PetTypeEnum::Dog->value, 'gender' => PetGenderEnum::Male->value, 'breed' => 'ژرمن', 'weight' => '20', 'sterilized' => true, 'birthday' => '2020-01-01', ], $overrides); } public function test_guest_is_redirected(): void { $this->get(route('admin.pets.index'))->assertRedirect(route('login')); } public function test_admin_without_permission_is_forbidden(): void { $admin = $this->adminWithoutPermissions(); $pet = Pet::factory()->create(); $this->actingAs($admin)->get(route('admin.pets.index'))->assertForbidden(); $this->actingAs($admin)->post(route('admin.pets.store'), $this->payload())->assertForbidden(); $this->actingAs($admin)->put(route('admin.pets.update', $pet), $this->payload())->assertForbidden(); $this->actingAs($admin)->delete(route('admin.pets.destroy', $pet))->assertForbidden(); $this->actingAs($admin)->get('/admin/pets-options')->assertForbidden(); } public function test_index_renders_with_filters(): void { $admin = $this->adminWithAllPermissions(); Pet::factory()->dog()->male()->create(['name' => 'Rex']); Pet::factory()->cat()->female()->create(['name' => 'Kitty']); $this->actingAs($admin)->get(route('admin.pets.index'))->assertOk()->assertInertia(fn (Assert $page) => $page->component('Pets/index')->has('pets.data', 2)); $this->actingAs($admin)->get(route('admin.pets.index', ['type' => [PetTypeEnum::Cat->value]]))->assertInertia(fn (Assert $page) => $page->has('pets.data', 1)); $this->actingAs($admin)->get(route('admin.pets.index', ['gender' => PetGenderEnum::Male->value]))->assertInertia(fn (Assert $page) => $page->has('pets.data', 1)); $this->actingAs($admin)->get(route('admin.pets.index', ['search' => 'Kit']))->assertInertia(fn (Assert $page) => $page->has('pets.data', 1)); } public function test_create_and_edit_pages_render(): void { $admin = $this->adminWithAllPermissions(); $pet = Pet::factory()->create(); $this->actingAs($admin)->get(route('admin.pets.create'))->assertInertia(fn (Assert $page) => $page->component('Pets/create_and_edit')); $this->actingAs($admin)->get(route('admin.pets.edit', $pet))->assertInertia(fn (Assert $page) => $page->component('Pets/create_and_edit')->where('is_edit', true)->where('pet.id', $pet->id)); } public function test_store_creates_pet_owned_by_admin(): void { $admin = $this->adminWithAllPermissions(); $this->actingAs($admin)->post(route('admin.pets.store'), $this->payload(['weight' => '۲۰']))->assertOk()->assertSessionHas('success'); $this->assertDatabaseHas('pets', ['name' => 'Rex', 'type' => PetTypeEnum::Dog->value, 'weight' => 20, 'owner_id' => $admin->id]); } public function test_store_validates_input(): void { $this->actingAs($this->adminWithAllPermissions())->postJson(route('admin.pets.store'), [])->assertUnprocessable()->assertJsonValidationErrors(['name', 'type', 'weight']); } public function test_update_changes_pet(): void { $admin = $this->adminWithAllPermissions(); $pet = Pet::factory()->create(); $this->actingAs($admin)->put(route('admin.pets.update', $pet), $this->payload(['name' => 'Max']))->assertOk(); $this->assertDatabaseHas('pets', ['id' => $pet->id, 'name' => 'Max']); } public function test_destroy_and_bulk_delete_soft_delete_pets(): void { $admin = $this->adminWithAllPermissions(); $pets = Pet::factory()->count(3)->create(); $this->actingAs($admin)->delete(route('admin.pets.destroy', $pets[0]))->assertOk(); $this->actingAs($admin)->post('/admin/pets-bulk-delete', ['ids' => [$pets[1]->id, $pets[2]->id]])->assertOk(); $this->assertSame(0, Pet::count()); $this->assertSame(3, Pet::withTrashed()->count()); } public function test_get_options_returns_label_value_pairs(): void { $pet = Pet::factory()->create(['name' => 'Rex']); Pet::factory()->create(['name' => 'Kitty']); $this->actingAs($this->adminWithAllPermissions())->getJson('/admin/pets-options?search=Rex') ->assertOk() ->assertJsonCount(1, 'data') ->assertJsonPath('data.0', ['label' => 'Rex', 'value' => $pet->id]); } public function test_export_data_downloads_excel(): void { Excel::fake(); $this->actingAs($this->adminWithAllPermissions())->get('/admin/pets-export-data')->assertOk(); Excel::assertDownloaded('pets.xlsx'); } }