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

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

namespace Drupal\Tests\media_acquiadam\Unit;

use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\file\FileInterface;
use Drupal\media\MediaInterface;
use Drupal\media\MediaTypeInterface;
use Drupal\media_acquiadam\Acquiadam;
use Drupal\media_acquiadam\AssetData;
use Drupal\media_acquiadam\Entity\Asset;
use Drupal\media_acquiadam\MediaEntityHelper;
use Drupal\media_acquiadam\Service\AssetFileEntityHelper;
use Drupal\Tests\media_acquiadam\Traits\AcquiadamAssetDataTrait;
use Drupal\Tests\media_acquiadam\Traits\AcquiadamMockedMediaEntityTrait;
use Drupal\Tests\UnitTestCase;

/**
 * Testing of the Media Entity helper class.
 *
 * @group media_acquiadam
 */
class MediaEntityHelperTest extends UnitTestCase {

  use AcquiadamAssetDataTrait, AcquiadamMockedMediaEntityTrait;

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

  /**
   * The test client.
   *
   * @var \Drupal\media_acquiadam\Acquiadam|\PHPUnit\Framework\MockObject\MockObject
   */
  private $acquiadamClient;

  /**
   * Validate we can get file from a media entity.
   */
  public function testGetFile() {
    $this->setupApiResponseStub($this->getAssetData()->id, $this->getAssetData());

    $this->assertInstanceOf(FileInterface::class, $this->getNewMediaEntityHelper()->getFile());
  }

  /**
   * Validate we can properly load an existing file.
   */
  public function testGetExistingFile() {
    $this->assertInstanceOf(FileInterface::class,
      $this->getNewMediaEntityHelper()->getExistingFile());

    $media = $this->createMock(MediaInterface::class);

    /** @var \Drupal\media\MediaInterface|\PHPUnit\Framework\MockObject\MockObject $media */
    $this->assertFalse($this->getNewMediaEntityHelper($media)
      ->getExistingFile());
  }

  /**
   * Validate we can get an existing fild ID if one is present.
   */
  public function testGetExistingFileId() {
    $this->assertEquals($this->getMockedFileEntity()->id(),
      $this->getNewMediaEntityHelper()->getExistingFileId());

    /** @var \Drupal\media\MediaInterface|\PHPUnit\Framework\MockObject\MockObject $media */
    $media = $this->createMock(MediaInterface::class);

    $this->assertFalse($this->getNewMediaEntityHelper($media)
      ->getExistingFileId());
  }

  /**
   * Validates we can get the file field assets data is stored in.
   */
  public function testGetAssetFileField() {
    $this->assertEquals('phpunit_file_field',
      $this->getNewMediaEntityHelper()->getAssetFileField());

    /** @var \Drupal\media\MediaInterface|\PHPUnit\Framework\MockObject\MockObject $media */
    $media = $this->createMock(MediaInterface::class);

    $this->assertFalse($this->getNewMediaEntityHelper($media)
      ->getAssetFileField());
  }

  /**
   * Validates that we can get the asset.
   */
  public function testGetAsset() {
    $this->setupApiResponseStub($this->getAssetData()->id, $this->getAssetData());
    $this->assertInstanceOf(Asset::class,
      $this->getNewMediaEntityHelper()->getAsset());

    // Change our source field to simulate a missing asset.
    $media = $this->getMockedMediaEntity($this->getAssetData()->id,
      'phpunit_test_fail');
    $this->assertNull($this->getNewMediaEntityHelper($media)->getAsset());
  }

  /**
   * Validates that we can get the asset ID.
   */
  public function testGetAssetId() {
    $this->assertEquals($this->getAssetData()->id,
      $this->getNewMediaEntityHelper()->getAssetId());

    // Change our source field to simulate a missing asset.
    $media = $this->getMockedMediaEntity($this->getAssetData()->id,
      'phpunit_test_fail');
    $this->assertFalse($this->getNewMediaEntityHelper($media)->getAssetId());
  }

