You are here

public function MediaSourceTest::testMetadataMapping in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/media/tests/src/Kernel/MediaSourceTest.php \Drupal\Tests\media\Kernel\MediaSourceTest::testMetadataMapping()
  2. 9 core/modules/media/tests/src/Kernel/MediaSourceTest.php \Drupal\Tests\media\Kernel\MediaSourceTest::testMetadataMapping()

Tests metadata mapping functionality.

File

core/modules/media/tests/src/Kernel/MediaSourceTest.php, line 131

Class

MediaSourceTest
Tests media source plugins related logic.

Namespace

Drupal\Tests\media\Kernel

Code

public function testMetadataMapping() {
  $field_name = 'field_to_map_to';
  $attribute_name = 'attribute_to_map';
  $storage = FieldStorageConfig::create([
    'entity_type' => 'media',
    'field_name' => $field_name,
    'type' => 'string',
  ]);
  $storage
    ->save();
  FieldConfig::create([
    'field_storage' => $storage,
    'bundle' => $this->testMediaType
      ->id(),
    'label' => 'Field to map to',
  ])
    ->save();

  // Save the entity without defining the metadata mapping and check that the
  // field stays empty.

  /** @var \Drupal\media\MediaInterface $media */
  $media = Media::create([
    'bundle' => $this->testMediaType
      ->id(),
    'field_media_test' => 'some_value',
  ]);
  $media
    ->save();
  $this
    ->assertEmpty($media
    ->get($field_name)->value, 'Field stayed empty.');

  // Make sure that source plugin returns NULL for non-existing fields.
  $this->testMediaType
    ->setFieldMap([
    'not_here_at_all' => $field_name,
  ])
    ->save();
  $media = Media::create([
    'bundle' => $this->testMediaType
      ->id(),
    'field_media_test' => 'some_value',
  ]);
  $media_source = $media
    ->getSource();
  $this
    ->assertNull($media_source
    ->getMetadata($media, 'not_here_at_all'), 'NULL is not returned if asking for a value of non-existing metadata.');
  $media
    ->save();
  $this
    ->assertTrue($media
    ->get($field_name)
    ->isEmpty(), 'Non-existing metadata attribute was wrongly mapped to the field.');

  // Define mapping and make sure that the value was stored in the field.
  \Drupal::state()
    ->set('media_source_test_attributes', [
    $attribute_name => [
      'title' => 'Attribute to map',
      'value' => 'Snowball',
    ],
  ]);
  $this->testMediaType
    ->setFieldMap([
    $attribute_name => $field_name,
  ])
    ->save();
  $media = Media::create([
    'bundle' => $this->testMediaType
      ->id(),
    'field_media_test' => 'some_value',
  ]);
  $media_source = $media
    ->getSource();
  $this
    ->assertSame('Snowball', $media_source
    ->getMetadata($media, $attribute_name), 'Value of the metadata attribute is not correct.');
  $media
    ->save();
  $this
    ->assertSame('Snowball', $media
    ->get($field_name)->value, 'Metadata attribute was not mapped to the field.');

  // Change the metadata attribute value and re-save the entity. Field value
  // should stay the same.
  \Drupal::state()
    ->set('media_source_test_attributes', [
    $attribute_name => [
      'title' => 'Attribute to map',
      'value' => 'Pinkeye',
    ],
  ]);
  $this
    ->assertSame('Pinkeye', $media_source
    ->getMetadata($media, $attribute_name), 'Value of the metadata attribute is not correct.');
  $media
    ->save();
  $this
    ->assertSame('Snowball', $media
    ->get($field_name)->value, 'Metadata attribute was not mapped to the field.');

  // Now change the value of the source field and make sure that the mapped
  // values update too.
  $this
    ->assertSame('Pinkeye', $media_source
    ->getMetadata($media, $attribute_name), 'Value of the metadata attribute is not correct.');
  $media
    ->set('field_media_test', 'some_new_value');
  $media
    ->save();
  $this
    ->assertSame('Pinkeye', $media
    ->get($field_name)->value, 'Metadata attribute was not mapped to the field.');

  // Remove the value of the mapped field and make sure that it is re-mapped
  // on save.
  \Drupal::state()
    ->set('media_source_test_attributes', [
    $attribute_name => [
      'title' => 'Attribute to map',
      'value' => 'Snowball',
    ],
  ]);
  $media->{$field_name}->value = NULL;
  $this
    ->assertSame('Snowball', $media_source
    ->getMetadata($media, $attribute_name), 'Value of the metadata attribute is not correct.');
  $media
    ->save();
  $this
    ->assertSame('Snowball', $media
    ->get($field_name)->value, 'Metadata attribute was not mapped to the field.');
}