Commit f6ef4aac by Klimov Paul

Unit test for `MigrateController` added

parent ce609218
<?php
namespace yiiunit\framework\console\controllers;
use Yii;
use yii\console\controllers\MigrateController;
use yii\db\Migration;
use yii\db\Query;
use yiiunit\TestCase;
/**
* Unit test for [[\yii\console\controllers\MigrateController]].
* @see MigrateController
*
* @group console
*/
class MigrateControllerTest extends TestCase
{
use MigrateControllerTestTrait;
public function setUp()
{
$this->migrateControllerClass = MigrateController::className();
$this->migrationBaseClass = Migration::className();
$this->mockApplication([
'components' => [
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'sqlite::memory:',
],
],
]);
$this->setUpMigrationPath();
parent::setUp();
}
public function tearDown()
{
$this->tearDownMigrationPath();
parent::tearDown();
}
/**
* @return array applied migration entries
*/
protected function getMigrationHistory()
{
$query = new Query();
return $query->from('migration')->all();
}
}
\ No newline at end of file
<?php
namespace yiiunit\framework\console\controllers;
use Yii;
use yii\console\controllers\BaseMigrateController;
use yii\helpers\FileHelper;
use yiiunit\TestCase;
/**
* This trait provides unit tests shared by the different migration controllers implementations
* @see BaseMigrateController
*/
trait MigrateControllerTestTrait
{
/* @var $this TestCase */
/**
* @var string name of the migration controller class, which is under test.
*/
protected $migrateControllerClass;
/**
* @var string name of the migration base class.
*/
protected $migrationBaseClass;
/**
* @var string test migration path.
*/
protected $migrationPath;
public function setUpMigrationPath()
{
$this->migrationPath = Yii::getAlias('@yiiunit/runtime/test_migrations');
FileHelper::createDirectory($this->migrationPath);
if (!file_exists($this->migrationPath)) {
$this->markTestIncomplete('Unit tests runtime directory should have writable permissions!');
}
}
public function tearDownMigrationPath()
{
FileHelper::removeDirectory($this->migrationPath);
}
/**
* @return array applied migration entries
*/
abstract protected function getMigrationHistory();
/**
* Creates test migrate controller instance.
* @return BaseMigrateController migrate command instance.
*/
protected function createMigrateController()
{
$module = $this->getMock('yii\\base\\Module', ['fake'], ['console']);
$class = $this->migrateControllerClass;
$migrateController = new $class('migrate', $module);
$migrateController->interactive = false;
$migrateController->migrationPath = $this->migrationPath;
return $migrateController;
}
/**
* Emulates running of the migrate controller action.
* @param string $actionId id of action to be run.
* @param array $args action arguments.
* @return string command output.
*/
protected function runMigrateControllerAction($actionId, array $args = [])
{
$controller = $this->createMigrateController();
ob_start();
ob_implicit_flush(false);
$controller->run($actionId, $args);
return ob_get_clean();
}
/**
* @param string $name
* @param string|null $date
* @return string generated class name
*/
protected function createMigration($name, $date = null)
{
if ($date === null) {
$date = gmdate('ymd_His');
}
$class = 'm' . $date . '_' . $name;
$baseClass = $this->migrationBaseClass;
$code = <<<CODE
<?php
class {$class} extends {$baseClass}
{
public function up()
{
}
public function down()
{
}
}
CODE;
file_put_contents($this->migrationPath . DIRECTORY_SEPARATOR . $class . '.php', $code);
return $class;
}
/**
* Checks if applied migration history matches expected one.
* @param array $expectedMigrations migration names in expected order
* @param string $message failure message
*/
protected function assertMigrationHistory(array $expectedMigrations, $message = '')
{
$success = true;
$migrationHistory = $this->getMigrationHistory();
$appliedMigrations = $migrationHistory;
foreach ($expectedMigrations as $expectedMigrationName) {
$appliedMigration = array_shift($appliedMigrations);
if (strpos($appliedMigration['version'], $expectedMigrationName) === false) {
$success = false;
break;
}
}
if (!$success) {
$message .= "\n";
$message .= "Expected: " . var_export($expectedMigrations, true) . "\n";
$actualMigrations = [];
foreach ($migrationHistory as $row) {
$actualMigrations[] = $row['version'];
}
$message .= "Actual: " . var_export($actualMigrations, true) . "\n";
}
$this->assertTrue($success, $message);
}
// Tests :
public function testCreate()
{
$migrationName = 'test_migration';
$this->runMigrateControllerAction('create', [$migrationName]);
$files = FileHelper::findFiles($this->migrationPath);
$this->assertCount(1, $files, 'Unable to create new migration!');
$this->assertContains($migrationName, basename($files[0]), 'Wrong migration name!');
}
public function testUp()
{
$this->createMigration('test1');
$this->createMigration('test2');
$this->runMigrateControllerAction('up');
$this->assertMigrationHistory(['base', 'test1', 'test2']);
}
/**
* @depends testUp
*/
public function testUpCount()
{
$this->createMigration('test1');
$this->createMigration('test2');
$this->runMigrateControllerAction('up', [1]);
$this->assertMigrationHistory(['base', 'test1']);
}
/**
* @depends testUp
*/
public function testDownCount()
{
$this->createMigration('test1');
$this->createMigration('test2');
$this->runMigrateControllerAction('up');
$this->runMigrateControllerAction('down', [1]);
$this->assertMigrationHistory(['base', 'test1']);
}
/**
* @depends testDownCount
*/
public function testDownAll()
{
$this->createMigration('test1');
$this->createMigration('test2');
$this->runMigrateControllerAction('up');
$this->runMigrateControllerAction('down', ['all']);
$this->assertMigrationHistory(['base']);
}
/**
* @depends testUp
*/
public function testHistory()
{
$output = $this->runMigrateControllerAction('history');
$this->assertContains('No migration', $output);
$this->createMigration('test1');
$this->createMigration('test2');
$this->runMigrateControllerAction('up');
$output = $this->runMigrateControllerAction('history');
$this->assertContains('_test1', $output);
$this->assertContains('_test2', $output);
}
/**
* @depends testUp
*/
public function testNew()
{
$this->createMigration('test1');
$output = $this->runMigrateControllerAction('new');
$this->assertContains('_test1', $output);
$this->runMigrateControllerAction('up');
$output = $this->runMigrateControllerAction('new');
$this->assertNotContains('_test1', $output);
}
public function testMark()
{
$version = '010101_000001';
$this->createMigration('test1', $version);
$this->runMigrateControllerAction('mark', [$version]);
$this->assertMigrationHistory(['base', 'test1']);
}
/**
* @depends testUp
*/
public function testRedo()
{
$this->createMigration('test1');
$this->runMigrateControllerAction('up');
$this->runMigrateControllerAction('redo');
$this->assertMigrationHistory(['base', 'test1']);
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment