function EntityResourceTestBase::getModifiedEntityForPatchTesting

Same name and namespace in other branches
  1. 9 core/modules/rest/tests/src/Functional/EntityResource/EntityResourceTestBase.php \Drupal\Tests\rest\Functional\EntityResource\EntityResourceTestBase::getModifiedEntityForPatchTesting()
  2. 8.9.x core/modules/rest/tests/src/Functional/EntityResource/EntityResourceTestBase.php \Drupal\Tests\rest\Functional\EntityResource\EntityResourceTestBase::getModifiedEntityForPatchTesting()
  3. 11.x core/modules/rest/tests/src/Functional/EntityResource/EntityResourceTestBase.php \Drupal\Tests\rest\Functional\EntityResource\EntityResourceTestBase::getModifiedEntityForPatchTesting()

Clones the given entity and modifies all PATCH-protected fields.

@internal

Parameters

\Drupal\Core\Entity\EntityInterface $entity: The entity being tested and to modify.

Return value

array Contains two items: 1. The modified entity object. 2. The original field values, keyed by field name.

1 call to EntityResourceTestBase::getModifiedEntityForPatchTesting()
EntityResourceTestBase::testPatch in core/modules/rest/tests/src/Functional/EntityResource/EntityResourceTestBase.php
Tests a PATCH request for an entity, plus edge cases to ensure good DX.

File

core/modules/rest/tests/src/Functional/EntityResource/EntityResourceTestBase.php, line 1264

Class

EntityResourceTestBase
Defines a base class for testing all entity resources.

Namespace

Drupal\Tests\rest\Functional\EntityResource

Code

protected static function getModifiedEntityForPatchTesting(EntityInterface $entity) {
  $modified_entity = clone $entity;
  $original_values = [];
  foreach (array_keys(static::$patchProtectedFieldNames) as $field_name) {
    $field = $modified_entity->get($field_name);
    $original_values[$field_name] = $field->getValue();
    switch ($field->getItemDefinition()
      ->getClass()) {
      case EntityReferenceItem::class:
        // EntityReferenceItem::generateSampleValue() picks one of the last 50
        // entities of the supported type & bundle. We don't care if the value
        // is valid, we only care that it's different.
        $field->setValue([
          'target_id' => 99999,
        ]);
        break;

      case BooleanItem::class:
        // BooleanItem::generateSampleValue() picks either 0 or 1. So a 50%
        // chance of not picking a different value.
        $field->value = (int) $field->value === 1 ? '0' : '1';
        break;

      case PathItem::class:
        // PathItem::generateSampleValue() doesn't set a PID, which causes
        // PathItem::postSave() to fail. Keep the PID (and other properties),
        // just modify the alias.
        $field->alias = str_replace(' ', '-', strtolower((new Random())->sentences(3)));
        break;

      default:
        $original_field = clone $field;
        while ($field->equals($original_field)) {
          $field->generateSampleItems();
        }
        break;

    }
  }
  return [
    $modified_entity,
    $original_values,
  ];
}

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