You are here

public function EntityDefinitionUpdateTest::testBaseFieldCreateDeleteWithExistingEntities 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::testBaseFieldCreateDeleteWithExistingEntities()
  2. 10 core/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php \Drupal\KernelTests\Core\Entity\EntityDefinitionUpdateTest::testBaseFieldCreateDeleteWithExistingEntities()

Tests creating and deleting a base field if entities exist.

This tests deletion when there are existing entities, but non-existent data for the field being deleted.

See also

testBaseFieldDeleteWithExistingData()

File

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

Class

EntityDefinitionUpdateTest
Tests EntityDefinitionUpdateManager functionality.

Namespace

Drupal\KernelTests\Core\Entity

Code

public function testBaseFieldCreateDeleteWithExistingEntities() {

  // Save an entity.
  $name = $this
    ->randomString();
  $storage = $this->entityTypeManager
    ->getStorage('entity_test_update');
  $entity = $storage
    ->create([
    'name' => $name,
  ]);
  $entity
    ->save();

  // Add a base field and run the update. Ensure the base field's column is
  // created and the prior saved entity data is still there.
  $this
    ->addBaseField();
  $this
    ->applyEntityUpdates();
  $schema_handler = $this->database
    ->schema();
  $this
    ->assertTrue($schema_handler
    ->fieldExists('entity_test_update', 'new_base_field'), 'Column created in shared table for new_base_field.');
  $entity = $this->entityTypeManager
    ->getStorage('entity_test_update')
    ->load($entity
    ->id());
  $this
    ->assertSame($name, $entity->name->value, 'Entity data preserved during field creation.');

  // Remove the base field and run the update. Ensure the base field's column
  // is deleted and the prior saved entity data is still there.
  $this
    ->removeBaseField();
  $this
    ->applyEntityUpdates();
  $this
    ->assertFalse($schema_handler
    ->fieldExists('entity_test_update', 'new_base_field'), 'Column deleted from shared table for new_base_field.');
  $entity = $this->entityTypeManager
    ->getStorage('entity_test_update')
    ->load($entity
    ->id());
  $this
    ->assertSame($name, $entity->name->value, 'Entity data preserved during field deletion.');

  // Add a base field with a required property and run the update. Ensure
  // 'not null' is not applied and thus no exception is thrown.
  $this
    ->addBaseField('shape_required');
  $this
    ->applyEntityUpdates();
  $assert = $schema_handler
    ->fieldExists('entity_test_update', 'new_base_field__shape') && $schema_handler
    ->fieldExists('entity_test_update', 'new_base_field__color');
  $this
    ->assertTrue($assert, 'Columns created in shared table for new_base_field.');

  // Recreate the field after emptying the base table and check that its
  // columns are not 'not null'.
  // @todo Revisit this test when allowing for required storage field
  //   definitions. See https://www.drupal.org/node/2390495.
  $entity
    ->delete();
  $this
    ->removeBaseField();
  $this
    ->applyEntityUpdates();
  $this
    ->assertFalse($schema_handler
    ->fieldExists('entity_test_update', 'new_base_field__shape'), 'Shape column should be removed from the shared table for new_base_field.');
  $this
    ->assertFalse($schema_handler
    ->fieldExists('entity_test_update', 'new_base_field__color'), 'Color column should be removed from the shared table for new_base_field.');
  $this
    ->addBaseField('shape_required');
  $this
    ->applyEntityUpdates();
  $assert = $schema_handler
    ->fieldExists('entity_test_update', 'new_base_field__shape') && $schema_handler
    ->fieldExists('entity_test_update', 'new_base_field__color');
  $this
    ->assertTrue($assert, 'Columns created again in shared table for new_base_field.');
  $entity = $storage
    ->create([
    'name' => $name,
  ]);
  $entity
    ->save();
}