From 905e39ede9acbfcb10e2ca23f9ca3cddd15d1c3a Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 7 May 2014 00:19:33 +0400 Subject: [PATCH] RBAC migration is now aware of custom table names, speeded up RBAC tests --- .../migrations/m140506_102106_rbac_init.php | 53 ++++++++----- tests/unit/TestCase.php | 2 +- .../elasticsearch/ElasticSearchTestCase.php | 4 +- .../extensions/mongodb/MongoDbTestCase.php | 2 +- .../unit/extensions/redis/RedisCacheTest.php | 2 +- tests/unit/extensions/redis/RedisTestCase.php | 4 +- .../unit/extensions/sphinx/SphinxTestCase.php | 2 +- tests/unit/framework/caching/DbCacheTest.php | 2 +- tests/unit/framework/db/DatabaseTestCase.php | 2 +- .../unit/framework/rbac/DbManagerTestCase.php | 74 +++++++++++-------- .../unit/framework/rbac/PgSQLManagerTest.php | 2 +- .../unit/framework/rbac/SqliteManagerTest.php | 2 +- 12 files changed, 93 insertions(+), 58 deletions(-) diff --git a/framework/rbac/migrations/m140506_102106_rbac_init.php b/framework/rbac/migrations/m140506_102106_rbac_init.php index a05d94d912..a4509ffe0d 100644 --- a/framework/rbac/migrations/m140506_102106_rbac_init.php +++ b/framework/rbac/migrations/m140506_102106_rbac_init.php @@ -1,25 +1,42 @@ 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); } } diff --git a/tests/unit/TestCase.php b/tests/unit/TestCase.php index 37b4313f09..4d9b7aa266 100644 --- a/tests/unit/TestCase.php +++ b/tests/unit/TestCase.php @@ -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'); diff --git a/tests/unit/extensions/elasticsearch/ElasticSearchTestCase.php b/tests/unit/extensions/elasticsearch/ElasticSearchTestCase.php index bdad9e6a58..d1a59b8994 100644 --- a/tests/unit/extensions/elasticsearch/ElasticSearchTestCase.php +++ b/tests/unit/extensions/elasticsearch/ElasticSearchTestCase.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) { diff --git a/tests/unit/extensions/mongodb/MongoDbTestCase.php b/tests/unit/extensions/mongodb/MongoDbTestCase.php index 669bf58909..00f4033d5b 100644 --- a/tests/unit/extensions/mongodb/MongoDbTestCase.php +++ b/tests/unit/extensions/mongodb/MongoDbTestCase.php @@ -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; } diff --git a/tests/unit/extensions/redis/RedisCacheTest.php b/tests/unit/extensions/redis/RedisCacheTest.php index 6caab91b6b..76025c7b18 100644 --- a/tests/unit/extensions/redis/RedisCacheTest.php +++ b/tests/unit/extensions/redis/RedisCacheTest.php @@ -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.'); diff --git a/tests/unit/extensions/redis/RedisTestCase.php b/tests/unit/extensions/redis/RedisTestCase.php index 5a2d30cc3e..bd351171a6 100644 --- a/tests/unit/extensions/redis/RedisTestCase.php +++ b/tests/unit/extensions/redis/RedisTestCase.php @@ -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) { diff --git a/tests/unit/extensions/sphinx/SphinxTestCase.php b/tests/unit/extensions/sphinx/SphinxTestCase.php index 6c1e5e0323..83b0984853 100644 --- a/tests/unit/extensions/sphinx/SphinxTestCase.php +++ b/tests/unit/extensions/sphinx/SphinxTestCase.php @@ -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']; diff --git a/tests/unit/framework/caching/DbCacheTest.php b/tests/unit/framework/caching/DbCacheTest.php index 81bf139e61..0036ffe84c 100644 --- a/tests/unit/framework/caching/DbCacheTest.php +++ b/tests/unit/framework/caching/DbCacheTest.php @@ -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']; diff --git a/tests/unit/framework/db/DatabaseTestCase.php b/tests/unit/framework/db/DatabaseTestCase.php index 8bb677b8d6..b66601ed74 100644 --- a/tests/unit/framework/db/DatabaseTestCase.php +++ b/tests/unit/framework/db/DatabaseTestCase.php @@ -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; diff --git a/tests/unit/framework/rbac/DbManagerTestCase.php b/tests/unit/framework/rbac/DbManagerTestCase.php index 5a24cbeb3c..a0dcd88a51 100644 --- a/tests/unit/framework/rbac/DbManagerTestCase.php +++ b/tests/unit/framework/rbac/DbManagerTestCase.php @@ -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; } + public static function setUpBeforeClass() + { + parent::setUpBeforeClass(); + $databases = static::getParam('databases'); + static::$database = $databases[static::$driverName]; + $pdo_database = 'pdo_' . static::$driverName; + + if (!extension_loaded('pdo') || !extension_loaded($pdo_database)) { + 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(); - $databases = $this->getParam('databases'); - $this->database = $databases[$this->driverName]; - $pdo_database = 'pdo_'.$this->driverName; - - if (!extension_loaded('pdo') || !extension_loaded($pdo_database)) { - $this->markTestSkipped('pdo and '.$pdo_database.' extension are required.'); - } - $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; } diff --git a/tests/unit/framework/rbac/PgSQLManagerTest.php b/tests/unit/framework/rbac/PgSQLManagerTest.php index fc072c14ec..4186fe23eb 100644 --- a/tests/unit/framework/rbac/PgSQLManagerTest.php +++ b/tests/unit/framework/rbac/PgSQLManagerTest.php @@ -6,5 +6,5 @@ namespace yiiunit\framework\rbac; */ class PgSQLManagerTest extends DbManagerTestCase { - protected $driverName = 'pgsql'; + protected static $driverName = 'pgsql'; } diff --git a/tests/unit/framework/rbac/SqliteManagerTest.php b/tests/unit/framework/rbac/SqliteManagerTest.php index 3bc8529e58..316c46a19a 100644 --- a/tests/unit/framework/rbac/SqliteManagerTest.php +++ b/tests/unit/framework/rbac/SqliteManagerTest.php @@ -6,5 +6,5 @@ namespace yiiunit\framework\rbac; */ class SqliteManagerTest extends DbManagerTestCase { - protected $driverName = 'sqlite'; + protected static $driverName = 'sqlite'; }