  /**
   * Setups the API response stub.
   *
   * @param string $request_query
   *   The query for the Get Asset Api request.
   * @param mixed $response
   *   The stub of Get Asset API response.
   */
  protected function setupApiResponseStub(string $request_query, $response) {
    $this->acquiadamClient
      ->expects($this->any())
      ->method('getAsset')
      ->with($request_query)
      ->willReturn($response);
  }

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

    $this->acquiadamClient = $this->getMockBuilder(Acquiadam::class)
      ->onlyMethods(['getAsset'])
      ->disableOriginalConstructor()
      ->getMock();

    $this->container = new ContainerBuilder();
    $this->setMockedDrupalServices($this->container);
    $this->setMockedAcquiaDamServices($this->container);
    // Mock the logger.factory service.
    $loggerFactory = $this->createMock(LoggerChannelFactoryInterface::class);
    $this->container->set('logger.factory', $loggerFactory);
    $this->container->set('media_acquiadam.acquiadam', $this->acquiadamClient);
    \Drupal::setContainer($this->container);
  }

  /**
   * Gets an instance of the MediaEntityHelper class.
   *
   * @param \Drupal\media\MediaInterface|null $media
   *   The media entity to wrap.
   *
   * @return \Drupal\media_acquiadam\MediaEntityHelper
   *   An instance of the MediaEntityHelper class.
   */
  protected function getNewMediaEntityHelper(MediaInterface $media = NULL) {
    if (is_null($media)) {
      $media = $this->getMockedMediaEntity($this->getAssetData()->id);
    }

    return new MediaEntityHelper(
      $media,
      $this->container->get('entity_type.manager'),
      $this->container->get('media_acquiadam.asset_data'),
      $this->container->get('media_acquiadam.acquiadam'),
      $this->container->get('media_acquiadam.asset_file.helper'),
      $this->container->get('logger.factory'),
    );
  }

  /**
   * Sets Drupal mocked services into a container.
   *
   * @param \Drupal\Core\DependencyInjection\ContainerBuilder $container
   *   The container to set mocks into.
   */
  protected function setMockedDrupalServices(ContainerBuilder $container) {

    $media_bundle = $this->createStub(MediaTypeInterface::class);
    $media_bundle->method('getFieldMap')
      ->willReturn(['file' => 'phpunit_file_field']);

    $entity_storage = $this->createMock(EntityStorageInterface::class);
    $entity_storage->method('load')->willReturnMap([
      [$this->getMockedFileEntity()->id(), $this->getMockedFileEntity()],
      ['media_acquiadam', $media_bundle],
    ]);
    $entity_storage->method('loadByProperties')->willReturnMap([
      [
        ['uri' => 'private://assets/replaced/' . $this->getAssetData()->filename],
        [$this->getMockedFileEntity()],
      ],
      [
        ['uri' => 'private://assets/replaced/Micro turbine 60.jpg'],
        [$this->getMockedFileEntity()],
      ],
    ]);

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

    $container->set('entity_type.manager', $entity_type_manager);
  }

  /**
   * Sets Acquia DAM mocked services into a container.
   *
   * @param \Drupal\Core\DependencyInjection\ContainerBuilder $container
   *   The container to set mocks into.
   */
  protected function setMockedAcquiaDamServices(ContainerBuilder $container) {
    $asset_data = $this->createMock(AssetData::class);
    $asset_data->method('isUpdatedAsset')->willReturnOnConsecutiveCalls(FALSE,
      TRUE);

    $acquiadam = $this->createMock(Acquiadam::class);
    $acquiadam->method('getAsset')->willReturnMap([
      [$this->getAssetData()->id, TRUE, $this->getAssetData()],
    ]);

    $asset_file_helper = $this->createMock(AssetFileEntityHelper::class);
    $asset_file_helper->method('getDestinationFromEntity')
      ->willReturn('private://assets/replaced');
    $asset_file_helper->method('createNewFile')->with($this->anything(),
      'private://assets/replaced')->willReturn($this->getMockedFileEntity());

    $container->set('media_acquiadam.asset_data', $asset_data);
    $container->set('media_acquiadam.acquiadam', $acquiadam);
    $container->set('media_acquiadam.asset_file.helper', $asset_file_helper);
  }

}

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

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