function EntityBundleFieldTest::testCustomBundleFieldUsage

Same name and namespace in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Entity/EntityBundleFieldTest.php \Drupal\KernelTests\Core\Entity\EntityBundleFieldTest::testCustomBundleFieldUsage()
  2. 8.9.x core/tests/Drupal/KernelTests/Core/Entity/EntityBundleFieldTest.php \Drupal\KernelTests\Core\Entity\EntityBundleFieldTest::testCustomBundleFieldUsage()
  3. 10 core/tests/Drupal/KernelTests/Core/Entity/EntityBundleFieldTest.php \Drupal\KernelTests\Core\Entity\EntityBundleFieldTest::testCustomBundleFieldUsage()

Tests making use of a custom bundle field.

File

core/tests/Drupal/KernelTests/Core/Entity/EntityBundleFieldTest.php, line 49

Class

EntityBundleFieldTest
Tests adding a custom bundle field.

Namespace

Drupal\KernelTests\Core\Entity

Code

public function testCustomBundleFieldUsage() : void {
    entity_test_create_bundle('custom', NULL, 'entity_test_update');
    // Check that an entity with bundle entity_test does not have the custom
    // field.
    $storage = $this->entityTypeManager
        ->getStorage('entity_test_update');
    $entity = $storage->create([
        'type' => 'entity_test_update',
    ]);
    $this->assertFalse($entity->hasField('custom_bundle_field'));
    // Check that the custom bundle has the defined custom field and check
    // saving and deleting of custom field data.
    $entity = $storage->create([
        'type' => 'custom',
    ]);
    $this->assertTrue($entity->hasField('custom_bundle_field'));
    // Ensure that the field exists in the field map.
    $field_map = \Drupal::service('entity_field.manager')->getFieldMap();
    $this->assertEquals([
        'type' => 'string',
        'bundles' => [
            'custom' => 'custom',
        ],
    ], $field_map['entity_test_update']['custom_bundle_field']);
    $entity->custom_bundle_field->value = 'swanky';
    $entity->save();
    $storage->resetCache();
    $entity = $storage->load($entity->id());
    $this->assertEquals('swanky', $entity->custom_bundle_field->value, 'Entity was saved correctly');
    $entity->custom_bundle_field->value = 'cozy';
    $entity->save();
    $storage->resetCache();
    $entity = $storage->load($entity->id());
    $this->assertEquals('cozy', $entity->custom_bundle_field->value, 'Entity was updated correctly.');
    $entity->delete();
    
    /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
    $table_mapping = $storage->getTableMapping();
    $table = $table_mapping->getDedicatedDataTableName($entity->getFieldDefinition('custom_bundle_field')
        ->getFieldStorageDefinition());
    $result = $this->database
        ->select($table, 'f')
        ->fields('f')
        ->condition('f.entity_id', $entity->id())
        ->execute();
    $this->assertFalse($result->fetchAssoc(), 'Field data has been deleted');
    // Create another entity to test that values are marked as deleted when a
    // bundle is deleted.
    $entity = $storage->create([
        'type' => 'custom',
        'custom_bundle_field' => 'new',
    ]);
    $entity->save();
    entity_test_delete_bundle('custom', 'entity_test_update');
    $table = $table_mapping->getDedicatedDataTableName($entity->getFieldDefinition('custom_bundle_field')
        ->getFieldStorageDefinition(), TRUE);
    $result = $this->database
        ->select($table, 'f')
        ->condition('f.entity_id', $entity->id())
        ->condition('deleted', 1)
        ->countQuery()
        ->execute();
    $this->assertEquals(1, $result->fetchField(), 'Field data has been deleted');
    // Ensure that the field no longer exists in the field map.
    $field_map = \Drupal::service('entity_field.manager')->getFieldMap();
    $this->assertFalse(isset($field_map['entity_test_update']['custom_bundle_field']));
    // Purge field data, and check that the storage definition has been
    // completely removed once the data is purged.
    field_purge_batch(10);
    $this->assertFalse($this->database
        ->schema()
        ->tableExists($table), 'Custom field table was deleted');
}

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