function FieldSqlStorageTest::testFieldWrite

Same name and namespace 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. 11.x 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 184

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.