You are here

public function DatabaseLegacyTest::testSchemaFieldDefaultChange in Drupal 8

Tests Schema::fieldSetDefault and Schema::fieldSetNoDefault.

@expectedDeprecation fieldSetDefault() is deprecated in drupal:8.7.0 and will be removed before drupal:9.0.0. Instead, call ::changeField() passing a full field specification. See https://www.drupal.org/node/2999035 @expectedDeprecation fieldSetNoDefault() is deprecated in drupal:8.7.0 and will be removed before drupal:9.0.0. Instead, call ::changeField() passing a full field specification. See https://www.drupal.org/node/2999035

File

core/tests/Drupal/KernelTests/Core/Database/DatabaseLegacyTest.php, line 164

Class

DatabaseLegacyTest
Deprecation tests cases for the database layer.

Namespace

Drupal\KernelTests\Core\Database

Code

public function testSchemaFieldDefaultChange() {

  // Create a table.
  $table_specification = [
    'description' => 'Schema table description.',
    'fields' => [
      'id' => [
        'type' => 'int',
        'default' => NULL,
      ],
      'test_field' => [
        'type' => 'int',
        'not null' => TRUE,
        'description' => 'Test field',
      ],
    ],
  ];
  $this->connection
    ->schema()
    ->createTable('test_table', $table_specification);

  // An insert without a value for the column 'test_field' should fail.
  try {
    $this->connection
      ->insert('test_table')
      ->fields([
      'id' => 1,
    ])
      ->execute();
    $this
      ->fail('Expected DatabaseException, none was thrown.');
  } catch (DatabaseException $e) {
    $this
      ->assertEquals(0, $this->connection
      ->select('test_table')
      ->countQuery()
      ->execute()
      ->fetchField());
  }

  // Add a default value to the column.
  $this->connection
    ->schema()
    ->fieldSetDefault('test_table', 'test_field', 0);

  // The insert should now succeed.
  $this->connection
    ->insert('test_table')
    ->fields([
    'id' => 1,
  ])
    ->execute();
  $this
    ->assertEquals(1, $this->connection
    ->select('test_table')
    ->countQuery()
    ->execute()
    ->fetchField());

  // Remove the default.
  $this->connection
    ->schema()
    ->fieldSetNoDefault('test_table', 'test_field');

  // The insert should fail again.
  try {
    $this->connection
      ->insert('test_table')
      ->fields([
      'id' => 2,
    ])
      ->execute();
    $this
      ->fail('Expected DatabaseException, none was thrown.');
  } catch (DatabaseException $e) {
    $this
      ->assertEquals(1, $this->connection
      ->select('test_table')
      ->countQuery()
      ->execute()
      ->fetchField());
  }
}