function FieldSqlStorageTest::testFieldLoad

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

Tests field loading works correctly by inserting directly in the tables.

File

core/tests/Drupal/KernelTests/Core/Entity/FieldSqlStorageTest.php, line 108

Class

FieldSqlStorageTest
Tests Field SQL Storage .

Namespace

Drupal\KernelTests\Core\Entity

Code

public function testFieldLoad() : void {
    $entity_type = $bundle = 'entity_test_rev';
    
    /** @var \Drupal\Core\Entity\RevisionableStorageInterface $storage */
    $storage = $this->container
        ->get('entity_type.manager')
        ->getStorage($entity_type);
    $columns = [
        'bundle',
        'deleted',
        'entity_id',
        'revision_id',
        'delta',
        'langcode',
        $this->tableMapping
            ->getFieldColumnName($this->fieldStorage, 'value'),
    ];
    // Create an entity with four revisions.
    $revision_ids = [];
    $entity = $this->container
        ->get('entity_type.manager')
        ->getStorage($entity_type)
        ->create();
    $entity->save();
    $revision_ids[] = $entity->getRevisionId();
    for ($i = 0; $i < 4; $i++) {
        $entity->setNewRevision();
        $entity->save();
        $revision_ids[] = $entity->getRevisionId();
    }
    // Generate values and insert them directly in the storage tables.
    $values = [];
    $connection = Database::getConnection();
    $query = $connection->insert($this->revisionTable)
        ->fields($columns);
    foreach ($revision_ids as $revision_id) {
        // Put one value too many.
        for ($delta = 0; $delta <= $this->fieldCardinality; $delta++) {
            $value = mt_rand(1, 127);
            $values[$revision_id][] = $value;
            $query->values([
                $bundle,
                0,
                $entity->id(),
                $revision_id,
                $delta,
                $entity->language()
                    ->getId(),
                $value,
            ]);
        }
        $query->execute();
    }
    $query = $connection->insert($this->table)
        ->fields($columns);
    foreach ($values[$revision_id] as $delta => $value) {
        $query->values([
            $bundle,
            0,
            $entity->id(),
            $revision_id,
            $delta,
            $entity->language()
                ->getId(),
            $value,
        ]);
    }
    $query->execute();
    // Load every revision and check the values.
    foreach ($revision_ids as $revision_id) {
        $entity = $storage->loadRevision($revision_id);
        foreach ($values[$revision_id] as $delta => $value) {
            if ($delta < $this->fieldCardinality) {
                $this->assertEquals($value, $entity->{$this->fieldName}[$delta]->value);
            }
            else {
                $this->assertArrayNotHasKey($delta, $entity->{$this->fieldName});
            }
        }
    }
    // Load the "current revision" and check the values.
    $entity = $storage->load($entity->id());
    foreach ($values[$revision_id] as $delta => $value) {
        if ($delta < $this->fieldCardinality) {
            $this->assertEquals($value, $entity->{$this->fieldName}[$delta]->value);
        }
        else {
            $this->assertArrayNotHasKey($delta, $entity->{$this->fieldName});
        }
    }
    // Add a translation in an unavailable language code and verify it is not
    // loaded.
    $unavailable_langcode = 'xx';
    $values = [
        $bundle,
        0,
        $entity->id(),
        $entity->getRevisionId(),
        0,
        $unavailable_langcode,
        mt_rand(1, 127),
    ];
    $connection->insert($this->table)
        ->fields($columns)
        ->values($values)
        ->execute();
    $connection->insert($this->revisionTable)
        ->fields($columns)
        ->values($values)
        ->execute();
    $entity = $storage->load($entity->id());
    $this->assertArrayNotHasKey($unavailable_langcode, $entity->{$this->fieldName});
}

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