DriverTest.php 3.53 KB
Newer Older
1 2
<?php

3
namespace Doctrine\DBAL\Tests\Functional\Driver\PDOPgSql;
4

5
use Doctrine\DBAL\Connection;
6
use Doctrine\DBAL\Driver as DriverInterface;
7
use Doctrine\DBAL\Driver\PDOPgSql\Driver;
8 9
use Doctrine\DBAL\Tests\Functional\Driver\AbstractDriverTest;
use Doctrine\DBAL\Tests\TestUtil;
10 11 12 13
use function array_key_exists;
use function extension_loaded;
use function microtime;
use function sprintf;
14 15 16

class DriverTest extends AbstractDriverTest
{
17
    protected function setUp() : void
18 19
    {
        if (! extension_loaded('pdo_pgsql')) {
20
            self::markTestSkipped('pdo_pgsql is not installed.');
21 22 23 24
        }

        parent::setUp();

Sergei Morozov's avatar
Sergei Morozov committed
25
        if ($this->connection->getDriver() instanceof Driver) {
Sergei Morozov's avatar
Sergei Morozov committed
26
            return;
27
        }
Sergei Morozov's avatar
Sergei Morozov committed
28

29
        self::markTestSkipped('pdo_pgsql only test.');
30 31
    }

32
    /**
33
     * @dataProvider getDatabaseParameter
34
     */
35
    public function testDatabaseParameters(?string $databaseName, ?string $defaultDatabaseName, ?string $expectedDatabaseName) : void
36
    {
Sergei Morozov's avatar
Sergei Morozov committed
37
        $params                   = $this->connection->getParams();
Sergei Morozov's avatar
Sergei Morozov committed
38
        $params['dbname']         = $databaseName;
39
        $params['default_dbname'] = $defaultDatabaseName;
40 41 42

        $connection = new Connection(
            $params,
Sergei Morozov's avatar
Sergei Morozov committed
43 44 45
            $this->connection->getDriver(),
            $this->connection->getConfiguration(),
            $this->connection->getEventManager()
46 47
        );

48
        self::assertSame(
49
            $expectedDatabaseName,
50 51 52 53
            $this->driver->getDatabase($connection)
        );
    }

54 55 56 57
    /**
     * @return mixed[][]
     */
    public static function getDatabaseParameter() : iterable
58
    {
59
        $params            = TestUtil::getConnectionParams();
Sergei Morozov's avatar
Sergei Morozov committed
60
        $realDatabaseName  = $params['dbname'] ?? '';
61 62
        $dummyDatabaseName = $realDatabaseName . 'a';

Sergei Morozov's avatar
Sergei Morozov committed
63
        return [
64
            // dbname, default_dbname, expected
Sergei Morozov's avatar
Sergei Morozov committed
65 66 67
            [$realDatabaseName, null, $realDatabaseName],
            [$realDatabaseName, $dummyDatabaseName, $realDatabaseName],
            [null, $realDatabaseName, $realDatabaseName],
68
            [null, null, static::getDatabaseNameForConnectionWithoutDatabaseNameParameter()],
Sergei Morozov's avatar
Sergei Morozov committed
69
        ];
70 71
    }

72 73 74
    /**
     * @group DBAL-1146
     */
75
    public function testConnectsWithApplicationNameParameter() : void
76
    {
Sergei Morozov's avatar
Sergei Morozov committed
77
        $parameters                     = $this->connection->getParams();
78 79
        $parameters['application_name'] = 'doctrine';

Sergei Morozov's avatar
Sergei Morozov committed
80
        $user     = $parameters['user'] ?? null;
81
        $password = $parameters['password'] ?? null;
82 83 84

        $connection = $this->driver->connect($parameters, $user, $password);

Sergei Morozov's avatar
Sergei Morozov committed
85 86
        $hash      = microtime(true); // required to identify the record in the results uniquely
        $sql       = sprintf('SELECT * FROM pg_stat_activity WHERE %d = %d', $hash, $hash);
Steve Müller's avatar
Steve Müller committed
87
        $statement = $connection->query($sql);
Sergei Morozov's avatar
Sergei Morozov committed
88
        $records   = $statement->fetchAll();
Steve Müller's avatar
Steve Müller committed
89 90

        foreach ($records as $record) {
91 92 93 94
            // The query column is named "current_query" on PostgreSQL < 9.2
            $queryColumnName = array_key_exists('current_query', $record) ? 'current_query' : 'query';

            if ($record[$queryColumnName] === $sql) {
95
                self::assertSame('doctrine', $record['application_name']);
Steve Müller's avatar
Steve Müller committed
96 97 98 99 100

                return;
            }
        }

101
        self::fail(sprintf('Query result does not contain a record where column "query" equals "%s".', $sql));
102 103
    }

104
    protected function createDriver() : DriverInterface
105 106 107 108
    {
        return new Driver();
    }

109
    protected static function getDatabaseNameForConnectionWithoutDatabaseNameParameter() : ?string
110
    {
111
        return 'postgres';
112 113
    }
}