function EntityFieldTest::testComputedFields

Same name in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Entity/EntityFieldTest.php \Drupal\KernelTests\Core\Entity\EntityFieldTest::testComputedFields()
  2. 8.9.x core/tests/Drupal/KernelTests/Core/Entity/EntityFieldTest.php \Drupal\KernelTests\Core\Entity\EntityFieldTest::testComputedFields()
  3. 11.x core/tests/Drupal/KernelTests/Core/Entity/EntityFieldTest.php \Drupal\KernelTests\Core\Entity\EntityFieldTest::testComputedFields()

Tests all the interaction points of a computed field.

File

core/tests/Drupal/KernelTests/Core/Entity/EntityFieldTest.php, line 785

Class

EntityFieldTest
Tests the Entity Field API.

Namespace

Drupal\KernelTests\Core\Entity

Code

public function testComputedFields() : void {
    $this->installEntitySchema('entity_test_computed_field');
    \Drupal::state()->set('entity_test_computed_field_item_list_value', [
        'foo computed',
    ]);
    // Check that the values are not computed unnecessarily during the lifecycle
    // of an entity when the field is not interacted with directly.
    \Drupal::state()->set('computed_test_field_execution', 0);
    $entity = EntityTestComputedField::create([]);
    $this->assertSame(0, \Drupal::state()->get('computed_test_field_execution', 0));
    $entity->name->value = $this->randomString();
    $this->assertSame(0, \Drupal::state()->get('computed_test_field_execution', 0));
    $entity->save();
    $this->assertSame(0, \Drupal::state()->get('computed_test_field_execution', 0));
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::getValue().
    \Drupal::state()->set('computed_test_field_execution', 0);
    $entity = EntityTestComputedField::create([]);
    $this->assertSame([
        [
            'value' => 'foo computed',
        ],
    ], $entity->computed_string_field
        ->getValue());
    // Check that the values are only computed once.
    $this->assertSame(1, \Drupal::state()->get('computed_test_field_execution', 0));
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::setValue(). This also
    // checks that a subsequent getter does not try to re-compute the value.
    \Drupal::state()->set('computed_test_field_execution', 0);
    $entity = EntityTestComputedField::create([]);
    $entity->computed_string_field
        ->setValue([
        [
            'value' => 'foo computed 1',
        ],
        [
            'value' => 'foo computed 2',
        ],
    ]);
    $this->assertSame([
        [
            'value' => 'foo computed 1',
        ],
        [
            'value' => 'foo computed 2',
        ],
    ], $entity->computed_string_field
        ->getValue());
    // Check that the values have not been computed when they were explicitly
    // set.
    $this->assertSame(0, \Drupal::state()->get('computed_test_field_execution', 0));
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::getString().
    $entity = EntityTestComputedField::create([]);
    $this->assertSame('foo computed', $entity->computed_string_field
        ->getString());
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::get().
    $entity = EntityTestComputedField::create([]);
    $this->assertSame('foo computed', $entity->computed_string_field
        ->get(0)->value);
    $this->assertEmpty($entity->computed_string_field
        ->get(1));
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::set().
    $entity = EntityTestComputedField::create([]);
    $entity->computed_string_field
        ->set(1, 'foo computed 1');
    $this->assertSame('foo computed', $entity->computed_string_field[0]->value);
    $this->assertSame('foo computed 1', $entity->computed_string_field[1]->value);
    $entity->computed_string_field
        ->set(0, 'foo computed 0');
    $this->assertSame('foo computed 0', $entity->computed_string_field[0]->value);
    $this->assertSame('foo computed 1', $entity->computed_string_field[1]->value);
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::appendItem().
    $entity = EntityTestComputedField::create([]);
    $entity->computed_string_field
        ->appendItem('foo computed 1');
    $this->assertSame('foo computed', $entity->computed_string_field[0]->value);
    $this->assertSame('foo computed 1', $entity->computed_string_field[1]->value);
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::removeItem().
    $entity = EntityTestComputedField::create([]);
    $entity->computed_string_field
        ->removeItem(0);
    $this->assertTrue($entity->computed_string_field
        ->isEmpty());
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::isEmpty().
    \Drupal::state()->set('entity_test_computed_field_item_list_value', []);
    $entity = EntityTestComputedField::create([]);
    $this->assertTrue($entity->computed_string_field
        ->isEmpty());
    \Drupal::state()->set('entity_test_computed_field_item_list_value', [
        'foo computed',
    ]);
    $entity = EntityTestComputedField::create([]);
    $this->assertFalse($entity->computed_string_field
        ->isEmpty());
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::filter().
    $filter_callback = function ($item) {
        return !$item->isEmpty();
    };
    $entity = EntityTestComputedField::create([]);
    $entity->computed_string_field
        ->filter($filter_callback);
    $this->assertCount(1, $entity->computed_string_field);
    // Add an empty item to the list and check that it is filtered out.
    $entity->computed_string_field
        ->appendItem();
    $entity->computed_string_field
        ->filter($filter_callback);
    $this->assertCount(1, $entity->computed_string_field);
    // Add a non-empty item to the list and check that it is not filtered out.
    $entity->computed_string_field
        ->appendItem('foo computed 1');
    $entity->computed_string_field
        ->filter($filter_callback);
    $this->assertCount(2, $entity->computed_string_field);
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::offsetExists().
    $entity = EntityTestComputedField::create([]);
    $this->assertTrue($entity->computed_string_field
        ->offsetExists(0));
    $this->assertFalse($entity->computed_string_field
        ->offsetExists(1));
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::getIterator().
    $entity = EntityTestComputedField::create([]);
    foreach ($entity->computed_string_field as $delta => $item) {
        $this->assertSame('foo computed', $item->value);
    }
    // Test \Drupal\Core\TypedData\ComputedItemListTrait::count().
    $entity = EntityTestComputedField::create([]);
    $this->assertCount(1, $entity->computed_string_field);
    // Check that computed items are not auto-created when they have no values.
    \Drupal::state()->set('entity_test_computed_field_item_list_value', []);
    $entity = EntityTestComputedField::create([]);
    $this->assertCount(0, $entity->computed_string_field);
    // Test \Drupal\Core\Field\FieldItemList::equals() for a computed field.
    \Drupal::state()->set('entity_test_computed_field_item_list_value', [
        'foo computed',
    ]);
    $entity = EntityTestComputedField::create([]);
    $computed_item_list1 = $entity->computed_string_field;
    $entity = EntityTestComputedField::create([]);
    $computed_item_list2 = $entity->computed_string_field;
    $this->assertTrue($computed_item_list1->equals($computed_item_list2));
    $computed_item_list2->value = 'foo computed 2';
    $this->assertFalse($computed_item_list1->equals($computed_item_list2));
}

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