diff --git a/app/Http/Controllers/Components/ComponentsController.php b/app/Http/Controllers/Components/ComponentsController.php index c4d9bcec36..62dc25cf1d 100644 --- a/app/Http/Controllers/Components/ComponentsController.php +++ b/app/Http/Controllers/Components/ComponentsController.php @@ -193,7 +193,7 @@ class ComponentsController extends Controller $this->authorize('delete', $component); // Remove the image if one exists - if (Storage::disk('public')->exists('components/'.$component->image)) { + if ($component->image && Storage::disk('public')->exists('components/' . $component->image)) { try { Storage::disk('public')->delete('components/'.$component->image); } catch (\Exception $e) { diff --git a/tests/Feature/Components/Ui/DeleteComponentTest.php b/tests/Feature/Components/Ui/DeleteComponentTest.php new file mode 100644 index 0000000000..a0b8131532 --- /dev/null +++ b/tests/Feature/Components/Ui/DeleteComponentTest.php @@ -0,0 +1,88 @@ +create(); + + $this->actingAs(User::factory()->create()) + ->delete(route('components.destroy', $component->id)) + ->assertForbidden(); + } + + public function testHandlesNonExistentComponent() + { + $this->actingAs(User::factory()->deleteComponents()->create()) + ->delete(route('components.destroy', 10000)) + ->assertSessionHas('error'); + } + + public function testCanDeleteComponent() + { + $component = Component::factory()->create(); + + $this->actingAs(User::factory()->deleteComponents()->create()) + ->delete(route('components.destroy', $component->id)) + ->assertSessionHas('success') + ->assertRedirect(route('components.index')); + + $this->assertSoftDeleted($component); + } + + public function testDeletingComponentRemovesComponentImage() + { + Storage::fake('public'); + + $component = Component::factory()->create(['image' => 'component-image.jpg']); + + Storage::disk('public')->put('components/component-image.jpg', 'content'); + + Storage::disk('public')->assertExists('components/component-image.jpg'); + + $this->actingAs(User::factory()->deleteComponents()->create())->delete(route('components.destroy', $component->id)); + + Storage::disk('public')->assertMissing('components/component-image.jpg'); + } + + public function testDeletingComponentIsLogged() + { + $user = User::factory()->deleteComponents()->create(); + $component = Component::factory()->create(); + + $this->actingAs($user)->delete(route('components.destroy', $component->id)); + + $this->assertDatabaseHas('action_logs', [ + 'created_by' => $user->id, + 'action_type' => 'delete', + 'item_type' => Component::class, + 'item_id' => $component->id, + ]); + } + + public function testAdheresToFullMultipleCompaniesSupportScoping() + { + $this->settings->enableMultipleFullCompanySupport(); + + [$companyA, $companyB] = Company::factory()->count(2)->create(); + + $userInCompanyA = User::factory()->for($companyA)->create(); + $componentForCompanyB = Component::factory()->for($companyB)->create(); + + $this->actingAs($userInCompanyA) + ->delete(route('components.destroy', $componentForCompanyB->id)) + ->assertSessionHas('error'); + + $this->assertNotSoftDeleted($componentForCompanyB); + } +}