media_acquiadam-8.x-1.46/tests/src/Kernel/AcquiadamMediaTest.php

tests/src/Kernel/AcquiadamMediaTest.php
<?php

namespace Drupal\Tests\media_acquiadam\Kernel;

use Drupal\Core\File\FileSystem;
use Drupal\Core\File\FileSystemInterface;
use Drupal\media_acquiadam\Acquiadam;
use Drupal\media_acquiadam\Plugin\media\Source\AcquiadamAsset;

/**
 * Tests Media entities with Acquia DAM source.
 *
 * @group media_acquiadam
 */
class AcquiadamMediaTest extends AcquiadamKernelTestBase {

  /**
   * For some reason fallback_formatter's config schema fails in our tests.
   *
   * Disable it for now, because this module is deprecated.
   *
   * @var bool
   */
  //phpcs:ignore DrupalPractice.Objects.StrictSchemaDisabled.StrictConfigSchema
  protected $strictConfigSchema = FALSE;

  /**
   * The media entity with mocked asset data.
   *
   * @var \Drupal\media\Entity\Media
   */
  protected $media;

  /**
   * Reflection class so we can update properties from the Media source.
   *
   * @var \ReflectionClass
   */
  protected $sourceReflectionClass;

  /**
   * Reflection class so we can update cached assets.
   *
   * @var \ReflectionClass
   */
  protected $acquiadamReflectionClass;

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

    $this->sourceReflectionClass = new \ReflectionClass(AcquiadamAsset::class);
    $this->acquiadamReflectionClass = new \ReflectionClass(Acquiadam::class);

    $this->asset = $this->getAssetData();

    // Create file with same name as asset file to make sure asset file
    // replacement happens as expected.
    $dir_path = 'public://acquiadam/';
    $contents = 'test';
    $this->container->get('file_system')->prepareDirectory($dir_path, FileSystemInterface::CREATE_DIRECTORY);
    $this->container->get('file_system')->saveData($contents, $dir_path . $this->asset->filename);

    $this->testClient->addAsset($this->asset);
    $this->media = $this->createMedia($this->asset->id);
  }

  /**
   * Tests if field mappings work as expected.
   */
  public function testFieldMappings() {
    $media_file_uri = $this->getAssetFileEntity($this->media)->getFileUri();
    $expected_asset_uri = $this->getAssetUri($this->asset, $this->media);

    $this->assertEquals($this->media->label(), $this->asset->filename, 'Media name mapped to asset filename as expected.');
    $this->assertEquals($media_file_uri, $expected_asset_uri, 'Media file URI mapped as expected.');
  }

  /**
   * Tests updating media entity when new version is available.
   */
  public function testNewVersionUpdate() {
    $original_file_uri = $this->getAssetFileEntity($this->media)->getFileUri();
    $this->saveNewVersion();

    $file = $this->getAssetFileEntity($this->media);
    $file_uri = $file->getFileUri();
    $version_filename_asset_uri = $this->getAssetUri($this->asset, $this->media);

    $this->assertEquals($this->media->label(), $this->asset->filename, 'Media name updated as expected.');
    $this->assertEquals($file_uri, $original_file_uri, 'New version file path matches existing.');
    $this->assertNotEquals($file_uri, $version_filename_asset_uri, 'File URI not changed to new filename.');
    $this->assertEquals($file->label(), $this->asset->filename, 'File entity label updated as expected.');
  }

  /**
   * Tests that version is only updated when file is saved correctly.
   */
  public function testFailedFileSave() {
    /** @var \Drupal\media_acquiadam\Service\AssetFileEntityHelper $asset_file_helper */
    $asset_file_helper = $this->container->get('media_acquiadam.asset_file.helper');
    /** @var \Drupal\Core\File\FileSystem $file_system */
    $file_system = $this->container->get('file_system');

    // Makes directory read only so file save fails.
    $directory = $asset_file_helper->getDestinationFromEntity($this->media, 'field_acquiadam_asset_file', '2021-09-24T18:31:02Z');
    $file_system->chmod($directory, 0000);

    // Attempts to save new version of asset while directory isn't accessible.
    $this->saveNewVersion();
    $new_version = $this->acquiaAssetData->isUpdatedAsset($this->asset);

    $this->assertEquals(TRUE, $new_version, 'Asset version unchanged as expected.');

    // Restore permissions to directory and resave entity.
    $file_system->chmod($directory, FileSystem::CHMOD_DIRECTORY);
    $this->reSaveMedia();
    $new_version = $this->acquiaAssetData->isUpdatedAsset($this->asset);

    $this->assertNotEquals(FALSE, $new_version, 'New version different from old version.');
    $this->assertEquals(TRUE, $new_version, 'Asset version updated as expected.');
  }

  /**
   * Tests if updating multiple revisionable entities.
   *
   * See DAM-157 for context.
   */
  public function testAssetFileIsCorrect() {
    // Store the unchanged FID and create a new revision.
    $expected_fid = $this->getAssetFileEntity($this->media)->id();
    $this->createNewMediaRevision();

    // Create other media entity to test if its asset file won't be referenced
    // by first media entity.
    $other_asset = $this->getAssetData([
      'id' => '34asd3q2-e294-4908-bbd9-f43f433d2e33',
      'filename' => 'other_file.jpg',
    ]);
    $this->testClient->addAsset($other_asset);
    $other_media = $this->createMedia($other_asset->id);
    $other_file = $this->getAssetFileEntity($other_media);

    // Create a new version for intial asset and re-save corresponding media
    // entity to test if file was updated correctly.
    $this->saveNewVersion();

    // Re-loads FID to assert it's unchanged.
    $actual_fid = $this->getAssetFileEntity($this->media)->id();
    $this->assertEquals($actual_fid, $expected_fid, 'First media entity still has reference to the expected file.');

    // Asserts second media file is still correct.
    $this->assertEquals($other_file->getFileUri(), $this->getAssetUri($other_asset, $other_media), 'Second media entity still has the expected URI.');
  }

  /**
   * Re-saves media to generate new revision.
   *
   * @throws \Drupal\Core\Entity\EntityStorageException
   */
  protected function createNewMediaRevision() {
    $this->media->setName('test');
    $this->media->setNewRevision(TRUE);
    $this->media->save();
  }

  /**
   * Generates a new version of the asset and resaves media entity.
   */
  protected function saveNewVersion() {
    $this->asset = $this->generateNewVersion($this->asset);
    $this->testClient->addAsset($this->asset);
    $this->reSaveMedia();
  }

  /**
   * Re-saves the media to get new updates.
   */
  protected function reSaveMedia() {

    // Clear current asset so we get new updates from assets.
    $this->clearCurrentAssetFromSource($this->media->getSource());

    // Saves a new revision for this entity.
    $this->media->setNewRevision(TRUE);
    $this->media->save();
  }

  /**
   * Clears source current asset so we can simulate updates from the API.
   *
   * @param \Drupal\media_acquiadam\Plugin\media\Source\AcquiadamAsset $source
   *   The source to clear.
   */
  protected function clearCurrentAssetFromSource(AcquiadamAsset $source) {
    $current_asset_property = $this->sourceReflectionClass->getProperty('currentAsset');
    $current_asset_property->setAccessible(TRUE);
    $current_asset_property->setValue($source, NULL);

    $cached_assets_property = $this->acquiadamReflectionClass->getProperty('cachedAssets');
    $cached_assets_property->setAccessible(TRUE);
    $cached_assets_property->setValue([]);
  }

}

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

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