entity_to_text-1.0.x-dev/modules/entity_to_text_tika/tests/src/Unit/FileToTextTest.php
modules/entity_to_text_tika/tests/src/Unit/FileToTextTest.php
<?php namespace Drupal\Tests\entity_to_text_tika\Unit; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\Logger\LoggerChannelFactoryInterface; use Drupal\Core\Site\Settings; use Drupal\entity_to_text_tika\Event\EntityToTextTikaEvents; use Drupal\entity_to_text_tika\Event\PreProcessFileEvent; use Drupal\entity_to_text_tika\Extractor\FileToText; use Drupal\file\Entity\File; use Drupal\Tests\UnitTestCase; use Prophecy\Prophet; use Psr\Log\LoggerInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Vaites\ApacheTika\Clients\WebClient; /** * Tests the Tika File Extractor. * * @coversDefaultClass \Drupal\entity_to_text_tika\Extractor\FileToText * * @group entity_to_text * @group entity_to_text_tika * * @internal */ final class FileToTextTest extends UnitTestCase { /** * A mocked instance of a Tika client. * * @var \Prophecy\Prophecy\ObjectProphecy|\Vaites\ApacheTika\Clients\WebClient */ protected $client; /** * A mocked instance of a filesystem. * * @var \Prophecy\Prophecy\ObjectProphecy|\Drupal\Core\File\FileSystemInterface */ protected $fileSystem; /** * A mocked instance of a logger channel factory. * * @var \Prophecy\Prophecy\ObjectProphecy|\Drupal\Core\Logger\LoggerChannelFactoryInterface */ protected $loggerFactory; /** * A mocked instance of a logger. * * @var \Prophecy\Prophecy\ObjectProphecy|\Psr\Log\LoggerInterface */ protected $logger; /** * The prophecy object. * * @var \Prophecy\Prophet */ private $prophet; /** * The File To Text extractor. * * @var \Drupal\entity_to_text_tika\Extractor\FileToText */ private FileToText $fileToText; /** * The event dispatcher. * * @var \Prophecy\Prophecy\ObjectProphecy|\Symfony\Component\EventDispatcher\EventDispatcherInterface */ private $eventDispatcher; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); $this->prophet = new Prophet(); $settings['entity_to_text_tika.connection']['host'] = 'tika'; $settings['entity_to_text_tika.connection']['port'] = '9998'; $settings = new Settings($settings); $this->client = $this->prophet->prophesize(WebClient::class); $this->fileSystem = $this->prophet->prophesize(FileSystemInterface::class); $this->loggerFactory = $this->prophet->prophesize(LoggerChannelFactoryInterface::class); $this->logger = $this->prophet->prophesize(LoggerInterface::class); $this->eventDispatcher = $this->prophet->prophesize(EventDispatcherInterface::class); $this->loggerFactory->get('entity_to_text') ->willReturn($this->logger->reveal()); $this->fileToText = new FileToText($settings, $this->fileSystem->reveal(), $this->loggerFactory->reveal(), $this->eventDispatcher->reveal()); $this->fileToText->setClient($this->client->reveal()); } /** * {@inheritdoc} */ protected function tearDown(): void { parent::tearDown(); $this->prophet->checkPredictions(); } /** * @covers ::fromFileToText */ public function testFromFileToTextEmptySettings(): void { $settings['entity_to_text_tika.connection']['host'] = NULL; $settings['entity_to_text_tika.connection']['port'] = NULL; $settings = new Settings($settings); $fileToText = new FileToText($settings, $this->fileSystem->reveal(), $this->loggerFactory->reveal(), $this->eventDispatcher->reveal()); // Create a test file object. $file = $this->prophet->prophesize(File::class); self::assertEmpty($fileToText->fromFileToText($file->reveal())); } /** * @covers ::fromFileToText */ public function testFromFileToText(): void { // Create a test file object. $file = $this->prophet->prophesize(File::class); $file->getFileUri() ->willReturn('public://file/test.txt') ->shouldBeCalled(); $this->client->setOCRLanguage('eng')->shouldBeCalled(); $this->fileSystem->realpath('public://file/test.txt') ->willReturn('/var/www/web/sites/default/files/file/test.txt') ->shouldBeCalled(); $this->client->getText('/var/www/web/sites/default/files/file/test.txt') ->willReturn('Commodo duis lorem vestibulum imperdiet vel hac') ->shouldBeCalled(); $preprocessFileEvent = new PreProcessFileEvent($this->client->reveal(), $file->reveal()); $this->eventDispatcher->dispatch($preprocessFileEvent, EntityToTextTikaEvents::PRE_PROCESS_FILE) ->shouldBeCalled() ->willReturn($preprocessFileEvent); self::assertEquals('Commodo duis lorem vestibulum imperdiet vel hac', $this->fileToText->fromFileToText($file->reveal())); } /** * @covers ::fromFileToText */ public function testFromFileToTextException(): void { // Create a test file object. $file = $this->prophet->prophesize(File::class); $file->getFileUri() ->willReturn('public://file/test.txt') ->shouldBeCalled(); $file->id() ->willReturn(123) ->shouldBeCalled(); $this->client->setOCRLanguage('fra')->shouldBeCalled(); $this->fileSystem->realpath('public://file/test.txt') ->willReturn('/var/www/web/sites/default/files/file/test.txt') ->shouldBeCalled(); $this->client->getText('/var/www/web/sites/default/files/file/test.txt') ->willThrow(new \Exception('foo bar')) ->shouldBeCalled(); $preprocessFileEvent = new PreProcessFileEvent($this->client->reveal(), $file->reveal()); $this->eventDispatcher->dispatch($preprocessFileEvent, EntityToTextTikaEvents::PRE_PROCESS_FILE) ->shouldBeCalled() ->willReturn($preprocessFileEvent); $this->logger->notice("Document '@fid' on '@path' can't be processed by Tika. Got: @message.", [ '@fid' => 123, '@path' => '/var/www/web/sites/default/files/file/test.txt', '@message' => 'foo bar', ])->shouldBeCalled(); self::assertEquals('', $result = $this->fileToText->fromFileToText($file->reveal(), 'fra')); } }