DriverTest.php 3.5 KB
Newer Older
1 2 3 4
<?php

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

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

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

        parent::setUp();

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

        $this->markTestSkipped('pdo_pgsql only test.');
29 30
    }

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

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

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

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

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

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

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

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

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

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

                return;
            }
        }

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

103 104 105 106 107 108 109 110 111 112 113
    /**
     * {@inheritdoc}
     */
    protected function createDriver()
    {
        return new Driver();
    }

    /**
     * {@inheritdoc}
     */
114
    protected static function getDatabaseNameForConnectionWithoutDatabaseNameParameter() : ?string
115
    {
116
        return 'postgres';
117 118
    }
}