Commit 905e39ed by Alexander Makarov

RBAC migration is now aware of custom table names, speeded up RBAC tests

parent 12732cfa
<?php
use yii\base\InvalidConfigException;
use yii\db\Schema;
use yii\rbac\DbManager;
class m140506_102106_rbac_init extends \yii\db\Migration
{
/**
* @throws yii\base\InvalidConfigException
* @return DbManager
*/
protected function getAuthManager()
{
$authManager = Yii::$app->getAuthManager();
if (!$authManager instanceof DbManager) {
throw new InvalidConfigException('You should configure "authManager" component to use database before executing this migration.');
}
return $authManager;
}
public function up()
{
$authManager = $this->getAuthManager();
$tableOptions = null;
if ($this->db->driverName === 'mysql') {
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB';
}
$this->createTable('{{%auth_rule}}', [
$this->createTable($authManager->ruleTable, [
'name' => Schema::TYPE_STRING . '(64) NOT NULL',
'data' => Schema::TYPE_TEXT,
'created_at' => Schema::TYPE_INTEGER,
'updated_at' => Schema::TYPE_INTEGER,
], $tableOptions);
$this->addPrimaryKey('pk-auth_rule', '{{%auth_rule}}', 'name');
$this->addPrimaryKey('pk-auth_rule', $authManager->ruleTable, 'name');
$this->createTable('{{%auth_item}}', [
$this->createTable($authManager->itemTable, [
'name' => Schema::TYPE_STRING . '(64) NOT NULL',
'type' => Schema::TYPE_INTEGER . ' NOT NULL',
'description' => Schema::TYPE_TEXT,
......@@ -28,32 +45,34 @@ class m140506_102106_rbac_init extends \yii\db\Migration
'created_at' => Schema::TYPE_INTEGER,
'updated_at' => Schema::TYPE_INTEGER,
], $tableOptions);
$this->addPrimaryKey('pk-auth_item', '{{%auth_item}}', 'name');
$this->addForeignKey('fk-auth_item-rule_name', '{{%auth_item}}', 'rule_name', '{{%auth_rule}}', 'name', 'SET NULL', 'CASCADE');
$this->createIndex('idx-auth_item-type', '{{%auth_item}}', 'type');
$this->addPrimaryKey('pk-auth_item', $authManager->itemTable, 'name');
$this->addForeignKey('fk-auth_item-rule_name', $authManager->itemTable, 'rule_name', $authManager->ruleTable, 'name', 'SET NULL', 'CASCADE');
$this->createIndex('idx-auth_item-type', $authManager->itemTable, 'type');
$this->createTable('{{%auth_item_child}}', [
$this->createTable($authManager->itemChildTable, [
'parent' => Schema::TYPE_STRING . '(64) NOT NULL',
'child' => Schema::TYPE_STRING . '(64) NOT NULL',
], $tableOptions);
$this->addPrimaryKey('pk-auth_item_child', '{{%auth_item_child}}', ['parent', 'child']);
$this->addForeignKey('fk-auth_item_child-parent', '{{%auth_item_child}}', 'parent', '{{%auth_item}}', 'name', 'CASCADE', 'CASCADE');
$this->addForeignKey('fk-auth_item_child-child', '{{%auth_item_child}}', 'child', '{{%auth_item}}', 'name', 'CASCADE', 'CASCADE');
$this->addPrimaryKey('pk-auth_item_child', $authManager->itemChildTable, ['parent', 'child']);
$this->addForeignKey('fk-auth_item_child-parent', $authManager->itemChildTable, 'parent', $authManager->itemTable, 'name', 'CASCADE', 'CASCADE');
$this->addForeignKey('fk-auth_item_child-child', $authManager->itemChildTable, 'child', $authManager->itemTable, 'name', 'CASCADE', 'CASCADE');
$this->createTable('{{%auth_assignment}}', [
$this->createTable($authManager->assignmentTable, [
'item_name' => Schema::TYPE_STRING . '(64) NOT NULL',
'user_id' => Schema::TYPE_STRING . '(64) NOT NULL',
'created_at' => Schema::TYPE_INTEGER,
], $tableOptions);
$this->addPrimaryKey('pk-auth_assignment', '{{%auth_assignment}}', ['item_name', 'user_id']);
$this->addForeignKey('fk-auth_assignment-item_name', '{{%auth_assignment}}', 'item_name', '{{%auth_item}}', 'name', 'CASCADE', 'CASCADE');
$this->addPrimaryKey('pk-auth_assignment', $authManager->assignmentTable, ['item_name', 'user_id']);
$this->addForeignKey('fk-auth_assignment-item_name', $authManager->assignmentTable, 'item_name', $authManager->itemTable, 'name', 'CASCADE', 'CASCADE');
}
public function down()
{
$this->dropTable('{{%auth_assignment}}');
$this->dropTable('{{%auth_item_child}}');
$this->dropTable('{{%auth_item}}');
$this->dropTable('{{%auth_rule}}');
$authManager = $this->getAuthManager();
$this->dropTable($authManager->assignmentTable);
$this->dropTable($authManager->itemChildTable);
$this->dropTable($authManager->itemTable);
$this->dropTable($authManager->ruleTable);
}
}
......@@ -27,7 +27,7 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase
* @param mixed $default default value to use when param is not set.
* @return mixed the value of the configuration param
*/
public function getParam($name, $default = null)
public static function getParam($name, $default = null)
{
if (static::$params === null) {
static::$params = require(__DIR__ . '/data/config.php');
......
......@@ -17,7 +17,7 @@ class ElasticSearchTestCase extends TestCase
{
$this->mockApplication();
$databases = $this->getParam('databases');
$databases = self::getParam('databases');
$params = isset($databases['elasticsearch']) ? $databases['elasticsearch'] : null;
if ($params === null || !isset($params['dsn'])) {
$this->markTestSkipped('No elasticsearch server connection configured.');
......@@ -40,7 +40,7 @@ class ElasticSearchTestCase extends TestCase
*/
public function getConnection($reset = true)
{
$databases = $this->getParam('databases');
$databases = self::getParam('databases');
$params = isset($databases['elasticsearch']) ? $databases['elasticsearch'] : [];
$db = new Connection();
if ($reset) {
......
......@@ -34,7 +34,7 @@ class MongoDbTestCase extends TestCase
if (!extension_loaded('mongo')) {
$this->markTestSkipped('mongo extension required.');
}
$config = $this->getParam('mongodb');
$config = self::getParam('mongodb');
if (!empty($config)) {
$this->mongoDbConfig = $config;
}
......
......@@ -22,7 +22,7 @@ class RedisCacheTest extends CacheTestCase
*/
protected function getCacheInstance()
{
$databases = $this->getParam('databases');
$databases = self::getParam('databases');
$params = isset($databases['redis']) ? $databases['redis'] : null;
if ($params === null) {
$this->markTestSkipped('No redis server connection configured.');
......
......@@ -15,7 +15,7 @@ abstract class RedisTestCase extends TestCase
{
protected function setUp()
{
$databases = $this->getParam('databases');
$databases = self::getParam('databases');
$params = isset($databases['redis']) ? $databases['redis'] : null;
if ($params === null) {
$this->markTestSkipped('No redis server connection configured.');
......@@ -36,7 +36,7 @@ abstract class RedisTestCase extends TestCase
*/
public function getConnection($reset = true)
{
$databases = $this->getParam('databases');
$databases = self::getParam('databases');
$params = isset($databases['redis']) ? $databases['redis'] : [];
$db = new Connection($params);
if ($reset) {
......
......@@ -48,7 +48,7 @@ class SphinxTestCase extends TestCase
if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) {
$this->markTestSkipped('pdo and pdo_mysql extension are required.');
}
$config = $this->getParam('sphinx');
$config = self::getParam('sphinx');
if (!empty($config)) {
$this->sphinxConfig = $config['sphinx'];
$this->dbConfig = $config['db'];
......
......@@ -40,7 +40,7 @@ class DbCacheTest extends CacheTestCase
public function getConnection($reset = true)
{
if ($this->_connection === null) {
$databases = $this->getParam('databases');
$databases = self::getParam('databases');
$params = $databases['mysql'];
$db = new \yii\db\Connection;
$db->dsn = $params['dsn'];
......
......@@ -16,7 +16,7 @@ abstract class DatabaseTestCase extends TestCase
protected function setUp()
{
parent::setUp();
$databases = $this->getParam('databases');
$databases = self::getParam('databases');
$this->database = $databases[$this->driverName];
$pdo_database = 'pdo_'.$this->driverName;
......
......@@ -11,21 +11,25 @@ use yii\rbac\DbManager;
*/
abstract class DbManagerTestCase extends ManagerTestCase
{
protected $database;
protected $driverName = 'mysql';
protected static $database;
protected static $driverName = 'mysql';
/**
* @var Connection
*/
protected $db;
protected static $db;
protected function getMigrator()
/**
* @return MigrateController
*/
protected static function getMigrator()
{
$app = new Application([
'id' => 'Migrator',
'basePath' => '@yiiunit',
'components' => [
'db' => $this->getConnection(),
'db' => static::getConnection(),
'authManager' => '\yii\rbac\DbManager',
],
]);
......@@ -35,29 +39,41 @@ abstract class DbManagerTestCase extends ManagerTestCase
return $migrator;
}
protected function setUp()
public static function setUpBeforeClass()
{
parent::setUp();
$databases = $this->getParam('databases');
$this->database = $databases[$this->driverName];
$pdo_database = 'pdo_'.$this->driverName;
parent::setUpBeforeClass();
$databases = static::getParam('databases');
static::$database = $databases[static::$driverName];
$pdo_database = 'pdo_' . static::$driverName;
if (!extension_loaded('pdo') || !extension_loaded($pdo_database)) {
$this->markTestSkipped('pdo and '.$pdo_database.' extension are required.');
static::markTestSkipped('pdo and ' . $pdo_database . ' extension are required.');
}
static::getMigrator()->run('up');
}
public static function tearDownAfterClass()
{
static::getMigrator()->run('down');
if (static::$db) {
static::$db->close();
}
\Yii::$app = null;
parent::tearDownAfterClass();
}
protected function setUp()
{
parent::setUp();
$this->auth = new DbManager(['db' => $this->getConnection()]);
$this->getMigrator()->run('up');
}
protected function tearDown()
{
parent::tearDown();
$this->getMigrator()->run('down');
if ($this->db) {
$this->db->close();
}
$this->destroyApplication();
$this->auth->removeAll();
}
/**
......@@ -68,24 +84,24 @@ abstract class DbManagerTestCase extends ManagerTestCase
* @throws \yii\base\InvalidConfigException
* @return \yii\db\Connection
*/
public function getConnection($reset = true, $open = true)
public static function getConnection($reset = true, $open = true)
{
if (!$reset && $this->db) {
return $this->db;
if (!$reset && static::$db) {
return static::$db;
}
$db = new Connection;
$db->dsn = $this->database['dsn'];
if (isset($this->database['username'])) {
$db->username = $this->database['username'];
$db->password = $this->database['password'];
$db->dsn = static::$database['dsn'];
if (isset(static::$database['username'])) {
$db->username = static::$database['username'];
$db->password = static::$database['password'];
}
if (isset($this->database['attributes'])) {
$db->attributes = $this->database['attributes'];
if (isset(static::$database['attributes'])) {
$db->attributes = static::$database['attributes'];
}
if ($open) {
$db->open();
}
$this->db = $db;
static::$db = $db;
return $db;
}
......
......@@ -6,5 +6,5 @@ namespace yiiunit\framework\rbac;
*/
class PgSQLManagerTest extends DbManagerTestCase
{
protected $driverName = 'pgsql';
protected static $driverName = 'pgsql';
}
......@@ -6,5 +6,5 @@ namespace yiiunit\framework\rbac;
*/
class SqliteManagerTest extends DbManagerTestCase
{
protected $driverName = 'sqlite';
protected static $driverName = 'sqlite';
}
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