__DIR__]); $app->useDatabasePath(__DIR__); $command->setLaravel($app); $migrator->shouldReceive('paths')->once()->andReturn([]); $migrator->shouldReceive('hasRunAnyMigrations')->andReturn(true); $migrator->shouldReceive('usingConnection')->once()->andReturnUsing(function ($name, $callback) { return $callback(); }); $migrator->shouldReceive('setOutput')->once()->andReturn($migrator); $migrator->shouldReceive('run')->once()->with([__DIR__.DIRECTORY_SEPARATOR.'migrations'], ['pretend' => false, 'step' => false]); $migrator->shouldReceive('getNotes')->andReturn([]); $migrator->shouldReceive('repositoryExists')->once()->andReturn(true); $this->runCommand($command); } public function testMigrationsCanBeRunWithStoredSchema() { $command = new MigrateCommand($migrator = m::mock(Migrator::class), $dispatcher = m::mock(Dispatcher::class)); $app = new ApplicationDatabaseMigrationStub(['path.database' => __DIR__]); $app->useDatabasePath(__DIR__); $command->setLaravel($app); $migrator->shouldReceive('paths')->once()->andReturn([]); $migrator->shouldReceive('hasRunAnyMigrations')->andReturn(false); $migrator->shouldReceive('resolveConnection')->andReturn($connection = m::mock(stdClass::class)); $connection->shouldReceive('getName')->andReturn('mysql'); $migrator->shouldReceive('usingConnection')->once()->andReturnUsing(function ($name, $callback) { return $callback(); }); $migrator->shouldReceive('deleteRepository')->once(); $connection->shouldReceive('getSchemaState')->andReturn($schemaState = m::mock(stdClass::class)); $schemaState->shouldReceive('handleOutputUsing')->andReturnSelf(); $schemaState->shouldReceive('load')->once()->with(__DIR__.'/stubs/schema.sql'); $dispatcher->shouldReceive('dispatch')->once()->with(m::type(SchemaLoaded::class)); $migrator->shouldReceive('setOutput')->once()->andReturn($migrator); $migrator->shouldReceive('run')->once()->with([__DIR__.DIRECTORY_SEPARATOR.'migrations'], ['pretend' => false, 'step' => false]); $migrator->shouldReceive('getNotes')->andReturn([]); $migrator->shouldReceive('repositoryExists')->once()->andReturn(true); $this->runCommand($command, ['--schema-path' => __DIR__.'/stubs/schema.sql']); } public function testMigrationRepositoryCreatedWhenNecessary() { $params = [$migrator = m::mock(Migrator::class), $dispatcher = m::mock(Dispatcher::class)]; $command = $this->getMockBuilder(MigrateCommand::class)->onlyMethods(['call'])->setConstructorArgs($params)->getMock(); $app = new ApplicationDatabaseMigrationStub(['path.database' => __DIR__]); $app->useDatabasePath(__DIR__); $command->setLaravel($app); $migrator->shouldReceive('paths')->once()->andReturn([]); $migrator->shouldReceive('hasRunAnyMigrations')->andReturn(true); $migrator->shouldReceive('usingConnection')->once()->andReturnUsing(function ($name, $callback) { return $callback(); }); $migrator->shouldReceive('setOutput')->once()->andReturn($migrator); $migrator->shouldReceive('run')->once()->with([__DIR__.DIRECTORY_SEPARATOR.'migrations'], ['pretend' => false, 'step' => false]); $migrator->shouldReceive('repositoryExists')->once()->andReturn(false); $command->expects($this->once())->method('call')->with($this->equalTo('migrate:install'), $this->equalTo([])); $this->runCommand($command); } public function testTheCommandMayBePretended() { $command = new MigrateCommand($migrator = m::mock(Migrator::class), $dispatcher = m::mock(Dispatcher::class)); $app = new ApplicationDatabaseMigrationStub(['path.database' => __DIR__]); $app->useDatabasePath(__DIR__); $command->setLaravel($app); $migrator->shouldReceive('paths')->once()->andReturn([]); $migrator->shouldReceive('hasRunAnyMigrations')->andReturn(true); $migrator->shouldReceive('usingConnection')->once()->andReturnUsing(function ($name, $callback) { return $callback(); }); $migrator->shouldReceive('setOutput')->once()->andReturn($migrator); $migrator->shouldReceive('run')->once()->with([__DIR__.DIRECTORY_SEPARATOR.'migrations'], ['pretend' => true, 'step' => false]); $migrator->shouldReceive('repositoryExists')->once()->andReturn(true); $this->runCommand($command, ['--pretend' => true]); } public function testTheDatabaseMayBeSet() { $command = new MigrateCommand($migrator = m::mock(Migrator::class), $dispatcher = m::mock(Dispatcher::class)); $app = new ApplicationDatabaseMigrationStub(['path.database' => __DIR__]); $app->useDatabasePath(__DIR__); $command->setLaravel($app); $migrator->shouldReceive('paths')->once()->andReturn([]); $migrator->shouldReceive('hasRunAnyMigrations')->andReturn(true); $migrator->shouldReceive('usingConnection')->once()->andReturnUsing(function ($name, $callback) { return $callback(); }); $migrator->shouldReceive('setOutput')->once()->andReturn($migrator); $migrator->shouldReceive('run')->once()->with([__DIR__.DIRECTORY_SEPARATOR.'migrations'], ['pretend' => false, 'step' => false]); $migrator->shouldReceive('repositoryExists')->once()->andReturn(true); $this->runCommand($command, ['--database' => 'foo']); } public function testStepMayBeSet() { $command = new MigrateCommand($migrator = m::mock(Migrator::class), $dispatcher = m::mock(Dispatcher::class)); $app = new ApplicationDatabaseMigrationStub(['path.database' => __DIR__]); $app->useDatabasePath(__DIR__); $command->setLaravel($app); $migrator->shouldReceive('paths')->once()->andReturn([]); $migrator->shouldReceive('hasRunAnyMigrations')->andReturn(true); $migrator->shouldReceive('usingConnection')->once()->andReturnUsing(function ($name, $callback) { return $callback(); }); $migrator->shouldReceive('setOutput')->once()->andReturn($migrator); $migrator->shouldReceive('run')->once()->with([__DIR__.DIRECTORY_SEPARATOR.'migrations'], ['pretend' => false, 'step' => true]); $migrator->shouldReceive('repositoryExists')->once()->andReturn(true); $this->runCommand($command, ['--step' => true]); } protected function runCommand($command, $input = []) { return $command->run(new ArrayInput($input), new NullOutput); } } class ApplicationDatabaseMigrationStub extends Application { public function __construct(array $data = []) { foreach ($data as $abstract => $instance) { $this->instance($abstract, $instance); } } public function environment(...$environments) { return 'development'; } }