Skip to content

Commit

Permalink
Load schema to in memory database (#45375)
Browse files Browse the repository at this point in the history
* add SqliteSchemaState test

* load schema to in-memory database

* check sqlite3 command

* spy closure
  • Loading branch information
recca0120 committed Dec 21, 2022
1 parent 2af2b3c commit 876356c
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/Illuminate/Database/Schema/SqliteSchemaState.php
Expand Up @@ -61,6 +61,12 @@ protected function appendMigrationData(string $path)
*/
public function load($path)
{
if ($this->connection->getDatabaseName() === ':memory:') {
$this->connection->getPdo()->exec($this->files->get($path));

return;
}

$process = $this->makeProcess($this->baseCommand().' < "${:LARAVEL_LOAD_PATH}"');

$process->mustRun(null, array_merge($this->baseVariables($this->connection->getConfig()), [
Expand Down
60 changes: 60 additions & 0 deletions tests/Database/DatabaseSqliteSchemaStateTest.php
@@ -0,0 +1,60 @@
<?php

namespace Illuminate\Tests\Database;

use Illuminate\Database\Schema\SqliteSchemaState;
use Illuminate\Database\SQLiteConnection;
use Illuminate\Filesystem\Filesystem;
use Mockery as m;
use PDO;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Process\Process;

class DatabaseSqliteSchemaStateTest extends TestCase
{
protected function tearDown(): void
{
parent::tearDown();
m::close();
}

public function testLoadSchemaToDatabase(): void
{
$config = ['driver' => 'sqlite', 'database' => 'database/database.sqlite', 'prefix' => '', 'foreign_key_constraints' => true, 'name' => 'sqlite'];
$connection = m::mock(SQLiteConnection::class);
$connection->shouldReceive('getConfig')->andReturn($config);
$connection->shouldReceive('getDatabaseName')->andReturn($config['database']);

$process = m::spy(Process::class);
$processFactory = m::spy(function () use ($process) {
return $process;
});

$schemaState = new SqliteSchemaState($connection, null, $processFactory);
$schemaState->load('database/schema/sqlite-schema.dump');

$processFactory->shouldHaveBeenCalled()->with('sqlite3 "${:LARAVEL_LOAD_DATABASE}" < "${:LARAVEL_LOAD_PATH}"');

$process->shouldHaveReceived('mustRun')->with(null, [
'LARAVEL_LOAD_DATABASE' => 'database/database.sqlite',
'LARAVEL_LOAD_PATH' => 'database/schema/sqlite-schema.dump',
]);
}

public function testLoadSchemaToInMemory(): void
{
$config = ['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', 'foreign_key_constraints' => true, 'name' => 'sqlite'];
$connection = m::mock(SQLiteConnection::class);
$connection->shouldReceive('getConfig')->andReturn($config);
$connection->shouldReceive('getDatabaseName')->andReturn($config['database']);
$connection->shouldReceive('getPdo')->andReturn($pdo = m::spy(PDO::class));

$files = m::mock(Filesystem::class);
$files->shouldReceive('get')->andReturn('CREATE TABLE IF NOT EXISTS "migrations" ("id" integer not null primary key autoincrement, "migration" varchar not null, "batch" integer not null);');

$schemaState = new SqliteSchemaState($connection, $files);
$schemaState->load('database/schema/sqlite-schema.dump');

$pdo->shouldHaveReceived('exec')->with('CREATE TABLE IF NOT EXISTS "migrations" ("id" integer not null primary key autoincrement, "migration" varchar not null, "batch" integer not null);');
}
}

0 comments on commit 876356c

Please sign in to comment.