function FieldSqlStorageTest::testFieldWrite

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

Tests field saving works correctly by reading directly from the tables.

File

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

Class

FieldSqlStorageTest
Tests Field SQL Storage .

Namespace

Drupal\KernelTests\Core\Entity

Code

public function testFieldWrite() : void {
    $entity_type = $bundle = 'entity_test_rev';
    $entity = $this->container
        ->get('entity_type.manager')
        ->getStorage($entity_type)
        ->create();
    $revision_values = [];
    // Check insert. Add one value too many.
    $values = [];
    for ($delta = 0; $delta <= $this->fieldCardinality; $delta++) {
        $values[$delta]['value'] = mt_rand(1, 127);
    }
    $entity->{$this->fieldName} = $values;
    $entity->save();
    $connection = Database::getConnection();
    // Read the tables and check the correct values have been stored.
    $rows = $connection->select($this->table, 't')
        ->fields('t')
        ->execute()
        ->fetchAllAssoc('delta', \PDO::FETCH_ASSOC);
    $this->assertCount($this->fieldCardinality, $rows);
    foreach ($rows as $delta => $row) {
        $expected = [
            'bundle' => $bundle,
            'deleted' => 0,
            'entity_id' => $entity->id(),
            'revision_id' => $entity->getRevisionId(),
            'langcode' => $entity->language()
                ->getId(),
            'delta' => $delta,
            $this->fieldName . '_value' => $values[$delta]['value'],
        ];
        $this->assertEquals($expected, $row, "Row {$delta} was stored as expected.");
    }
    // Test update. Add less values and check that the previous values did not
    // persist.
    $values = [];
    for ($delta = 0; $delta <= $this->fieldCardinality - 2; $delta++) {
        $values[$delta]['value'] = mt_rand(1, 127);
    }
    $values_count = count($values);
    $entity->{$this->fieldName} = $values;
    $entity->save();
    $rows = $connection->select($this->table, 't')
        ->fields('t')
        ->execute()
        ->fetchAllAssoc('delta', \PDO::FETCH_ASSOC);
    $this->assertCount($values_count, $rows);
    foreach ($rows as $delta => $row) {
        $expected = [
            'bundle' => $bundle,
            'deleted' => 0,
            'entity_id' => $entity->id(),
            'revision_id' => $entity->getRevisionId(),
            'langcode' => $entity->language()
                ->getId(),
            'delta' => $delta,
            $this->fieldName . '_value' => $values[$delta]['value'],
        ];
        $this->assertEquals($expected, $row, "Row {$delta} was stored as expected.");
    }
    // Create a new revision.
    $revision_values[$entity->getRevisionId()] = $values;
    $values = [];
    for ($delta = 0; $delta < $this->fieldCardinality; $delta++) {
        $values[$delta]['value'] = mt_rand(1, 127);
    }
    $entity->{$this->fieldName} = $values;
    $entity->setNewRevision();
    $entity->save();
    $revision_values[$entity->getRevisionId()] = $values;
    // Check that data for both revisions are in the revision table.
    foreach ($revision_values as $revision_id => $values) {
        $rows = $connection->select($this->revisionTable, 't')
            ->fields('t')
            ->condition('revision_id', $revision_id)
            ->execute()
            ->fetchAllAssoc('delta', \PDO::FETCH_ASSOC);
        $this->assertCount(min(count($values), $this->fieldCardinality), $rows);
        foreach ($rows as $delta => $row) {
            $expected = [
                'bundle' => $bundle,
                'deleted' => 0,
                'entity_id' => $entity->id(),
                'revision_id' => $revision_id,
                'langcode' => $entity->language()
                    ->getId(),
                'delta' => $delta,
                $this->fieldName . '_value' => $values[$delta]['value'],
            ];
            $this->assertEquals($expected, $row, "Row {$delta} was stored as expected.");
        }
    }
    // Test emptying the field.
    $entity->{$this->fieldName} = NULL;
    $entity->save();
    $rows = $connection->select($this->table, 't')
        ->fields('t')
        ->execute()
        ->fetchAllAssoc('delta', \PDO::FETCH_ASSOC);
    $this->assertCount(0, $rows);
}

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