diff options
author | Igor Scheller <igor.scheller@igorshp.de> | 2018-01-16 21:26:59 +0100 |
---|---|---|
committer | Igor Scheller <igor.scheller@igorshp.de> | 2018-01-16 21:47:21 +0100 |
commit | 235266ec53f620d94a080ed7ae8e77eaef6dbb3c (patch) | |
tree | a252b862443a3551e761e09338e9bce3ce99c394 /tests/Unit/Database/Migration | |
parent | e44ba8456130fcd0a282ea91b5736d903f8c0496 (diff) |
Added basic database migration functionality
Diffstat (limited to 'tests/Unit/Database/Migration')
6 files changed, 310 insertions, 0 deletions
diff --git a/tests/Unit/Database/Migration/MigrateTest.php b/tests/Unit/Database/Migration/MigrateTest.php new file mode 100644 index 00000000..c88ad777 --- /dev/null +++ b/tests/Unit/Database/Migration/MigrateTest.php @@ -0,0 +1,160 @@ +<?php + +namespace Engelsystem\Test\Unit\Database; + +use Engelsystem\Application; +use Engelsystem\Database\Migration\Migrate; +use Illuminate\Database\Capsule\Manager as CapsuleManager; +use Illuminate\Database\Schema\Builder as SchemaBuilder; +use Illuminate\Support\Collection; +use Illuminate\Support\Str; +use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\TestCase; + +class MigrateTest extends TestCase +{ + /** + * @covers \Engelsystem\Database\Migration\Migrate::__construct + * @covers \Engelsystem\Database\Migration\Migrate::run + * @covers \Engelsystem\Database\Migration\Migrate::getMigrations + * @covers \Engelsystem\Database\Migration\Migrate::setOutput + */ + public function testRun() + { + /** @var MockObject|Application $app */ + $app = $this->getMockBuilder(Application::class) + ->setMethods(['instance']) + ->getMock(); + /** @var MockObject|SchemaBuilder $builder */ + $builder = $this->getMockBuilder(SchemaBuilder::class) + ->disableOriginalConstructor() + ->getMock(); + /** @var MockObject|Migrate $migration */ + $migration = $this->getMockBuilder(Migrate::class) + ->setConstructorArgs([$builder, $app]) + ->setMethods(['initMigration', 'getMigrationFiles', 'getMigrated', 'migrate', 'setMigrated']) + ->getMock(); + + $migration->expects($this->atLeastOnce()) + ->method('initMigration'); + $migration->expects($this->atLeastOnce()) + ->method('getMigrationFiles') + ->willReturn([ + 'foo/1234_01_23_123456_init_foo.php', + 'foo/9876_03_22_210000_random_hack.php', + 'foo/4567_11_01_000000_do_stuff.php', + 'foo/9999_99_99_999999_another_foo.php', + ]); + $migration->expects($this->atLeastOnce()) + ->method('getMigrated') + ->willReturn(new Collection([ + ['id' => 1, 'migration' => '1234_01_23_123456_init_foo'], + ['id' => 2, 'migration' => '4567_11_01_000000_do_stuff'], + ])); + $migration->expects($this->atLeastOnce()) + ->method('migrate') + ->withConsecutive( + ['foo/9876_03_22_210000_random_hack.php', '9876_03_22_210000_random_hack', Migrate::UP], + ['foo/9999_99_99_999999_another_foo.php', '9999_99_99_999999_another_foo', Migrate::UP], + ['foo/9876_03_22_210000_random_hack.php', '9876_03_22_210000_random_hack', Migrate::UP], + ['foo/4567_11_01_000000_do_stuff.php', '4567_11_01_000000_do_stuff', Migrate::DOWN] + ); + $migration->expects($this->atLeastOnce()) + ->method('setMigrated') + ->withConsecutive( + ['9876_03_22_210000_random_hack', Migrate::UP], + ['9999_99_99_999999_another_foo', Migrate::UP], + ['9876_03_22_210000_random_hack', Migrate::UP], + ['4567_11_01_000000_do_stuff', Migrate::DOWN] + ); + + $messages = []; + $migration->setOutput(function ($text) use (&$messages) { + $messages[] = $text; + }); + + $migration->run('foo', Migrate::UP); + + $this->assertCount(4, $messages); + foreach ( + [ + 'init_foo' => 'skipping', + 'do_stuff' => 'skipping', + 'random_hack' => 'migrating', + 'another_foo' => 'migrating', + ] as $value => $type + ) { + $contains = false; + foreach ($messages as $message) { + if (!Str::contains(strtolower($message), $type) || !Str::contains(strtolower($message), $value)) { + continue; + } + + $contains = true; + break; + } + + $this->assertTrue($contains, sprintf('Missing message "%s: %s"', $type, $value)); + } + + $messages = []; + $migration->run('foo', Migrate::UP, true); + $this->assertCount(3, $messages); + + $migration->run('foo', Migrate::DOWN, true); + } + + /** + * @covers \Engelsystem\Database\Migration\Migrate::getMigrated + * @covers \Engelsystem\Database\Migration\Migrate::migrate + * @covers \Engelsystem\Database\Migration\Migrate::setMigrated + * @covers \Engelsystem\Database\Migration\Migrate::getMigrationFiles + * @covers \Engelsystem\Database\Migration\Migrate::initMigration + * @covers \Engelsystem\Database\Migration\Migrate::getTableQuery + */ + public function testRunIntegration() + { + $app = new Application(); + $dbManager = new CapsuleManager($app); + $dbManager->addConnection(['driver' => 'sqlite', 'database' => ':memory:']); + $dbManager->bootEloquent(); + $db = $dbManager->getConnection(); + $db->useDefaultSchemaGrammar(); + $scheme = $db->getSchemaBuilder(); + + $app->instance('scheme', $scheme); + $app->bind(SchemaBuilder::class, 'scheme'); + + $migration = new Migrate($scheme, $app); + + $messages = []; + $migration->setOutput(function ($msg) use (&$messages) { + $messages[] = $msg; + }); + + $migration->run(__DIR__ . '/Stub', Migrate::UP); + + $this->assertTrue($scheme->hasTable('migrations')); + + $migrations = $db->table('migrations')->get(); + $this->assertCount(3, $migrations); + + $this->assertTrue($migrations->contains('migration', '2001_04_11_123456_create_lorem_ipsum_table')); + $this->assertTrue($migrations->contains('migration', '2017_12_24_053300_another_stuff')); + $this->assertTrue($migrations->contains('migration', '2022_12_22_221222_add_some_feature')); + + $this->assertTrue($scheme->hasTable('lorem_ipsum')); + + $migration->run(__DIR__ . '/Stub', Migrate::DOWN, true); + + $migrations = $db->table('migrations')->get(); + $this->assertCount(2, $migrations); + + $migration->run(__DIR__ . '/Stub', Migrate::DOWN); + + $migrations = $db->table('migrations')->get(); + $this->assertCount(0, $migrations); + + $this->assertFalse($scheme->hasTable('lorem_ipsum')); + } +} diff --git a/tests/Unit/Database/Migration/MigrationServiceProviderTest.php b/tests/Unit/Database/Migration/MigrationServiceProviderTest.php new file mode 100644 index 00000000..a99cdebe --- /dev/null +++ b/tests/Unit/Database/Migration/MigrationServiceProviderTest.php @@ -0,0 +1,55 @@ +<?php + +namespace Engelsystem\Test\Unit\Database\Migration; + +use Engelsystem\Database\Db; +use Engelsystem\Database\Migration\Migrate; +use Engelsystem\Database\Migration\MigrationServiceProvider; +use Engelsystem\Test\Unit\ServiceProviderTest; +use Illuminate\Database\Capsule\Manager as CapsuleManager; +use Illuminate\Database\Connection; +use Illuminate\Database\Schema\Builder as SchemaBuilder; +use PHPUnit_Framework_MockObject_MockObject as MockObject; + +class MigrationServiceProviderTest extends ServiceProviderTest +{ + /** + * @covers \Engelsystem\Database\Migration\MigrationServiceProvider::register() + */ + public function testRegister() + { + /** @var MockObject|Migrate $migration */ + $migration = $this->getMockBuilder(Migrate::class) + ->disableOriginalConstructor() + ->getMock(); + /** @var MockObject|CapsuleManager $dbManager */ + $dbManager = $this->getMockBuilder(CapsuleManager::class) + ->disableOriginalConstructor() + ->getMock(); + /** @var MockObject|Connection $dbConnection */ + $dbConnection = $this->getMockBuilder(Connection::class) + ->disableOriginalConstructor() + ->getMock(); + /** @var MockObject|SchemaBuilder $schemaBuilder */ + $schemaBuilder = $this->getMockBuilder(SchemaBuilder::class) + ->disableOriginalConstructor() + ->getMock(); + + $app = $this->getApp(['make', 'instance', 'bind']); + + $app->expects($this->atLeastOnce()) + ->method('instance') + ->withConsecutive(['db.scheme'], ['db.migration']) + ->willReturnOnConsecutiveCalls($schemaBuilder, $migration); + + $this->setExpects($app, 'bind', [SchemaBuilder::class, 'db.scheme']); + $this->setExpects($app, 'make', [Migrate::class], $migration); + + $this->setExpects($dbConnection, 'getSchemaBuilder', null, $schemaBuilder); + $this->setExpects($dbManager, 'getConnection', null, $dbConnection); + Db::setDbManager($dbManager); + + $serviceProvider = new MigrationServiceProvider($app); + $serviceProvider->register(); + } +} diff --git a/tests/Unit/Database/Migration/MigrationTest.php b/tests/Unit/Database/Migration/MigrationTest.php new file mode 100644 index 00000000..43bded09 --- /dev/null +++ b/tests/Unit/Database/Migration/MigrationTest.php @@ -0,0 +1,24 @@ +<?php + +namespace Engelsystem\Test\Unit\Database; + +use AnotherStuff; +use Illuminate\Database\Schema\Builder as SchemaBuilder; +use PHPUnit\Framework\MockObject\MockBuilder; +use PHPUnit\Framework\TestCase; + +class MigrationTest extends TestCase +{ + public function testConstructor() + { + require_once __DIR__ . '/Stub/2017_12_24_053300_another_stuff.php'; + + /** @var MockBuilder|SchemaBuilder $schemaBuilder */ + $schemaBuilder = $this->getMockBuilder(SchemaBuilder::class) + ->disableOriginalConstructor() + ->getMock(); + + $instance = new AnotherStuff($schemaBuilder); + $this->assertAttributeEquals($schemaBuilder, 'schema', $instance); + } +} diff --git a/tests/Unit/Database/Migration/Stub/2001_04_11_123456_create_lorem_ipsum_table.php b/tests/Unit/Database/Migration/Stub/2001_04_11_123456_create_lorem_ipsum_table.php new file mode 100644 index 00000000..0cc89e07 --- /dev/null +++ b/tests/Unit/Database/Migration/Stub/2001_04_11_123456_create_lorem_ipsum_table.php @@ -0,0 +1,27 @@ +<?php + +use Engelsystem\Database\Migration\Migration; +use Illuminate\Database\Schema\Blueprint; + +class CreateLoremIpsumTable extends Migration +{ + /** + * Run the migration + */ + public function up() + { + $this->schema->create('lorem_ipsum', function (Blueprint $table) { + $table->increments('id'); + $table->string('name')->unique(); + $table->string('email'); + }); + } + + /** + * Reverse the migration + */ + public function down() + { + $this->schema->dropIfExists('lorem_ipsum'); + } +} diff --git a/tests/Unit/Database/Migration/Stub/2017_12_24_053300_another_stuff.php b/tests/Unit/Database/Migration/Stub/2017_12_24_053300_another_stuff.php new file mode 100644 index 00000000..d4d7e5f8 --- /dev/null +++ b/tests/Unit/Database/Migration/Stub/2017_12_24_053300_another_stuff.php @@ -0,0 +1,22 @@ +<?php + +use Engelsystem\Database\Migration\Migration; + +class AnotherStuff extends Migration +{ + /** + * Run the migration + */ + public function up() + { + // nope + } + + /** + * Reverse the migration + */ + public function down() + { + // nope + } +} diff --git a/tests/Unit/Database/Migration/Stub/2022_12_22_221222_add_some_feature.php b/tests/Unit/Database/Migration/Stub/2022_12_22_221222_add_some_feature.php new file mode 100644 index 00000000..cf2762de --- /dev/null +++ b/tests/Unit/Database/Migration/Stub/2022_12_22_221222_add_some_feature.php @@ -0,0 +1,22 @@ +<?php + +use Engelsystem\Database\Migration\Migration; + +class AddSomeFeature extends Migration +{ + /** + * Run the migration + */ + public function up() + { + // nope + } + + /** + * Reverse the migration + */ + public function down() + { + // nope + } +} |