function EntityDefinitionUpdateTest::testBaseFieldCreateDeleteWithExistingEntities
Same name in other branches
- 9 core/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php \Drupal\KernelTests\Core\Entity\EntityDefinitionUpdateTest::testBaseFieldCreateDeleteWithExistingEntities()
- 8.9.x core/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php \Drupal\KernelTests\Core\Entity\EntityDefinitionUpdateTest::testBaseFieldCreateDeleteWithExistingEntities()
- 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 403
Class
- EntityDefinitionUpdateTest
- Tests EntityDefinitionUpdateManager functionality.
Namespace
Drupal\KernelTests\Core\EntityCode
public function testBaseFieldCreateDeleteWithExistingEntities() : void {
// 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();
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.