You are here

public function EntityHasFieldConstraintValidatorTest::testValidation in Drupal 9

Same name and namespace in other branches
  1. 8 core/tests/Drupal/KernelTests/Core/Entity/EntityHasFieldConstraintValidatorTest.php \Drupal\KernelTests\Core\Entity\EntityHasFieldConstraintValidatorTest::testValidation()

File

core/tests/Drupal/KernelTests/Core/Entity/EntityHasFieldConstraintValidatorTest.php, line 29

Class

EntityHasFieldConstraintValidatorTest
@covers \Drupal\Core\Entity\Plugin\Validation\Constraint\EntityHasFieldConstraintValidator

Namespace

Drupal\KernelTests\Core\Entity

Code

public function testValidation() {
  $this->state
    ->set('entity_test_constraints.build', [
    'EntityHasField' => 'body',
  ]);

  /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */
  $entity_type_manager = $this->container
    ->get('entity_type.manager');
  $entity_type_manager
    ->clearCachedDefinitions();

  // Clear the typed data cache so that the entity has the correct constraints
  // during validation.
  $this->container
    ->get('typed_data_manager')
    ->clearCachedDefinitions();
  $storage = $entity_type_manager
    ->getStorage('entity_test_constraints');

  /** @var \Drupal\entity_test\Entity\EntityTestConstraints $entity */
  $entity = $storage
    ->create();

  // We should get a violation if we try to validate the entity before the
  // field has been created.
  $violations = $entity
    ->validate();
  $this
    ->assertCount(1, $violations);
  $this
    ->assertEquals('The entity must have the <em class="placeholder">body</em> field.', $violations[0]
    ->getMessage());
  $storage
    ->save($entity);

  // Create the field.
  $field_storage = FieldStorageConfig::create([
    'type' => 'string',
    'entity_type' => $entity
      ->getEntityTypeId(),
    'field_name' => 'body',
  ]);
  $field_storage
    ->save();
  FieldConfig::create([
    'field_storage' => $field_storage,
    'bundle' => $entity
      ->bundle(),
  ])
    ->save();

  // Now that the field has been created, there should be no violations.
  $this
    ->assertCount(0, $storage
    ->loadUnchanged(1)
    ->validate());
}