You are here

public function DbDumpTest::testScriptLoad in Drupal 9

Same name and namespace in other branches
  1. 8 core/tests/Drupal/KernelTests/Core/Command/DbDumpTest.php \Drupal\KernelTests\Core\Command\DbDumpTest::testScriptLoad()

Tests loading the script back into the database.

File

core/tests/Drupal/KernelTests/Core/Command/DbDumpTest.php, line 180

Class

DbDumpTest
Tests for the database dump commands.

Namespace

Drupal\KernelTests\Core\Command

Code

public function testScriptLoad() {

  // Generate the script.
  $application = new DbDumpApplication();
  $command = $application
    ->find('dump-database-d8-mysql');
  $command_tester = new CommandTester($command);
  $command_tester
    ->execute([]);
  $script = $command_tester
    ->getDisplay();

  // Store original schemas and drop tables to avoid errors.
  $connection = Database::getConnection();
  $schema = $connection
    ->schema();
  foreach ($this->tables as $table) {
    $this->originalTableSchemas[$table] = $this
      ->getTableSchema($table);
    $this->originalTableIndexes[$table] = $this
      ->getTableIndexes($table);
    $schema
      ->dropTable($table);
  }

  // This will load the data.
  $file = sys_get_temp_dir() . '/' . $this
    ->randomMachineName();
  file_put_contents($file, $script);
  require_once $file;

  // The tables should now exist and the schemas should match the originals.
  foreach ($this->tables as $table) {
    $this
      ->assertTrue($schema
      ->tableExists($table), new FormattableMarkup('Table @table created by the database script.', [
      '@table' => $table,
    ]));
    $this
      ->assertSame($this->originalTableSchemas[$table], $this
      ->getTableSchema($table), new FormattableMarkup('The schema for @table was properly restored.', [
      '@table' => $table,
    ]));
    $this
      ->assertSame($this->originalTableIndexes[$table], $this
      ->getTableIndexes($table), new FormattableMarkup('The indexes for @table were properly restored.', [
      '@table' => $table,
    ]));
  }

  // Ensure the test config has been replaced.
  $config = unserialize($connection
    ->select('config', 'c')
    ->fields('c', [
    'data',
  ])
    ->condition('name', 'test_config')
    ->execute()
    ->fetchField());
  $this
    ->assertSame($this->data, $config, 'Script has properly restored the config table data.');

  // Ensure the cache data was not exported.
  $this
    ->assertFalse(\Drupal::cache('discovery')
    ->get('test'), 'Cache data was not exported to the script.');
}