| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516 |
- <?php
- /**
- * Licensed under The MIT License
- * For full copyright and license information, please see the LICENSE.txt
- * Redistributions of files must retain the above copyright notice
- *
- * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
- * @link https://cakephp.org CakePHP(tm) Project
- * @since 1.2.0
- * @license https://opensource.org/licenses/mit-license.php MIT License
- */
- namespace Cake\Test\TestCase\Datasource;
- use Cake\Core\Plugin;
- use Cake\Datasource\ConnectionManager;
- use Cake\TestSuite\TestCase;
- class FakeConnection
- {
- protected $_config = [];
- /**
- * Constructor.
- *
- * @param array $config configuration for connecting to database
- */
- public function __construct($config = [])
- {
- $this->_config = $config;
- }
- /**
- * Returns the set config
- *
- * @return array
- */
- public function config()
- {
- return $this->_config;
- }
- /**
- * Returns the set name
- *
- * @return string
- */
- public function configName()
- {
- if (empty($this->_config['name'])) {
- return '';
- }
- return $this->_config['name'];
- }
- }
- /**
- * ConnectionManager Test
- */
- class ConnectionManagerTest extends TestCase
- {
- /**
- * tearDown method
- *
- * @return void
- */
- public function tearDown()
- {
- parent::tearDown();
- Plugin::unload();
- ConnectionManager::drop('test_variant');
- ConnectionManager::dropAlias('other_name');
- }
- /**
- * Data provider for valid config data sets.
- *
- * @return array
- */
- public static function configProvider()
- {
- return [
- 'Array of data using classname key.' => [[
- 'className' => __NAMESPACE__ . '\FakeConnection',
- 'instance' => 'Sqlite',
- 'database' => ':memory:',
- ]],
- 'Direct instance' => [new FakeConnection],
- ];
- }
- /**
- * Test the various valid config() calls.
- *
- * @dataProvider configProvider
- * @return void
- */
- public function testConfigVariants($settings)
- {
- $this->assertNotContains('test_variant', ConnectionManager::configured(), 'test_variant config should not exist.');
- ConnectionManager::setConfig('test_variant', $settings);
- $ds = ConnectionManager::get('test_variant');
- $this->assertInstanceOf(__NAMESPACE__ . '\FakeConnection', $ds);
- $this->assertContains('test_variant', ConnectionManager::configured());
- }
- /**
- * Test invalid classes cause exceptions
- *
- */
- public function testConfigInvalidOptions()
- {
- $this->expectException(\Cake\Datasource\Exception\MissingDatasourceException::class);
- ConnectionManager::setConfig('test_variant', [
- 'className' => 'Herp\Derp'
- ]);
- ConnectionManager::get('test_variant');
- }
- /**
- * Test for errors on duplicate config.
- *
- * @return void
- */
- public function testConfigDuplicateConfig()
- {
- $this->expectException(\BadMethodCallException::class);
- $this->expectExceptionMessage('Cannot reconfigure existing key "test_variant"');
- $settings = [
- 'className' => __NAMESPACE__ . '\FakeConnection',
- 'database' => ':memory:',
- ];
- ConnectionManager::setConfig('test_variant', $settings);
- ConnectionManager::setConfig('test_variant', $settings);
- }
- /**
- * Test get() failing on missing config.
- *
- * @return void
- */
- public function testGetFailOnMissingConfig()
- {
- $this->expectException(\Cake\Core\Exception\Exception::class);
- $this->expectExceptionMessage('The datasource configuration "test_variant" was not found.');
- ConnectionManager::get('test_variant');
- }
- /**
- * Test loading configured connections.
- *
- * @return void
- */
- public function testGet()
- {
- $config = ConnectionManager::getConfig('test');
- $this->skipIf(empty($config), 'No test config, skipping');
- $ds = ConnectionManager::get('test');
- $this->assertSame($ds, ConnectionManager::get('test'));
- $this->assertInstanceOf('Cake\Database\Connection', $ds);
- $this->assertEquals('test', $ds->configName());
- }
- /**
- * Test loading connections without aliases
- *
- * @return void
- */
- public function testGetNoAlias()
- {
- $this->expectException(\Cake\Core\Exception\Exception::class);
- $this->expectExceptionMessage('The datasource configuration "other_name" was not found.');
- $config = ConnectionManager::getConfig('test');
- $this->skipIf(empty($config), 'No test config, skipping');
- ConnectionManager::alias('test', 'other_name');
- ConnectionManager::get('other_name', false);
- }
- /**
- * Test that configured() finds configured sources.
- *
- * @return void
- */
- public function testConfigured()
- {
- ConnectionManager::setConfig('test_variant', [
- 'className' => __NAMESPACE__ . '\FakeConnection',
- 'database' => ':memory:'
- ]);
- $results = ConnectionManager::configured();
- $this->assertContains('test_variant', $results);
- }
- /**
- * testGetPluginDataSource method
- *
- * @return void
- */
- public function testGetPluginDataSource()
- {
- $this->loadPlugins(['TestPlugin']);
- $name = 'test_variant';
- $config = ['className' => 'TestPlugin.TestSource', 'foo' => 'bar'];
- ConnectionManager::setConfig($name, $config);
- $connection = ConnectionManager::get($name);
- $this->assertInstanceOf('TestPlugin\Datasource\TestSource', $connection);
- unset($config['className']);
- $this->assertSame($config + ['name' => 'test_variant'], $connection->config());
- }
- /**
- * Tests that a connection configuration can be deleted in runtime
- *
- * @return void
- */
- public function testDrop()
- {
- ConnectionManager::setConfig('test_variant', [
- 'className' => __NAMESPACE__ . '\FakeConnection',
- 'database' => ':memory:'
- ]);
- $result = ConnectionManager::configured();
- $this->assertContains('test_variant', $result);
- $this->assertTrue(ConnectionManager::drop('test_variant'));
- $result = ConnectionManager::configured();
- $this->assertNotContains('test_variant', $result);
- $this->assertFalse(ConnectionManager::drop('probably_does_not_exist'), 'Should return false on failure.');
- }
- /**
- * Test aliasing connections.
- *
- * @return void
- */
- public function testAlias()
- {
- ConnectionManager::setConfig('test_variant', [
- 'className' => __NAMESPACE__ . '\FakeConnection',
- 'database' => ':memory:'
- ]);
- ConnectionManager::alias('test_variant', 'other_name');
- $result = ConnectionManager::get('test_variant');
- $this->assertSame($result, ConnectionManager::get('other_name'));
- }
- /**
- * Test alias() raises an error when aliasing an undefined connection.
- *
- * @return void
- */
- public function testAliasError()
- {
- $this->expectException(\Cake\Datasource\Exception\MissingDatasourceConfigException::class);
- $this->assertNotContains('test_kaboom', ConnectionManager::configured());
- ConnectionManager::alias('test_kaboom', 'other_name');
- }
- /**
- * provider for DSN strings.
- *
- * @return array
- */
- public function dsnProvider()
- {
- return [
- 'no user' => [
- 'mysql://localhost:3306/database',
- [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Mysql',
- 'host' => 'localhost',
- 'database' => 'database',
- 'port' => 3306,
- 'scheme' => 'mysql',
- ]
- ],
- 'subdomain host' => [
- 'mysql://my.host-name.com:3306/database',
- [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Mysql',
- 'host' => 'my.host-name.com',
- 'database' => 'database',
- 'port' => 3306,
- 'scheme' => 'mysql',
- ]
- ],
- 'user & pass' => [
- 'mysql://root:secret@localhost:3306/database?log=1',
- [
- 'scheme' => 'mysql',
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Mysql',
- 'host' => 'localhost',
- 'username' => 'root',
- 'password' => 'secret',
- 'port' => 3306,
- 'database' => 'database',
- 'log' => '1'
- ]
- ],
- 'no password' => [
- 'mysql://user@localhost:3306/database',
- [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Mysql',
- 'host' => 'localhost',
- 'database' => 'database',
- 'port' => 3306,
- 'scheme' => 'mysql',
- 'username' => 'user',
- ]
- ],
- 'empty password' => [
- 'mysql://user:@localhost:3306/database',
- [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Mysql',
- 'host' => 'localhost',
- 'database' => 'database',
- 'port' => 3306,
- 'scheme' => 'mysql',
- 'username' => 'user',
- 'password' => '',
- ]
- ],
- 'sqlite memory' => [
- 'sqlite:///:memory:',
- [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Sqlite',
- 'database' => ':memory:',
- 'scheme' => 'sqlite',
- ]
- ],
- 'sqlite path' => [
- 'sqlite:////absolute/path',
- [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Sqlite',
- 'database' => '/absolute/path',
- 'scheme' => 'sqlite',
- ]
- ],
- 'sqlite database query' => [
- 'sqlite:///?database=:memory:',
- [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Sqlite',
- 'database' => ':memory:',
- 'scheme' => 'sqlite',
- ]
- ],
- 'sqlserver' => [
- 'sqlserver://sa:Password12!@.\SQL2012SP1/cakephp?MultipleActiveResultSets=false',
- [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Sqlserver',
- 'host' => '.\SQL2012SP1',
- 'MultipleActiveResultSets' => false,
- 'password' => 'Password12!',
- 'database' => 'cakephp',
- 'scheme' => 'sqlserver',
- 'username' => 'sa',
- ]
- ],
- 'sqllocaldb' => [
- 'sqlserver://username:password@(localdb)\.\DeptSharedLocalDB/database',
- [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Sqlserver',
- 'host' => '(localdb)\.\DeptSharedLocalDB',
- 'password' => 'password',
- 'database' => 'database',
- 'scheme' => 'sqlserver',
- 'username' => 'username',
- ]
- ],
- 'classname query arg' => [
- 'mysql://localhost/database?className=Custom\Driver',
- [
- 'className' => 'Cake\Database\Connection',
- 'database' => 'database',
- 'driver' => 'Custom\Driver',
- 'host' => 'localhost',
- 'scheme' => 'mysql',
- ]
- ],
- 'classname and port' => [
- 'mysql://localhost:3306/database?className=Custom\Driver',
- [
- 'className' => 'Cake\Database\Connection',
- 'database' => 'database',
- 'driver' => 'Custom\Driver',
- 'host' => 'localhost',
- 'scheme' => 'mysql',
- 'port' => 3306,
- ]
- ],
- 'custom connection class' => [
- 'Cake\Database\Connection://localhost:3306/database?driver=Cake\Database\Driver\Mysql',
- [
- 'className' => 'Cake\Database\Connection',
- 'database' => 'database',
- 'driver' => 'Cake\Database\Driver\Mysql',
- 'host' => 'localhost',
- 'scheme' => 'Cake\Database\Connection',
- 'port' => 3306,
- ]
- ],
- 'complex password' => [
- 'mysql://user:/?#][{}$%20@!@localhost:3306/database?log=1"eIdentifiers=1',
- [
- 'className' => 'Cake\Database\Connection',
- 'database' => 'database',
- 'driver' => 'Cake\Database\Driver\Mysql',
- 'host' => 'localhost',
- 'password' => '/?#][{}$%20@!',
- 'port' => 3306,
- 'scheme' => 'mysql',
- 'username' => 'user',
- 'log' => 1,
- 'quoteIdentifiers' => 1,
- ]
- ]
- ];
- }
- /**
- * Test parseDsn method.
- *
- * @dataProvider dsnProvider
- * @return void
- */
- public function testParseDsn($dsn, $expected)
- {
- $result = ConnectionManager::parseDsn($dsn);
- $this->assertEquals($expected, $result);
- }
- /**
- * Test parseDsn invalid.
- *
- * @return void
- */
- public function testParseDsnInvalid()
- {
- $this->expectException(\InvalidArgumentException::class);
- $this->expectExceptionMessage('The DSN string \'bagof:nope\' could not be parsed.');
- $result = ConnectionManager::parseDsn('bagof:nope');
- }
- /**
- * Tests that directly setting an instance in a config, will not return a different
- * instance later on
- *
- * @return void
- */
- public function testConfigWithObject()
- {
- $connection = new FakeConnection;
- ConnectionManager::setConfig('test_variant', $connection);
- $this->assertSame($connection, ConnectionManager::get('test_variant'));
- }
- /**
- * Tests configuring an instance with a callable
- *
- * @return void
- */
- public function testConfigWithCallable()
- {
- $connection = new FakeConnection;
- $callable = function ($alias) use ($connection) {
- $this->assertEquals('test_variant', $alias);
- return $connection;
- };
- ConnectionManager::setConfig('test_variant', $callable);
- $this->assertSame($connection, ConnectionManager::get('test_variant'));
- }
- /**
- * Tests that setting a config will also correctly set the name for the connection
- *
- * @return void
- */
- public function testSetConfigName()
- {
- //Set with explicit name
- ConnectionManager::setConfig('test_variant', [
- 'className' => __NAMESPACE__ . '\FakeConnection',
- 'database' => ':memory:'
- ]);
- $result = ConnectionManager::get('test_variant');
- $this->assertSame('test_variant', $result->configName());
- ConnectionManager::drop('test_variant');
- ConnectionManager::setConfig([
- 'test_variant' => [
- 'className' => __NAMESPACE__ . '\FakeConnection',
- 'database' => ':memory:'
- ]
- ]);
- $result = ConnectionManager::get('test_variant');
- $this->assertSame('test_variant', $result->configName());
- }
- }
|