From 1dc296049b02b7a4a43203a883032034947aa8a1 Mon Sep 17 00:00:00 2001 From: mark_story Date: Fri, 23 Aug 2013 23:21:07 -0400 Subject: [PATCH] Update & streamline ConnectionManager ConnectionManager now uses the Registry object system created earlier to create and manage connection + driver pairs. The temporary code that lived in old ConnectionManager is now part of this code. If/When a more formal datasource interface is created it should be simple to adapt this code. Many of the old goofy method names have been removed and replace with simpler more consistent method names. The test suite has been updated as well. Both `create()` and `getDataSource()` have been left behind as aliases/wrappers for other methods as I feel they are the most commonly used methods in ConnectionManager. --- lib/Cake/Database/ConnectionManager.php | 282 +++++---------- lib/Cake/Database/ConnectionRegistry.php | 97 +++++ .../TestPlugin/Database/Driver/TestSource.php | 83 +++++ .../Model/Datasource/Database/DboDummy.php | 12 - .../Model/Datasource/Database/TestDriver.php | 7 - .../Model/Datasource/TestOtherSource.php | 31 -- .../Model/Datasource/TestSource.php | 31 -- .../Database/ConnectionManagerTest.php | 336 +++++------------- lib/Cake/Test/init.php | 5 +- 9 files changed, 356 insertions(+), 528 deletions(-) create mode 100644 lib/Cake/Database/ConnectionRegistry.php create mode 100644 lib/Cake/Test/TestApp/Plugin/TestPlugin/Database/Driver/TestSource.php delete mode 100644 lib/Cake/Test/TestApp/Plugin/TestPlugin/Model/Datasource/Database/DboDummy.php delete mode 100644 lib/Cake/Test/TestApp/Plugin/TestPlugin/Model/Datasource/Database/TestDriver.php delete mode 100644 lib/Cake/Test/TestApp/Plugin/TestPlugin/Model/Datasource/TestOtherSource.php delete mode 100644 lib/Cake/Test/TestApp/Plugin/TestPlugin/Model/Datasource/TestSource.php diff --git a/lib/Cake/Database/ConnectionManager.php b/lib/Cake/Database/ConnectionManager.php index 1ccd223061a..b8f6068aa0d 100644 --- a/lib/Cake/Database/ConnectionManager.php +++ b/lib/Cake/Database/ConnectionManager.php @@ -19,257 +19,159 @@ use Cake\Core\App; use Cake\Core\Configure; use Cake\Database\Connection; +use Cake\Database\ConnectionRegistry; use Cake\Error; /** * Manages loaded instances of DataSource objects * + * Provides an interface to loading and creating connection objects. Acts as + * a registry for the connections defined in an application. + * * Provides an interface for loading and enumerating connections defined in * app/Config/datasources.php */ class ConnectionManager { /** - * Holds a list of datasource configurations + * Holds a list of connection configurations * * @var array */ - public static $config = null; + protected static $_config = null; /** - * Holds instances DataSource objects + * The ConnectionRegistry used by the manager. * - * @var array + * @var Cake\Database\ConnectionRegistry */ - protected static $_dataSources = array(); + protected static $_registry = null; /** - * Contains a list of all file and class names used in Connection settings + * Configure a new connection object. * - * @var array - */ - protected static $_connectionsEnum = array(); - -/** - * Indicates if the init code for this class has already been executed + * The connection will not be constructed until it is first used. * - * @var boolean - */ - protected static $_init = false; - -/** - * Loads connections configuration. + * To change an adapter's configuration at runtime, first drop the adapter and then + * reconfigure it. * - * @return void - */ - protected static function _init() { - if (Configure::check('Datasource') !== null) { - static::$config = Configure::read('Datasource'); - } - static::$_init = true; - } - -/** - * Gets a reference to a DataSource object + * Adapters will not be constructed until the first operation is done. * - * @param string $name The name of the DataSource, as defined in app/Config/datasources.php - * @return DataSource Instance - * @throws Cake\Error\MissingDatasourceException - */ - public static function getDataSource($name) { - if (empty(static::$_init)) { - static::_init(); - } - - if (!empty(static::$_dataSources[$name])) { - return static::$_dataSources[$name]; - } - - if (empty(static::$_connectionsEnum[$name])) { - static::_getConnectionObject($name); - } - - $class = static::loadDataSource($name); - - if ( - strpos($class, '\Datasource') === false && - strpos($class, '\Database') === false - ) { - throw new Error\MissingDatasourceException(array( - 'class' => $class, - 'plugin' => null, - 'message' => 'Datasource is not found in Model/Datasource package.' - )); - } - // TODO fix this once the datasource interface & - // internals are solved. - if (strpos($class, '\Database') !== false) { - static::$_dataSources[$name] = new Connection(static::$config[$name]); - } else { - static::$_dataSources[$name] = new $class(static::$config[$name]); - } - static::$_dataSources[$name]->configKeyName = $name; - - return static::$_dataSources[$name]; - } - -/** - * Gets the list of available DataSource connections - * This will only return the datasources instantiated by this manager - * It differs from enumConnectionObjects, since the latter will return all configured connections + * ### Usage * - * @return array List of available connections - */ - public static function sourceList() { - if (empty(static::$_init)) { - static::_init(); - } - return array_keys(static::$_dataSources); - } - -/** - * Gets a DataSource name from an object reference. + * Reading config data back: * - * @param DataSource $source DataSource object - * @return string Datasource name, or null if source is not present - * in the ConnectionManager. - */ - public static function getSourceName($source) { - if (empty(static::$_init)) { - static::_init(); - } - foreach (static::$_dataSources as $name => $ds) { - if ($ds === $source) { - return $name; - } - } - return null; - } - -/** - * Loads the DataSource class for the given connection name + * `ConnectionManager::config('default');` * - * @param string|array $connName A string name of the connection, as defined in app/Config/datasources.php, - * or an array containing the filename (without extension) and class name of the object, - * to be found in app/Model/Datasource/ or lib/Cake/Model/Datasource/. - * @return string - * @throws Cake\Error\MissingDatasourceException + * Setting a connection up. + * + * `ConnectionManager::config('default', $settings);` + * + * Injecting a constructed driver in: + * + * `ConnectionManager::config('default', $instance);` + * + * Configure multiple adapters at once: + * + * `ConnectionManager::config($arrayOfConfig);` + * + * @param string|array $key The name of the connection config, or an array of multiple configs. + * @param array $config An array of name => config data for adapter. + * @return mixed null when adding configuration and an array of configuration data when reading. + * @throws Cake\Error\Exception When trying to modify an existing config. */ - public static function loadDataSource($connName) { - if (empty(static::$_init)) { - static::_init(); - } - - if (is_array($connName)) { - $conn = $connName; - } else { - $conn = static::$_connectionsEnum[$connName]; + public static function config($key, $config = null) { + // Read config. + if ($config === null && is_string($key)) { + return isset(static::$_config[$key]) ? static::$_config[$key] : null; } - - if (class_exists($conn['classname'])) { - return $conn['classname']; + if ($config === null && is_array($key)) { + foreach ($key as $name => $settings) { + static::config($name, $settings); + } + return; } - - $plugin = $package = null; - if (!empty($conn['plugin'])) { - $plugin = $conn['plugin'] . '.'; + if (isset(static::$_config[$key])) { + throw new Error\Exception(__d('cake_dev', 'Cannot reconfigure existing adapter "%s"', $key)); } - if (!empty($conn['package'])) { - $package = '/' . $conn['package']; + if (is_object($config)) { + $config = ['className' => $config]; } - - $class = App::classname($plugin . $conn['classname'], 'Model/Datasource' . $package); - if (!class_exists($class)) { - throw new Error\MissingDatasourceException(array( - 'class' => $conn['classname'], - 'plugin' => substr($plugin, 0, -1) - )); + if (isset($config['datasource']) && empty($config['className'])) { + $config['className'] = $config['datasource']; + unset($config['datasource']); } - return $class; + $config['name'] = $key; + static::$_config[$key] = $config; } /** - * Return a list of connections + * Get a connection. + * + * If the connection has not been constructed an instance will be added + * to the registry. * - * @return array An associative array of elements where the key is the connection name - * (as defined in Connections), and the value is an array with keys 'filename' and 'classname'. + * @param string $name The connection name. + * @return Connection A connection object. + * @throws Cake\Error\MissingDataSourceConfigException When config data is missing. */ - public static function enumConnectionObjects() { - if (empty(static::$_init)) { - static::_init(); + public static function get($name) { + if (empty(static::$_config[$name])){ + throw new Error\MissingDataSourceConfigException(['name' => $name]); } - return (array)static::$config; + if (empty(static::$_registry)) { + static::$_registry = new ConnectionRegistry(); + } + if (isset(static::$_registry->{$name})) { + return static::$_registry->{$name}; + } + return static::$_registry->load($name, static::$_config[$name]); } /** - * Dynamically creates a DataSource object at runtime, with the given name and settings + * Get the names of configured connections. * - * @param string $name The DataSource name - * @param array $config The DataSource configuration settings - * @return DataSource A reference to the DataSource object, or null if creation failed + * @return array An array of connection names. */ - public static function create($name = '', $config = array()) { - if (empty(static::$_init)) { - static::_init(); - } - - if (empty($name) || empty($config) || array_key_exists($name, static::$_connectionsEnum)) { - return null; - } - static::$config[$name] = $config; - static::$_connectionsEnum[$name] = static::_connectionData($config); - $return = static::getDataSource($name); - return $return; + public static function configured() { + return array_keys(static::$_config); } /** - * Removes a connection configuration at runtime given its name + * Drop a connection and its configuration. * - * @param string $name the connection name as it was created - * @return boolean success if connection was removed, false if it does not exist + * @param string $name The connection name to remove. + * @return boolean true */ public static function drop($name) { - if (empty(static::$_init)) { - static::_init(); - } - - if (!isset(static::$config[$name])) { - return false; - } - unset(static::$_connectionsEnum[$name], static::$_dataSources[$name], static::$config[$name]); + static::$_registry->unload($name); + unset(static::$_config[$name]); return true; } /** - * Gets a list of class and file names associated with the user-defined DataSource connections + * Gets a reference to a DataSource object * - * @param string $name Connection name - * @return void - * @throws Cake\Error\MissingDatasourceConfigException + * @param string $name The name of the DataSource, as defined in app/Config/datasources.php + * @return DataSource Instance + * @throws Cake\Error\MissingDatasourceException + * @deprecated Will be removed in 3.0 stable. */ - protected static function _getConnectionObject($name) { - if (!empty(static::$config[$name])) { - static::$_connectionsEnum[$name] = static::_connectionData(static::$config[$name]); - } else { - throw new Error\MissingDatasourceConfigException(array('config' => $name)); - } + public static function getDataSource($name) { + return static::get($name); } /** - * Returns the file, class name, and parent for the given driver. + * Dynamically creates a DataSource object at runtime, with the given name and settings * - * @param array $config Array with connection configuration. Key 'datasource' is required - * @return array An indexed array with: filename, classname, plugin and parent + * @param string $name The DataSource name + * @param array $config The DataSource configuration settings + * @return DataSource A reference to the DataSource object, or null if creation failed + * @deprecated Will be removed in 3.0 stable */ - protected static function _connectionData($config) { - $package = $classname = $plugin = null; - - list($plugin, $classname) = pluginSplit($config['datasource']); - if (strpos($classname, '/') !== false) { - $package = dirname($classname); - $classname = basename($classname); - } - return compact('package', 'classname', 'plugin'); + public static function create($name = '', $config = array()) { + static::config($name, $config); + return static::get($name); } } diff --git a/lib/Cake/Database/ConnectionRegistry.php b/lib/Cake/Database/ConnectionRegistry.php new file mode 100644 index 00000000000..beb966b078c --- /dev/null +++ b/lib/Cake/Database/ConnectionRegistry.php @@ -0,0 +1,97 @@ + $class, + 'plugin' => $plugin, + 'message' => 'Driver "%s" was not found in.' + )); + } + +/** + * Create the connection object with the correct driver. + * + * Part of the template method for Cake\Utility\ObjectRegistry::load() + * + * @param string|Driver $class The classname or object to make. + * @param array $settings An array of settings to use for the driver engine. + * @return Connection A connection with the correct driver. + */ + protected function _create($class, $settings) { + $isObject = is_object($class); + if (is_object($class)) { + $instance = $class; + } + + unset($settings['className']); + if (!isset($instance)) { + $instance = new $class($settings); + } + $settings['datasource'] = $instance; + return new Connection($settings); + } + +/** + * Remove a single adapter from the registry. + * + * @param string $name The adapter name. + * @return void + */ + public function unload($name) { + unset($this->_loaded[$name]); + } + +} diff --git a/lib/Cake/Test/TestApp/Plugin/TestPlugin/Database/Driver/TestSource.php b/lib/Cake/Test/TestApp/Plugin/TestPlugin/Database/Driver/TestSource.php new file mode 100644 index 00000000000..fca6aec2f48 --- /dev/null +++ b/lib/Cake/Test/TestApp/Plugin/TestPlugin/Database/Driver/TestSource.php @@ -0,0 +1,83 @@ +markTestIncomplete('ConnectionManager tests are not working yet'); - } - /** * tearDown method * @@ -36,295 +32,126 @@ public function setUp() { public function tearDown() { parent::tearDown(); Plugin::unload(); + ConnectionManager::drop('test_variant'); } /** - * testEnumConnectionObjects method - * - * @return void - */ - public function testEnumConnectionObjects() { - $sources = ConnectionManager::enumConnectionObjects(); - $this->assertTrue(count($sources) >= 1); - - $connections = array('default', 'test', 'test'); - $this->assertTrue(count(array_intersect(array_keys($sources), $connections)) >= 1); - } - -/** - * testGetDataSource method - * - * @return void - */ - public function testGetDataSource() { - App::build(array( - 'Model/Datasource' => array( - CAKE . 'Test/TestApp/Model/Datasource/' - ) - )); - - $name = 'test_get_datasource'; - $config = array('datasource' => 'Test2Source'); - - ConnectionManager::create($name, $config); - $connections = ConnectionManager::enumConnectionObjects(); - $this->assertTrue((bool)(count(array_keys($connections) >= 1))); - - $source = ConnectionManager::getDataSource('test_get_datasource'); - $this->assertTrue(is_object($source)); - ConnectionManager::drop('test_get_datasource'); - } - -/** - * testGetDataSourceException() method + * Data provider for valid config data sets. * - * @return void - * @expectedException MissingDatasourceConfigException + * @return array */ - public function testGetDataSourceException() { - ConnectionManager::getDataSource('non_existent_source'); - } - -/** - * testGetPluginDataSource method - * - * @return void - */ - public function testGetPluginDataSource() { - App::build(array( - 'Plugin' => array(CAKE . 'Test/TestApp/Plugin/') - ), App::RESET); - Plugin::load('TestPlugin'); - $name = 'test_source'; - $config = array('datasource' => 'TestPlugin.TestSource'); - $connection = ConnectionManager::create($name, $config); - - $this->assertTrue(class_exists('TestSource')); - $this->assertEquals($connection->configKeyName, $name); - $this->assertEquals($connection->config, $config); - - ConnectionManager::drop($name); - } - -/** - * testGetPluginDataSourceAndPluginDriver method - * - * @return void - */ - public function testGetPluginDataSourceAndPluginDriver() { - App::build(array( - 'Plugin' => array(CAKE . 'Test/TestApp/Plugin/') - ), App::RESET); - Plugin::load('TestPlugin'); - $name = 'test_plugin_source_and_driver'; - $config = array('datasource' => 'TestPlugin.Database/TestDriver'); - - $connection = ConnectionManager::create($name, $config); - - $this->assertTrue(class_exists('TestSource')); - $this->assertTrue(class_exists('TestDriver')); - $this->assertEquals($connection->configKeyName, $name); - $this->assertEquals($connection->config, $config); - - ConnectionManager::drop($name); + public static function configProvider() { + return [ + 'Array of data using datasource key.' => [[ + 'datasource' => 'Cake\Database\Driver\Sqlite', + 'database' => ':memory:', + ]], + 'Array of data using classname key.' => [[ + 'className' => 'Sqlite', + 'database' => ':memory:', + ]], + 'Direct instance' => [new Sqlite(['database' => ':memory:'])], + ]; } /** - * testGetLocalDataSourceAndPluginDriver method + * Test the various valid config() calls. * + * @dataProvider configProvider * @return void */ - public function testGetLocalDataSourceAndPluginDriver() { - App::build(array( - 'Plugin' => array(CAKE . 'Test/TestApp/Plugin/') - )); - Plugin::load('TestPlugin'); - $name = 'test_local_source_and_plugin_driver'; - $config = array('datasource' => 'TestPlugin.Database/DboDummy'); - - $connection = ConnectionManager::create($name, $config); + public function testConfigVariants($settings) { + $this->assertNotContains('test_variant', ConnectionManager::configured(), 'test_variant config should not exist.'); + ConnectionManager::config('test_variant', $settings); - $this->assertTrue(class_exists('DboSource')); - $this->assertTrue(class_exists('DboDummy')); - $this->assertEquals($connection->configKeyName, $name); - - ConnectionManager::drop($name); + $ds = ConnectionManager::get('test_variant'); + $this->assertInstanceOf('Cake\Database\Connection', $ds); + $this->assertContains('test_variant', ConnectionManager::configured()); } /** - * testGetPluginDataSourceAndLocalDriver method + * Test invalid classes cause exceptions * - * @return void + * @expectedException Cake\Database\Exception\MissingDriverException */ - public function testGetPluginDataSourceAndLocalDriver() { - App::build(array( - 'Plugin' => array(CAKE . 'Test/TestApp/Plugin/'), - 'Model/Datasource/Database' => array( - CAKE . 'Test/TestApp/Model/Datasource/Database/' - ) - )); - - $name = 'test_plugin_source_and_local_driver'; - $config = array('datasource' => 'Database/TestLocalDriver'); - - $connection = ConnectionManager::create($name, $config); - - $this->assertTrue(class_exists('TestSource')); - $this->assertTrue(class_exists('TestLocalDriver')); - $this->assertEquals($connection->configKeyName, $name); - $this->assertEquals($connection->config, $config); - ConnectionManager::drop($name); + public function testConfigInvalidOptions() { + ConnectionManager::config('test_variant', [ + 'className' => 'HerpDerp' + ]); + ConnectionManager::get('test_variant'); } /** - * testSourceList method + * Test for errors on duplicate config. * + * @expectedException Cake\Error\Exception * @return void */ - public function testSourceList() { - ConnectionManager::getDataSource('test'); - $sources = ConnectionManager::sourceList(); - $this->assertTrue(count($sources) >= 1); - $this->assertTrue(in_array('test', array_keys($sources))); + public function testConfigDuplicateConfig() { + $settings = [ + 'className' => 'Sqlite', + 'database' => ':memory:', + ]; + ConnectionManager::config('test_variant', $settings); + ConnectionManager::config('test_variant', $settings); } /** - * testGetSourceName method + * Test get() failing on missing config. * + * @expectedException Cake\Error\Exception * @return void */ - public function testGetSourceName() { - $source = ConnectionManager::getDataSource('test'); - $result = ConnectionManager::getSourceName($source); - - $this->assertEquals('test', $result); - - $source = new \StdClass(); - $result = ConnectionManager::getSourceName($source); - $this->assertNull($result); + public function testGetFailOnMissingConfig() { + ConnectionManager::get('test_variant'); } /** - * testLoadDataSource method + * Test loading configured connections. * * @return void */ - public function testLoadDataSource() { - $connections = array( - array('classname' => 'Mysql', 'filename' => 'Mysql', 'package' => 'Database'), - array('classname' => 'Postgres', 'filename' => 'Postgres', 'package' => 'Database'), - array('classname' => 'Sqlite', 'filename' => 'Sqlite', 'package' => 'Database'), - ); + public function testGet() { + $config = ConnectionManager::config('test'); + $this->skipIf(empty($config), 'No test config, skipping'); - foreach ($connections as $connection) { - $exists = class_exists($connection['classname']); - $loaded = ConnectionManager::loadDataSource($connection); - $this->assertEquals($loaded, !$exists, "Failed loading the {$connection['classname']} datasource"); - } + $ds = ConnectionManager::get('test'); + $this->assertSame($ds, ConnectionManager::get('test')); + $this->assertInstanceOf('Cake\Database\Connection', $ds); + $this->assertEquals('test', $ds->configName()); } /** - * testLoadDataSourceException() method + * Test that configured() finds configured sources. * * @return void - * @expectedException MissingDatasourceException */ - public function testLoadDataSourceException() { - $connection = array('classname' => 'NonExistentDataSource', 'filename' => 'non_existent'); - ConnectionManager::loadDataSource($connection); + public function testConfigured() { + ConnectionManager::config('test_variant', [ + 'className' => 'Sqlite', + 'database' => ':memory:' + ]); + $results = ConnectionManager::configured(); + $this->assertContains('test_variant', $results); } /** - * testCreateDataSource method - * - * @return void - */ - public function testCreateDataSourceWithIntegrationTests() { - $name = 'test_created_connection'; - - $connections = ConnectionManager::enumConnectionObjects(); - $this->assertTrue((bool)(count(array_keys($connections) >= 1))); - - $source = ConnectionManager::getDataSource('test'); - $this->assertTrue(is_object($source)); - - $config = $source->config; - $connection = ConnectionManager::create($name, $config); - - $this->assertTrue(is_object($connection)); - $this->assertEquals($name, $connection->configKeyName); - $this->assertEquals($name, ConnectionManager::getSourceName($connection)); - - $source = ConnectionManager::create(null, array()); - $this->assertEquals(null, $source); - - $source = ConnectionManager::create('another_test', array()); - $this->assertEquals(null, $source); - - $config = array('classname' => 'DboMysql', 'filename' => 'dbo/dbo_mysql'); - $source = ConnectionManager::create(null, $config); - $this->assertEquals(null, $source); - } - -/** - * testConnectionData method + * testGetPluginDataSource method * * @return void */ - public function testConnectionData() { + public function testGetPluginDataSource() { App::build(array( - 'Plugin' => array(CAKE . 'Test/TestApp/Plugin/'), - 'Model/Datasource' => array( - CAKE . 'Test/TestApp/Model/Datasource/' - ) + 'Plugin' => array(CAKE . 'Test/TestApp/Plugin/') ), App::RESET); - Plugin::load(array('TestPlugin', 'TestPluginTwo')); - $expected = array( - 'datasource' => 'Test2Source' - ); - - ConnectionManager::create('connection1', array('datasource' => 'Test2Source')); - $connections = ConnectionManager::enumConnectionObjects(); - $this->assertEquals($expected, $connections['connection1']); - ConnectionManager::drop('connection1'); - - ConnectionManager::create('connection2', array('datasource' => 'Test2Source')); - $connections = ConnectionManager::enumConnectionObjects(); - $this->assertEquals($expected, $connections['connection2']); - ConnectionManager::drop('connection2'); - - ConnectionManager::create('connection3', array('datasource' => 'TestPlugin.TestSource')); - $connections = ConnectionManager::enumConnectionObjects(); - $expected['datasource'] = 'TestPlugin.TestSource'; - $this->assertEquals($expected, $connections['connection3']); - ConnectionManager::drop('connection3'); - - ConnectionManager::create('connection4', array('datasource' => 'TestPlugin.TestSource')); - $connections = ConnectionManager::enumConnectionObjects(); - $this->assertEquals($expected, $connections['connection4']); - ConnectionManager::drop('connection4'); - - ConnectionManager::create('connection5', array('datasource' => 'Test2OtherSource')); - $connections = ConnectionManager::enumConnectionObjects(); - $expected['datasource'] = 'Test2OtherSource'; - $this->assertEquals($expected, $connections['connection5']); - ConnectionManager::drop('connection5'); - - ConnectionManager::create('connection6', array('datasource' => 'Test2OtherSource')); - $connections = ConnectionManager::enumConnectionObjects(); - $this->assertEquals($expected, $connections['connection6']); - ConnectionManager::drop('connection6'); - - ConnectionManager::create('connection7', array('datasource' => 'TestPlugin.TestOtherSource')); - $connections = ConnectionManager::enumConnectionObjects(); - $expected['datasource'] = 'TestPlugin.TestOtherSource'; - $this->assertEquals($expected, $connections['connection7']); - ConnectionManager::drop('connection7'); + Plugin::load('TestPlugin'); + $name = 'test_variant'; + $config = array('className' => 'TestPlugin.TestSource'); + ConnectionManager::config($name, $config); + $connection = ConnectionManager::get($name); - ConnectionManager::create('connection8', array('datasource' => 'TestPlugin.TestOtherSource')); - $connections = ConnectionManager::enumConnectionObjects(); - $this->assertEquals($expected, $connections['connection8']); - ConnectionManager::drop('connection8'); + $this->assertInstanceOf('Cake\Database\Connection', $connection); + $this->assertInstanceOf('TestPlugin\Database\Driver\TestSource', $connection->driver()); } /** @@ -333,17 +160,16 @@ public function testConnectionData() { * @return void */ public function testDrop() { - App::build(array( - 'Model/Datasource' => array( - CAKE . 'Test/TestApp/Model/Datasource/' - ) - )); - ConnectionManager::create('droppable', array('datasource' => 'Test2Source')); - $connections = ConnectionManager::enumConnectionObjects(); - $this->assertEquals(array('datasource' => 'Test2Source'), $connections['droppable']); + ConnectionManager::config('test_variant', [ + 'datasource' => 'Sqlite', + 'database' => 'memory' + ]); + $result = ConnectionManager::configured(); + $this->assertContains('test_variant', $result); - $this->assertTrue(ConnectionManager::drop('droppable')); - $connections = ConnectionManager::enumConnectionObjects(); - $this->assertFalse(isset($connections['droppable'])); + $this->assertTrue(ConnectionManager::drop('test_variant')); + $result = ConnectionManager::configured(); + $this->assertNotContains('test_variant', $result); } + } diff --git a/lib/Cake/Test/init.php b/lib/Cake/Test/init.php index be2b96f79fc..6fe550449b5 100644 --- a/lib/Cake/Test/init.php +++ b/lib/Cake/Test/init.php @@ -14,6 +14,7 @@ use Cake\Cache\Cache; use Cake\Core\Configure; +use Cake\Database\ConnectionManager; use Cake\Log\Log; define('DS', DIRECTORY_SEPARATOR); @@ -65,8 +66,8 @@ ] ]); -Configure::write('Datasource.test', [ - 'datasource' => getenv('db_class'), +ConnectionManager::config('test', [ + 'className' => getenv('db_class'), 'dsn' => getenv('db_dsn'), 'database' => getenv('db_database'), 'login' => getenv('db_login'),