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

Michael Moravec's avatar
Michael Moravec committed
3 4
declare(strict_types=1);

5 6
namespace Doctrine\Tests\DBAL\Functional\Driver\PDOPgSql;

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

class DriverTest extends AbstractDriverTest
{
19
    protected function setUp() : void
20 21 22 23 24 25 26
    {
        if (! extension_loaded('pdo_pgsql')) {
            $this->markTestSkipped('pdo_pgsql is not installed.');
        }

        parent::setUp();

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

        $this->markTestSkipped('pdo_pgsql only test.');
32 33
    }

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

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

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

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

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

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

82 83
        $user     = $parameters['user'] ?? '';
        $password = $parameters['password'] ?? '';
84 85 86

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

Sergei Morozov's avatar
Sergei Morozov committed
87 88
        $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
89
        $statement = $connection->query($sql);
Sergei Morozov's avatar
Sergei Morozov committed
90
        $records   = $statement->fetchAll();
Steve Müller's avatar
Steve Müller committed
91 92

        foreach ($records as $record) {
93 94 95 96
            // 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) {
97
                self::assertSame('doctrine', $record['application_name']);
Steve Müller's avatar
Steve Müller committed
98 99 100 101 102 103

                return;
            }
        }

        $this->fail(sprintf('Query result does not contain a record where column "query" equals "%s".', $sql));
104 105
    }

106 107 108
    /**
     * {@inheritdoc}
     */
109
    protected function createDriver() : DriverInterface
110 111 112 113 114 115 116
    {
        return new Driver();
    }

    /**
     * {@inheritdoc}
     */
117
    protected static function getDatabaseNameForConnectionWithoutDatabaseNameParameter() : ?string
118
    {
119
        return 'postgres';
120 121
    }
}