function FieldableEntityDefinitionUpdateTest::testFieldableEntityTypeUpdates

@covers ::updateFieldableEntityType
@dataProvider providerTestFieldableEntityTypeUpdates

File

core/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php, line 132

Class

FieldableEntityDefinitionUpdateTest
Tests EntityDefinitionUpdateManager's fieldable entity update functionality.

Namespace

Drupal\KernelTests\Core\Entity

Code

public function testFieldableEntityTypeUpdates($initial_rev, $initial_mul, $new_rev, $new_mul, $data_migration_supported) {
  // The 'entity_test_update' entity type is neither revisionable nor
  // translatable by default, so we need to get it into the initial testing
  // state. This also covers the "no existing data" scenario for fieldable
  // entity type updates.
  if ($initial_rev || $initial_mul) {
    $entity_type = $this->getUpdatedEntityTypeDefinition($initial_rev, $initial_mul);
    $field_storage_definitions = $this->getUpdatedFieldStorageDefinitions($initial_rev, $initial_mul);
    $this->entityDefinitionUpdateManager
      ->updateFieldableEntityType($entity_type, $field_storage_definitions);
    $this->assertEntityTypeSchema($initial_rev, $initial_mul);
  }
  // Add a few entities so we can test the data copying step.
  $this->insertData($initial_rev, $initial_mul);
  $updated_entity_type = $this->getUpdatedEntityTypeDefinition($new_rev, $new_mul);
  $updated_field_storage_definitions = $this->getUpdatedFieldStorageDefinitions($new_rev, $new_mul);
  if (!$data_migration_supported) {
    $this->expectException(EntityStorageException::class);
    $this->expectExceptionMessage('Converting an entity type from revisionable to non-revisionable or from translatable to non-translatable is not supported.');
  }
  // Check that existing data can be retrieved from the storage before the
  // entity schema is updated.
  if ($data_migration_supported) {
    $this->assertEntityData($initial_rev, $initial_mul);
  }
  // Enable the creation of a new base field during a fieldable entity type
  // update.
  $this->state
    ->set('entity_test_update.install_new_base_field_during_update', TRUE);
  // Simulate a batch run since we are converting the entities one by one.
  $sandbox = [];
  do {
    $this->entityDefinitionUpdateManager
      ->updateFieldableEntityType($updated_entity_type, $updated_field_storage_definitions, $sandbox);
  } while ($sandbox['#finished'] != 1);
  $this->assertEntityTypeSchema($new_rev, $new_mul, TRUE);
  $this->assertEntityData($initial_rev, $initial_mul);
  $change_list = $this->entityDefinitionUpdateManager
    ->getChangeList();
  $this->assertArrayNotHasKey('entity_test_update', $change_list, "There are no remaining updates for the 'entity_test_update' entity type.");
  // Check that we can still save new entities after the schema has been
  // updated.
  $this->insertData($new_rev, $new_mul);
  // Check that the backup tables have been kept in place.
  $this->assertBackupTables();
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.