EntityTypeConstraintsTest.php

Same filename and directory in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Entity/EntityTypeConstraintsTest.php
  2. 8.9.x core/tests/Drupal/KernelTests/Core/Entity/EntityTypeConstraintsTest.php
  3. 10 core/tests/Drupal/KernelTests/Core/Entity/EntityTypeConstraintsTest.php

Namespace

Drupal\KernelTests\Core\Entity

File

core/tests/Drupal/KernelTests/Core/Entity/EntityTypeConstraintsTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\KernelTests\Core\Entity;


/**
 * Tests entity level validation constraints.
 *
 * @group Entity
 */
class EntityTypeConstraintsTest extends EntityKernelTestBase {
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->installEntitySchema('entity_test_constraints');
  }
  
  /**
   * Tests defining entity constraints via entity type annotations and hooks.
   */
  public function testConstraintDefinition() : void {
    // Test reading the annotation. There should be two constraints, the defined
    // constraint and the automatically added EntityChanged constraint.
    $entity_type = $this->entityTypeManager
      ->getDefinition('entity_test_constraints');
    $default_constraints = [
      'NotNull' => [],
      'EntityChanged' => NULL,
      'EntityUntranslatableFields' => NULL,
    ];
    $this->assertEquals($default_constraints, $entity_type->getConstraints());
    // Enable our test module and test extending constraints.
    $this->enableModules([
      'entity_test_constraints',
    ]);
    $this->container
      ->get('module_handler')
      ->resetImplementations();
    $extra_constraints = [
      'Test' => [],
    ];
    $this->state
      ->set('entity_test_constraints.build', $extra_constraints);
    // Re-fetch the entity type manager from the new container built after the
    // new modules were enabled.
    $this->entityTypeManager = $this->container
      ->get('entity_type.manager');
    $this->entityTypeManager
      ->clearCachedDefinitions();
    $entity_type = $this->entityTypeManager
      ->getDefinition('entity_test_constraints');
    $this->assertEquals($default_constraints + $extra_constraints, $entity_type->getConstraints());
    // Test altering constraints.
    $altered_constraints = [
      'Test' => [
        'some_setting' => TRUE,
      ],
    ];
    $this->state
      ->set('entity_test_constraints.alter', $altered_constraints);
    // Clear the cache in state instance in the Drupal container, so it can pick
    // up the modified value.
    \Drupal::state()->resetCache();
    $this->entityTypeManager
      ->clearCachedDefinitions();
    $entity_type = $this->entityTypeManager
      ->getDefinition('entity_test_constraints');
    $this->assertEquals($altered_constraints, $entity_type->getConstraints());
  }
  
  /**
   * Tests entity constraints are validated.
   */
  public function testConstraintValidation() : void {
    $entity = $this->entityTypeManager
      ->getStorage('entity_test_constraints')
      ->create();
    $entity->user_id->target_id = 0;
    $violations = $entity->validate();
    $this->assertEquals(0, $violations->count(), 'Validation passed.');
    $entity->save();
    $entity->changed->value = \Drupal::time()->getRequestTime() - 86400;
    $violations = $entity->validate();
    $this->assertEquals(1, $violations->count(), 'Validation failed.');
    $this->assertEquals('The content has either been modified by another user, or you have already submitted modifications. As a result, your changes cannot be saved.', $violations[0]->getMessage());
  }

}

Classes

Title Deprecated Summary
EntityTypeConstraintsTest Tests entity level validation constraints.

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