1<?php 2/** 3 * Connection Manager tests 4 * 5 * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) 6 * 7 * Licensed under The MIT License 8 * For full copyright and license information, please see the LICENSE.txt 9 * Redistributions of files must retain the above copyright notice 10 * 11 * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) 12 * @link https://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests 13 * @package Cake.Test.Case.Model 14 * @since CakePHP(tm) v 1.2.0.5550 15 * @license https://opensource.org/licenses/mit-license.php MIT License 16 */ 17 18App::uses('ConnectionManager', 'Model'); 19 20/** 21 * ConnectionManagerTest 22 * 23 * @package Cake.Test.Case.Model 24 */ 25class ConnectionManagerTest extends CakeTestCase { 26 27/** 28 * tearDown method 29 * 30 * @return void 31 */ 32 public function tearDown() { 33 parent::tearDown(); 34 CakePlugin::unload(); 35 } 36 37/** 38 * testEnumConnectionObjects method 39 * 40 * @return void 41 */ 42 public function testEnumConnectionObjects() { 43 $sources = ConnectionManager::enumConnectionObjects(); 44 $this->assertTrue(count($sources) >= 1); 45 46 $connections = array('default', 'test', 'test'); 47 $this->assertTrue(count(array_intersect(array_keys($sources), $connections)) >= 1); 48 } 49 50/** 51 * testGetDataSource method 52 * 53 * @return void 54 */ 55 public function testGetDataSource() { 56 App::build(array( 57 'Model/Datasource' => array( 58 CAKE . 'Test' . DS . 'test_app' . DS . 'Model' . DS . 'Datasource' . DS 59 ) 60 )); 61 62 $name = 'test_get_datasource'; 63 $config = array('datasource' => 'Test2Source'); 64 65 ConnectionManager::create($name, $config); 66 $connections = ConnectionManager::enumConnectionObjects(); 67 $this->assertTrue(count(array_keys($connections)) >= 1); 68 69 $source = ConnectionManager::getDataSource('test_get_datasource'); 70 $this->assertTrue(is_object($source)); 71 ConnectionManager::drop('test_get_datasource'); 72 } 73 74/** 75 * testGetDataSourceException() method 76 * 77 * @return void 78 * @expectedException MissingDatasourceConfigException 79 */ 80 public function testGetDataSourceException() { 81 ConnectionManager::getDataSource('non_existent_source'); 82 } 83 84/** 85 * testGetPluginDataSource method 86 * 87 * @return void 88 */ 89 public function testGetPluginDataSource() { 90 App::build(array( 91 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS) 92 ), App::RESET); 93 CakePlugin::load('TestPlugin'); 94 $name = 'test_source'; 95 $config = array('datasource' => 'TestPlugin.TestSource'); 96 $connection = ConnectionManager::create($name, $config); 97 98 $this->assertTrue(class_exists('TestSource')); 99 $this->assertEquals($connection->configKeyName, $name); 100 $this->assertEquals($connection->config, $config); 101 102 ConnectionManager::drop($name); 103 } 104 105/** 106 * testGetPluginDataSourceAndPluginDriver method 107 * 108 * @return void 109 */ 110 public function testGetPluginDataSourceAndPluginDriver() { 111 App::build(array( 112 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS) 113 ), App::RESET); 114 CakePlugin::load('TestPlugin'); 115 $name = 'test_plugin_source_and_driver'; 116 $config = array('datasource' => 'TestPlugin.Database/TestDriver'); 117 118 $connection = ConnectionManager::create($name, $config); 119 120 $this->assertTrue(class_exists('TestSource')); 121 $this->assertTrue(class_exists('TestDriver')); 122 $this->assertEquals($connection->configKeyName, $name); 123 $this->assertEquals($connection->config, $config); 124 125 ConnectionManager::drop($name); 126 } 127 128/** 129 * testGetLocalDataSourceAndPluginDriver method 130 * 131 * @return void 132 */ 133 public function testGetLocalDataSourceAndPluginDriver() { 134 App::build(array( 135 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS) 136 )); 137 CakePlugin::load('TestPlugin'); 138 $name = 'test_local_source_and_plugin_driver'; 139 $config = array('datasource' => 'TestPlugin.Database/DboDummy'); 140 141 $connection = ConnectionManager::create($name, $config); 142 143 $this->assertTrue(class_exists('DboSource')); 144 $this->assertTrue(class_exists('DboDummy')); 145 $this->assertEquals($connection->configKeyName, $name); 146 147 ConnectionManager::drop($name); 148 } 149 150/** 151 * testGetPluginDataSourceAndLocalDriver method 152 * 153 * @return void 154 */ 155 public function testGetPluginDataSourceAndLocalDriver() { 156 App::build(array( 157 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS), 158 'Model/Datasource/Database' => array( 159 CAKE . 'Test' . DS . 'test_app' . DS . 'Model' . DS . 'Datasource' . DS . 'Database' . DS 160 ) 161 )); 162 163 $name = 'test_plugin_source_and_local_driver'; 164 $config = array('datasource' => 'Database/TestLocalDriver'); 165 166 $connection = ConnectionManager::create($name, $config); 167 168 $this->assertTrue(class_exists('TestSource')); 169 $this->assertTrue(class_exists('TestLocalDriver')); 170 $this->assertEquals($connection->configKeyName, $name); 171 $this->assertEquals($connection->config, $config); 172 ConnectionManager::drop($name); 173 } 174 175/** 176 * testSourceList method 177 * 178 * @return void 179 */ 180 public function testSourceList() { 181 ConnectionManager::getDataSource('test'); 182 $sources = ConnectionManager::sourceList(); 183 $this->assertTrue(count($sources) >= 1); 184 $this->assertTrue(in_array('test', array_keys($sources))); 185 } 186 187/** 188 * testGetSourceName method 189 * 190 * @return void 191 */ 192 public function testGetSourceName() { 193 $source = ConnectionManager::getDataSource('test'); 194 $result = ConnectionManager::getSourceName($source); 195 196 $this->assertEquals('test', $result); 197 198 $source = new StdClass(); 199 $result = ConnectionManager::getSourceName($source); 200 $this->assertNull($result); 201 } 202 203/** 204 * testLoadDataSource method 205 * 206 * @return void 207 */ 208 public function testLoadDataSource() { 209 $connections = array( 210 array('classname' => 'Mysql', 'filename' => 'Mysql', 'package' => 'Database'), 211 array('classname' => 'Postgres', 'filename' => 'Postgres', 'package' => 'Database'), 212 array('classname' => 'Sqlite', 'filename' => 'Sqlite', 'package' => 'Database'), 213 ); 214 215 foreach ($connections as $connection) { 216 $exists = class_exists($connection['classname']); 217 $loaded = ConnectionManager::loadDataSource($connection); 218 $this->assertEquals($loaded, !$exists, "Failed loading the {$connection['classname']} datasource"); 219 } 220 } 221 222/** 223 * testLoadDataSourceException() method 224 * 225 * @return void 226 * @expectedException MissingDatasourceException 227 */ 228 public function testLoadDataSourceException() { 229 $connection = array('classname' => 'NonExistentDataSource', 'filename' => 'non_existent'); 230 ConnectionManager::loadDataSource($connection); 231 } 232 233/** 234 * testCreateDataSource method 235 * 236 * @return void 237 */ 238 public function testCreateDataSourceWithIntegrationTests() { 239 $name = 'test_created_connection'; 240 241 $connections = ConnectionManager::enumConnectionObjects(); 242 $this->assertTrue(count(array_keys($connections)) >= 1); 243 244 $source = ConnectionManager::getDataSource('test'); 245 $this->assertTrue(is_object($source)); 246 247 $config = $source->config; 248 $connection = ConnectionManager::create($name, $config); 249 250 $this->assertTrue(is_object($connection)); 251 $this->assertEquals($name, $connection->configKeyName); 252 $this->assertEquals($name, ConnectionManager::getSourceName($connection)); 253 254 $source = ConnectionManager::create(null, array()); 255 $this->assertEquals(null, $source); 256 257 $source = ConnectionManager::create('another_test', array()); 258 $this->assertEquals(null, $source); 259 260 $config = array('classname' => 'DboMysql', 'filename' => 'dbo' . DS . 'dbo_mysql'); 261 $source = ConnectionManager::create(null, $config); 262 $this->assertEquals(null, $source); 263 } 264 265/** 266 * testConnectionData method 267 * 268 * @return void 269 */ 270 public function testConnectionData() { 271 App::build(array( 272 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS), 273 'Model/Datasource' => array( 274 CAKE . 'Test' . DS . 'test_app' . DS . 'Model' . DS . 'Datasource' . DS 275 ) 276 ), App::RESET); 277 CakePlugin::load(array('TestPlugin', 'TestPluginTwo')); 278 $expected = array( 279 'datasource' => 'Test2Source' 280 ); 281 282 ConnectionManager::create('connection1', array('datasource' => 'Test2Source')); 283 $connections = ConnectionManager::enumConnectionObjects(); 284 $this->assertEquals($expected, $connections['connection1']); 285 ConnectionManager::drop('connection1'); 286 287 ConnectionManager::create('connection2', array('datasource' => 'Test2Source')); 288 $connections = ConnectionManager::enumConnectionObjects(); 289 $this->assertEquals($expected, $connections['connection2']); 290 ConnectionManager::drop('connection2'); 291 292 ConnectionManager::create('connection3', array('datasource' => 'TestPlugin.TestSource')); 293 $connections = ConnectionManager::enumConnectionObjects(); 294 $expected['datasource'] = 'TestPlugin.TestSource'; 295 $this->assertEquals($expected, $connections['connection3']); 296 ConnectionManager::drop('connection3'); 297 298 ConnectionManager::create('connection4', array('datasource' => 'TestPlugin.TestSource')); 299 $connections = ConnectionManager::enumConnectionObjects(); 300 $this->assertEquals($expected, $connections['connection4']); 301 ConnectionManager::drop('connection4'); 302 303 ConnectionManager::create('connection5', array('datasource' => 'Test2OtherSource')); 304 $connections = ConnectionManager::enumConnectionObjects(); 305 $expected['datasource'] = 'Test2OtherSource'; 306 $this->assertEquals($expected, $connections['connection5']); 307 ConnectionManager::drop('connection5'); 308 309 ConnectionManager::create('connection6', array('datasource' => 'Test2OtherSource')); 310 $connections = ConnectionManager::enumConnectionObjects(); 311 $this->assertEquals($expected, $connections['connection6']); 312 ConnectionManager::drop('connection6'); 313 314 ConnectionManager::create('connection7', array('datasource' => 'TestPlugin.TestOtherSource')); 315 $connections = ConnectionManager::enumConnectionObjects(); 316 $expected['datasource'] = 'TestPlugin.TestOtherSource'; 317 $this->assertEquals($expected, $connections['connection7']); 318 ConnectionManager::drop('connection7'); 319 320 ConnectionManager::create('connection8', array('datasource' => 'TestPlugin.TestOtherSource')); 321 $connections = ConnectionManager::enumConnectionObjects(); 322 $this->assertEquals($expected, $connections['connection8']); 323 ConnectionManager::drop('connection8'); 324 } 325 326/** 327 * Tests that a connection configuration can be deleted in runtime 328 * 329 * @return void 330 */ 331 public function testDrop() { 332 App::build(array( 333 'Model/Datasource' => array( 334 CAKE . 'Test' . DS . 'test_app' . DS . 'Model' . DS . 'Datasource' . DS 335 ) 336 )); 337 ConnectionManager::create('droppable', array('datasource' => 'Test2Source')); 338 $connections = ConnectionManager::enumConnectionObjects(); 339 $this->assertEquals(array('datasource' => 'Test2Source'), $connections['droppable']); 340 341 $this->assertTrue(ConnectionManager::drop('droppable')); 342 $connections = ConnectionManager::enumConnectionObjects(); 343 $this->assertFalse(isset($connections['droppable'])); 344 } 345} 346