You are here

public function EntityDefinitionUpdateTest::testInitialValueFromField in Drupal 9

Same name and namespace in other branches
  1. 8 core/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php \Drupal\KernelTests\Core\Entity\EntityDefinitionUpdateTest::testInitialValueFromField()
  2. 10 core/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php \Drupal\KernelTests\Core\Entity\EntityDefinitionUpdateTest::testInitialValueFromField()

Tests adding a base field with initial values inherited from another field.

@dataProvider initialValueFromFieldTestCases

File

core/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php, line 1228

Class

EntityDefinitionUpdateTest
Tests EntityDefinitionUpdateManager functionality.

Namespace

Drupal\KernelTests\Core\Entity

Code

public function testInitialValueFromField($default_initial_value, $expected_value) {
  $storage = \Drupal::entityTypeManager()
    ->getStorage('entity_test_update');
  $db_schema = $this->database
    ->schema();

  // Create two entities before adding the base field.

  /** @var \Drupal\entity_test_update\Entity\EntityTestUpdate $entity */
  $storage
    ->create([
    'name' => 'First entity',
    'test_single_property' => 'test existing value',
  ])
    ->save();

  // The second entity does not have any value for the 'test_single_property'
  // field, allowing us to test the 'default_value' parameter of
  // \Drupal\Core\Field\BaseFieldDefinition::setInitialValueFromField().
  $storage
    ->create([
    'name' => 'Second entity',
  ])
    ->save();

  // Add a base field with an initial value inherited from another field.
  $definitions['new_base_field'] = BaseFieldDefinition::create('string')
    ->setName('new_base_field')
    ->setLabel('A new base field')
    ->setInitialValueFromField('name');
  $definitions['another_base_field'] = BaseFieldDefinition::create('string')
    ->setName('another_base_field')
    ->setLabel('Another base field')
    ->setInitialValueFromField('test_single_property', $default_initial_value);
  $this->state
    ->set('entity_test_update.additional_base_field_definitions', $definitions);
  $this
    ->assertFalse($db_schema
    ->fieldExists('entity_test_update', 'new_base_field'), "New field 'new_base_field' does not exist before applying the update.");
  $this
    ->assertFalse($db_schema
    ->fieldExists('entity_test_update', 'another_base_field'), "New field 'another_base_field' does not exist before applying the update.");
  $this->entityDefinitionUpdateManager
    ->installFieldStorageDefinition('new_base_field', 'entity_test_update', 'entity_test', $definitions['new_base_field']);
  $this->entityDefinitionUpdateManager
    ->installFieldStorageDefinition('another_base_field', 'entity_test_update', 'entity_test', $definitions['another_base_field']);
  $this
    ->assertTrue($db_schema
    ->fieldExists('entity_test_update', 'new_base_field'), "New field 'new_base_field' has been created on the 'entity_test_update' table.");
  $this
    ->assertTrue($db_schema
    ->fieldExists('entity_test_update', 'another_base_field'), "New field 'another_base_field' has been created on the 'entity_test_update' table.");

  // Check that the initial values have been applied.
  $storage = \Drupal::entityTypeManager()
    ->getStorage('entity_test_update');
  $entities = $storage
    ->loadMultiple();
  $this
    ->assertEquals('First entity', $entities[1]
    ->get('new_base_field')->value);
  $this
    ->assertEquals('Second entity', $entities[2]
    ->get('new_base_field')->value);
  $this
    ->assertEquals('test existing value', $entities[1]
    ->get('another_base_field')->value);
  $this
    ->assertEquals($expected_value, $entities[2]
    ->get('another_base_field')->value);
}