<?php

namespace Doctrine\Tests\DBAL\Driver;

use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Platforms\PostgreSQL100Platform;
use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
use Doctrine\DBAL\Schema\PostgreSqlSchemaManager;

class AbstractPostgreSQLDriverTest extends AbstractDriverTest
{
    public function testReturnsDatabaseName()
    {
        parent::testReturnsDatabaseName();

        $database = 'bloo';
        $params   = array(
            'user'     => 'foo',
            'password' => 'bar',
        );

        $statement = $this->createMock('Doctrine\Tests\Mocks\DriverResultStatementMock');

        $statement->expects($this->once())
            ->method('fetchColumn')
            ->will($this->returnValue($database));

        $connection = $this->getConnectionMock();

        $connection->expects($this->once())
            ->method('getParams')
            ->will($this->returnValue($params));

        $connection->expects($this->once())
            ->method('query')
            ->will($this->returnValue($statement));

        self::assertSame($database, $this->driver->getDatabase($connection));
    }

    protected function createDriver()
    {
        return $this->getMockForAbstractClass('Doctrine\DBAL\Driver\AbstractPostgreSQLDriver');
    }

    protected function createPlatform()
    {
        return new PostgreSqlPlatform();
    }

    protected function createSchemaManager(Connection $connection)
    {
        return new PostgreSqlSchemaManager($connection);
    }

    protected function getDatabasePlatformsForVersions()
    {
        return array(
            array('9.0.9', 'Doctrine\DBAL\Platforms\PostgreSqlPlatform'),
            array('9.1', 'Doctrine\DBAL\Platforms\PostgreSQL91Platform'),
            array('9.1.0', 'Doctrine\DBAL\Platforms\PostgreSQL91Platform'),
            array('9.1.1', 'Doctrine\DBAL\Platforms\PostgreSQL91Platform'),
            array('9.1.9', 'Doctrine\DBAL\Platforms\PostgreSQL91Platform'),
            array('9.2', 'Doctrine\DBAL\Platforms\PostgreSQL92Platform'),
            array('9.2.0', 'Doctrine\DBAL\Platforms\PostgreSQL92Platform'),
            array('9.2.1', 'Doctrine\DBAL\Platforms\PostgreSQL92Platform'),
            array('9.3.6', 'Doctrine\DBAL\Platforms\PostgreSQL92Platform'),
            array('9.4', 'Doctrine\DBAL\Platforms\PostgreSQL94Platform'),
            array('9.4.0', 'Doctrine\DBAL\Platforms\PostgreSQL94Platform'),
            array('9.4.1', 'Doctrine\DBAL\Platforms\PostgreSQL94Platform'),
            array('10', PostgreSQL100Platform::class),
        );
    }

    protected function getExceptionConversionData()
    {
        return array(
            self::EXCEPTION_CONNECTION => array(
                array(null, '7', 'SQLSTATE[08006]'),
            ),
            self::EXCEPTION_FOREIGN_KEY_CONSTRAINT_VIOLATION => array(
                array(null, '23503', null),
            ),
            self::EXCEPTION_INVALID_FIELD_NAME => array(
                array(null, '42703', null),
            ),
            self::EXCEPTION_NON_UNIQUE_FIELD_NAME => array(
                array(null, '42702', null),
            ),
            self::EXCEPTION_NOT_NULL_CONSTRAINT_VIOLATION => array(
                array(null, '23502', null),
            ),
            self::EXCEPTION_SYNTAX_ERROR => array(
                array(null, '42601', null),
            ),
            self::EXCEPTION_TABLE_EXISTS => array(
                array(null, '42P07', null),
            ),
            self::EXCEPTION_TABLE_NOT_FOUND => array(
                array(null, '42P01', null),
            ),
            self::EXCEPTION_UNIQUE_CONSTRAINT_VIOLATION => array(
                array(null, '23505', null),
            ),
            self::EXCEPTION_DEADLOCK => array(
                array(null, '40001', null),
                array(null, '40P01', null),
            ),
        );
    }
}