media_acquiadam-8.x-1.46/tests/src/Unit/AssetFileEntityHelperTest.php

tests/src/Unit/AssetFileEntityHelperTest.php
<?php

namespace Drupal\Tests\media_acquiadam\Unit;

use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\File\FileSystem;
use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Messenger\Messenger;
use Drupal\Core\TypedData\DataDefinitionInterface;
use Drupal\Core\Utility\Token;
use Drupal\file\FileInterface;
use Drupal\media_acquiadam\Acquiadam;
use Drupal\media_acquiadam\Service\AssetFileEntityHelper;
use Drupal\media_acquiadam\Service\AssetMediaFactory;
use Drupal\Tests\media_acquiadam\Traits\AcquiadamAssetDataTrait;
use Drupal\Tests\media_acquiadam\Traits\AcquiadamAssetImageHelperTrait;
use Drupal\Tests\media_acquiadam\Traits\AcquiadamConfigTrait;
use Drupal\Tests\media_acquiadam\Traits\AcquiadamLoggerFactoryTrait;
use Drupal\Tests\media_acquiadam\Traits\AcquiadamMockedMediaEntityTrait;
use Drupal\Tests\UnitTestCase;
use GuzzleHttp\Client;

/**
 * Tests to validate that our file entity helper works as expected.
 *
 * @group media_acquiadam
 */
class AssetFileEntityHelperTest extends UnitTestCase {

  use AcquiadamAssetDataTrait, AcquiadamConfigTrait, AcquiadamAssetImageHelperTrait, AcquiadamMockedMediaEntityTrait, AcquiadamLoggerFactoryTrait;

  /**
   * Container builder helper.
   *
   * @var \Drupal\Core\DependencyInjection\ContainerBuilder
   */
  protected $container;

  /**
   * A mocked AssetFileEntityHelper.
   *
   * @var \Drupal\media_acquiadam\Service\AssetFileEntityHelper|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $assetFileEntityHelper;

  /**
   * A mocked file entity.
   *
   * @var \Drupal\file\FileInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $mockedFileEntity;

  /**
   * Validates that the file destination builds correctly.
   */
  public function testGetDestinationFromEntity() {
    $asset_data = $this->getAssetData();
    $media = $this->getMockedMediaEntity($asset_data->id);

    $this->assertEquals('private://assets/replaced',
      $this->assetFileEntityHelper->getDestinationFromEntity(
        $media,
        'phpunit_file_field',
        $asset_data->file_upload_date
      )
    );

    $this->assertEquals('public://acquiadam_assets/[date:custom:Y]-[date:custom:m]',
      $this->assetFileEntityHelper->getDestinationFromEntity(
        $media,
        'phpunit_test_fail',
        $asset_data->file_upload_date
      )
    );
  }

  /**
   * Validates we can create a new file.
   */
  public function testCreateNewFile() {
    $asset = $this->getAssetData();

    $this->assertInstanceOf(FileInterface::class,
      $this->assetFileEntityHelper->createNewFile($asset,
        'private://assets/replaced'));
    $this->assertFalse($this->assetFileEntityHelper->createNewFile($asset,
      'random://bad/folder'));
  }

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    $this->mockedFileEntity = $this->getMockBuilder(FileInterface::class)
      ->disableOriginalConstructor()
      ->getMockForAbstractClass();
    $this->mockedFileEntity->method('id')->willReturn(333);

    $acquiadam = $this->createMock(Acquiadam::class);

    $asset_media_factory = $this->createMock(AssetMediaFactory::class);
    $asset_media_factory->method('getFileEntity')
      ->willReturn($this->mockedFileEntity->id());

    $this->container = new ContainerBuilder();
    $this->setMockedDrupalServices($this->container);
    $this->container->set('media_acquiadam.asset_image.helper',
      $this->getAssetImageHelperStub());
    $this->container->set('media_acquiadam.acquiadam', $acquiadam);
    $this->container->set('media_acquiadam.asset_media.factory',
      $asset_media_factory);
    $this->container->set('logger.factory', $this->getLoggerFactoryStub());
    $this->container->set('http_client', new Client());
    $messenger = $this->createMock(Messenger::class);
    $this->container->set('messenger', $messenger);
    \Drupal::setContainer($this->container);

