function ConfigEntityValidationTestBase::testRequiredPropertyValuesMissing

Same name in other branches
  1. 10 core/tests/Drupal/KernelTests/Core/Config/ConfigEntityValidationTestBase.php \Drupal\KernelTests\Core\Config\ConfigEntityValidationTestBase::testRequiredPropertyValuesMissing()

A property that is required must have a value (i.e. not NULL).

@todo Remove this optional parameter in https://www.drupal.org/project/drupal/issues/2820364#comment-15333069

Parameters

string[]|null $additional_expected_validation_errors_when_missing: Some required config entity properties have additional validation constraints that cause additional messages to appear. Keys must be config entity properties, values must be arrays as expected by ::assertValidationErrors().

Return value

void

3 calls to ConfigEntityValidationTestBase::testRequiredPropertyValuesMissing()
BlockValidationTest::testRequiredPropertyValuesMissing in core/modules/block/tests/src/Kernel/BlockValidationTest.php
EditorValidationTest::testRequiredPropertyValuesMissing in core/modules/editor/tests/src/Kernel/EditorValidationTest.php
FieldConfigValidationTest::testRequiredPropertyValuesMissing in core/modules/field/tests/src/Kernel/Entity/FieldConfigValidationTest.php
3 methods override ConfigEntityValidationTestBase::testRequiredPropertyValuesMissing()
BlockValidationTest::testRequiredPropertyValuesMissing in core/modules/block/tests/src/Kernel/BlockValidationTest.php
EditorValidationTest::testRequiredPropertyValuesMissing in core/modules/editor/tests/src/Kernel/EditorValidationTest.php
FieldConfigValidationTest::testRequiredPropertyValuesMissing in core/modules/field/tests/src/Kernel/Entity/FieldConfigValidationTest.php

File

core/tests/Drupal/KernelTests/Core/Config/ConfigEntityValidationTestBase.php, line 545

Class

ConfigEntityValidationTestBase
Base class for testing validation of config entities.

Namespace

Drupal\KernelTests\Core\Config

Code

public function testRequiredPropertyValuesMissing(?array $additional_expected_validation_errors_when_missing = NULL) : void {
    $config_entity_properties = array_keys($this->entity
        ->getEntityType()
        ->getPropertiesToExport());
    // Guide developers when $additional_expected_validation_errors_when_missing
    // does not contain sensible values.
    $non_existing_properties = array_diff(array_keys($additional_expected_validation_errors_when_missing ?? []), $config_entity_properties);
    if ($non_existing_properties) {
        throw new \LogicException(sprintf('The test %s lists `%s` in $additional_expected_validation_errors_when_missing but it is not a property of the `%s` config entity type.', __METHOD__, implode(', ', $non_existing_properties), $this->entity
            ->getEntityTypeId()));
    }
    $properties_with_optional_values = $this->getPropertiesWithOptionalValues();
    // Get the config entity properties that are immutable.
    // @see ::testImmutableProperties()
    $immutable_properties = $this->entity
        ->getEntityType()
        ->getConstraints()['ImmutableProperties'];
    // Config entity properties containing plugin collections are special cases:
    // setting them to NULL would cause them to get out of sync with the plugin
    // collection.
    // @see \Drupal\Core\Config\Entity\ConfigEntityBase::set()
    // @see \Drupal\Core\Config\Entity\ConfigEntityBase::preSave()
    $plugin_collection_properties = $this->entity instanceof EntityWithPluginCollectionInterface ? array_keys($this->entity
        ->getPluginCollections()) : [];
    // To test properties with missing required values, $this->entity must be
    // modified to be able to use ::assertValidationErrors(). To allow restoring
    // $this->entity to its original value for each tested property, a clone of
    // the original entity is needed.
    $original_entity = clone $this->entity;
    foreach ($config_entity_properties as $property) {
        // Do not try to set immutable properties to NULL: their immutability is
        // already tested.
        // @see ::testImmutableProperties()
        if (in_array($property, $immutable_properties, TRUE)) {
            continue;
        }
        // Do not try to set plugin collection properties to NULL.
        if (in_array($property, $plugin_collection_properties, TRUE)) {
            continue;
        }
        $this->entity = clone $original_entity;
        $this->entity
            ->set($property, NULL);
        $expected_validation_errors = in_array($property, $properties_with_optional_values, TRUE) ? [] : [
            $property => 'This value should not be null.',
        ];
        // @see `type: required_label`
        // @see \Symfony\Component\Validator\Constraints\NotBlank
        if (!$this->isFullyValidatable() && $this->entity
            ->getEntityType()
            ->getKey('label') == $property) {
            $expected_validation_errors = [
                $property => 'This value should not be blank.',
            ];
        }
        $this->assertValidationErrors(($additional_expected_validation_errors_when_missing[$property] ?? []) + $expected_validation_errors);
    }
}

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