Verified Commit 64388892 authored by Dave Long's avatar Dave Long
Browse files

test: #3590777 Add kernel test coverage for FileReferenceResolver

By: acbramley
By: mohit_aghera
By: smustgrave
By: mstrelan
(cherry picked from commit 0d32f86c)
parent b9714ad6
Loading
Loading
Loading
Loading
+126 −0
Changes for core/modules/file/tests/src/Kernel/FileReferenceResolverTest.php: 126 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\Tests\file\Kernel;

use Drupal\entity_test\Entity\EntityTestMulRevPub;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\file\FileReferenceResolver;
use Drupal\file\FileReferenceUsage;
use Drupal\language\Entity\ConfigurableLanguage;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\CoversMethod;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;

/**
 * Tests the FileReferenceResolver methods.
 */
#[Group('file')]
#[RunTestsInSeparateProcesses]
#[CoversClass(FileReferenceResolver::class)]
#[CoversMethod(FileReferenceResolver::class, 'isFileReferencedByField')]
#[CoversMethod(FileReferenceResolver::class, 'getReferencingRevision')]
class FileReferenceResolverTest extends FileManagedUnitTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = ['entity_test', 'language'];

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();
    $this->installEntitySchema('entity_test_mulrevpub');
    FieldStorageConfig::create([
      'field_name' => 'field_file',
      'entity_type' => 'entity_test_mulrevpub',
      'type' => 'file',
    ])->save();
    FieldConfig::create([
      'entity_type' => 'entity_test_mulrevpub',
      'bundle' => 'entity_test_mulrevpub',
      'field_name' => 'field_file',
      'label' => 'File',
      'translatable' => TRUE,
    ])->save();
  }

  /**
   * Tests that reference in a non-default revision are resolved.
   */
  public function testFileReferenceResolveFromReferencingRevision(): void {
    $file1 = $this->createFile();
    $file2 = $this->createFile();

    $entity = EntityTestMulRevPub::create([
      'name' => $this->randomMachineName(),
      'field_file' => $file1,
    ]);
    $entity->save();
    $first_revision_id = $entity->getRevisionId();

    // Create new revision with file2.
    $entity = EntityTestMulRevPub::load($entity->id());
    $entity->setNewRevision();
    $entity->set('field_file', $file2);
    $entity->save();

    $resolver = $this->container->get(FileReferenceResolver::class);

    // The default revision references file2.
    $file_2_references = iterator_to_array($resolver->getReferences($file2), FALSE);
    $this->assertCount(1, $file_2_references);
    $this->assertInstanceOf(FileReferenceUsage::class, $file_2_references[0]);
    $this->assertEquals($entity->id(), $file_2_references[0]->id);

    // File1 is not the default revision anymore. It is associated with the
    // older revision.
    $file_1_references = iterator_to_array($resolver->getReferences($file1), FALSE);
    $this->assertCount(1, $file_1_references);
    $this->assertInstanceOf(FileReferenceUsage::class, $file_1_references[0]);
    $this->assertEquals($first_revision_id, $file_1_references[0]->revisionId);

    // Verify that usage can be resolved back to the original revision entity.
    $loaded = $resolver->loadEntityFromUsage($file_1_references[0]);
    $this->assertEquals($first_revision_id, $loaded->getRevisionId());
    $this->assertEquals($file1->id(), $loaded->get('field_file')->target_id);
  }

  /**
   * Tests that references in a translation are resolved.
   */
  public function testFileReferenceResolveFromTranslationRevision(): void {
    ConfigurableLanguage::create([
      'id' => 'es',
      'label' => 'Spanish',
    ])->save();
    $es_file = $this->createFile();

    $entity = EntityTestMulRevPub::create([
      'name' => $this->randomMachineName(),
      'langcode' => 'en',
    ]);
    $entity->save();

    // Add a Spanish translation with a different file attached.
    $entity->addTranslation('es', [
      'name' => $this->randomMachineName(),
      'field_file' => $es_file,
    ])->save();

    $resolver = $this->container->get(FileReferenceResolver::class);

    // Ensure that file from spanish translation is also included in references.
    $es_references = iterator_to_array($resolver->getReferences($es_file), FALSE);
    $this->assertCount(1, $es_references);
    $this->assertInstanceOf(FileReferenceUsage::class, $es_references[0]);
    $this->assertEquals($entity->id(), $es_references[0]->id);
    $this->assertNull($es_references[0]->revisionId);
  }

}