    $this->assetFileEntityHelper = $this->getMockedAssetFileEntityHelper();
  }

  /**
   * Sets Drupal mocked services into a container.
   *
   * @param \Drupal\Core\DependencyInjection\ContainerBuilder $container
   *   The container to set mocks into.
   */
  protected function setMockedDrupalServices(ContainerBuilder $container) {
    $file_storage = $this->createMock(EntityStorageInterface::class);
    $file_storage->method('load')
      ->with($this->mockedFileEntity->id())
      ->willReturn($this->mockedFileEntity);

    $file_storage->method('loadByProperties')->willReturnMap([
      [
        ['uri' => 'private://assets/replaced/' . $this->getAssetData()->filename],
        [$this->mockedFileEntity],
      ],
      [
        ['uri' => 'private://assets/replaced/Micro turbine 60.jpg'],
        [$this->mockedFileEntity],
      ],
    ]);

    $entity_type_manager = $this->createMock(EntityTypeManagerInterface::class);
    $entity_type_manager->method('getStorage')->willReturnMap([
      ['file', $file_storage],
    ]);

    $data_definition = $this->createMock(DataDefinitionInterface::class);
    $data_definition->method('getSetting')->willReturnMap([
      ['uri_scheme', 'private'],
      ['file_directory', 'assets/[token]'],
    ]);

    $field_definition = $this->createMock(FieldDefinitionInterface::class);
    $field_definition->method('getItemDefinition')
      ->willReturn($data_definition);

    $entity_field_manager = $this->createMock(EntityFieldManagerInterface::class);
    $entity_field_manager->method('getFieldDefinitions')->willReturnMap([
      ['media', 'media_acquiadam', ['phpunit_file_field' => $field_definition]],
    ]);

    $token = $this->createMock(Token::class);
    $token->method('replace')
      ->willReturnCallback(function ($string, $a, $b, $c) {
        return ('assets/[token]' == $string) ? 'assets/replaced' : $string;
      });

    $file_system = $this->getMockBuilder(FileSystem::class)
      ->disableOriginalConstructor()
      ->onlyMethods(['prepareDirectory'])
      ->getMockForAbstractClass();
    $file_system->method('prepareDirectory')->willReturnMap([
      [
        'private://assets/replaced',
        FileSystemInterface::CREATE_DIRECTORY,
        TRUE,
      ],
    ]);

    $container->set('entity_type.manager', $entity_type_manager);
    $container->set('entity_field.manager', $entity_field_manager);
    $container->set('config.factory', $this->getDefaultConfigFactoryStub());
    $container->set('file_system', $file_system);
    $container->set('token', $token);
  }

  /**
   * Get a mocked AssetFileEntityHelper that stubs file operations.
   *
   * @return \Drupal\media_acquiadam\Service\AssetFileEntityHelper|\PHPUnit\Framework\MockObject\MockObject
   *   The mocked AssetFileEntityHelper class.
   */
  protected function getMockedAssetFileEntityHelper() {
    $helper = $this->getMockBuilder(AssetFileEntityHelper::class)
      ->setConstructorArgs([
        $this->container->get('entity_type.manager'),
        $this->container->get('entity_field.manager'),
        $this->container->get('config.factory'),
        $this->container->get('file_system'),
        $this->container->get('token'),
        $this->container->get('media_acquiadam.asset_image.helper'),
        $this->container->get('media_acquiadam.acquiadam'),
        $this->container->get('media_acquiadam.asset_media.factory'),
        $this->container->get('logger.factory'),
        $this->container->get('http_client'),
        $this->container->get('messenger')
      ])
      ->onlyMethods([
        'drupalFileSaveData',
        'fetchRemoteAssetData',
      ])
      ->getMock();

    $helper->method('fetchRemoteAssetData')->willReturn('File contents');
    $helper->method('drupalFileSaveData')->willReturn($this->mockedFileEntity);

    return $helper;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc