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([]);
}
}
