repository = Mockery::mock(ImageUploadRepositoryInterface::class); $this->storage = Mockery::mock(StorageInterface::class); $this->service = new ImageUploadService($this->repository, $this->storage); } protected function tearDown(): void { Mockery::close(); parent::tearDown(); } #[Test] public function test_upload_fires_hooks(): void { // Arrange $beforeUploadFired = false; $afterUploadFired = false; $filterApplied = false; HookManager::addAction('sirsoft-ckeditor5.image.before_upload', function () use (&$beforeUploadFired) { $beforeUploadFired = true; }); HookManager::addFilter('sirsoft-ckeditor5.image.filter_upload_file', function ($file) use (&$filterApplied) { $filterApplied = true; return $file; }); HookManager::addAction('sirsoft-ckeditor5.image.after_upload', function () use (&$afterUploadFired) { $afterUploadFired = true; }); $file = UploadedFile::fake()->image('test.jpg'); $this->storage->shouldReceive('put')->andReturn(true); $this->storage->shouldReceive('getDisk')->andReturn('local'); $record = new Ckeditor5ImageUpload; $this->repository->shouldReceive('create')->andReturn($record); // Act $this->service->upload($file, null); // Assert $this->assertTrue($beforeUploadFired, 'before_upload hook should be fired'); $this->assertTrue($filterApplied, 'filter_upload_file hook should be applied'); $this->assertTrue($afterUploadFired, 'after_upload hook should be fired'); // Cleanup hooks HookManager::clearAction('sirsoft-ckeditor5.image.before_upload'); HookManager::clearFilter('sirsoft-ckeditor5.image.filter_upload_file'); HookManager::clearAction('sirsoft-ckeditor5.image.after_upload'); } }