StatementTest.php 4.97 KB
Newer Older
1 2 3 4
<?php

namespace Doctrine\Tests\DBAL;

Sergei Morozov's avatar
Sergei Morozov committed
5 6
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\Connection;
Sergei Morozov's avatar
Sergei Morozov committed
7 8
use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Driver\Connection as DriverConnection;
Sergei Morozov's avatar
Sergei Morozov committed
9
use Doctrine\DBAL\Logging\SQLLogger;
10
use Doctrine\DBAL\ParameterType;
11
use Doctrine\DBAL\Statement;
Sergei Morozov's avatar
Sergei Morozov committed
12 13 14 15
use Doctrine\Tests\DBAL\Mocks\MockPlatform;
use Doctrine\Tests\DbalTestCase;
use Exception;
use PDOStatement;
16

Sergei Morozov's avatar
Sergei Morozov committed
17
class StatementTest extends DbalTestCase
18
{
Sergei Morozov's avatar
Sergei Morozov committed
19
    /** @var Connection */
20
    private $conn;
21

Sergei Morozov's avatar
Sergei Morozov committed
22
    /** @var Configuration */
23
    private $configuration;
24

Sergei Morozov's avatar
Sergei Morozov committed
25
    /** @var PDOStatement */
26 27
    private $pdoStatement;

28
    protected function setUp()
29
    {
Sergei Morozov's avatar
Sergei Morozov committed
30
        $this->pdoStatement = $this->getMockBuilder(PDOStatement::class)
Sergei Morozov's avatar
Sergei Morozov committed
31
            ->setMethods(['execute', 'bindParam', 'bindValue'])
32
            ->getMock();
Sergei Morozov's avatar
Sergei Morozov committed
33
        $platform           = new MockPlatform();
Sergei Morozov's avatar
Sergei Morozov committed
34
        $driverConnection   = $this->createMock(DriverConnection::class);
35 36
        $driverConnection->expects($this->any())
                ->method('prepare')
37
                ->will($this->returnValue($this->pdoStatement));
38

Sergei Morozov's avatar
Sergei Morozov committed
39
        $driver          = $this->createMock(Driver::class);
Sergei Morozov's avatar
Sergei Morozov committed
40 41 42 43
        $constructorArgs = [
            ['platform' => $platform],
            $driver,
        ];
Sergei Morozov's avatar
Sergei Morozov committed
44
        $this->conn      = $this->getMockBuilder(Connection::class)
45 46
            ->setConstructorArgs($constructorArgs)
            ->getMock();
47 48 49
        $this->conn->expects($this->atLeastOnce())
                ->method('getWrappedConnection')
                ->will($this->returnValue($driverConnection));
50

Sergei Morozov's avatar
Sergei Morozov committed
51
        $this->configuration = $this->createMock(Configuration::class);
52 53 54
        $this->conn->expects($this->any())
                ->method('getConfiguration')
                ->will($this->returnValue($this->configuration));
55 56 57 58

        $this->conn->expects($this->any())
            ->method('getDriver')
            ->will($this->returnValue($driver));
59
    }
60

61 62
    public function testExecuteCallsLoggerStartQueryWithParametersWhenValuesBound()
    {
63 64 65 66 67 68
        $name   = 'foo';
        $var    = 'bar';
        $type   = ParameterType::STRING;
        $values = [$name => $var];
        $types  = [$name => $type];
        $sql    = '';
69

Sergei Morozov's avatar
Sergei Morozov committed
70
        $logger = $this->createMock(SQLLogger::class);
71 72 73
        $logger->expects($this->once())
                ->method('startQuery')
                ->with($this->equalTo($sql), $this->equalTo($values), $this->equalTo($types));
74

75 76 77
        $this->configuration->expects($this->once())
                ->method('getSQLLogger')
                ->will($this->returnValue($logger));
78

79
        $statement = new Statement($sql, $this->conn);
80 81 82
        $statement->bindValue($name, $var, $type);
        $statement->execute();
    }
83

84 85
    public function testExecuteCallsLoggerStartQueryWithParametersWhenParamsPassedToExecute()
    {
Sergei Morozov's avatar
Sergei Morozov committed
86 87 88 89 90
        $name   = 'foo';
        $var    = 'bar';
        $values = [$name => $var];
        $types  = [];
        $sql    = '';
91

Sergei Morozov's avatar
Sergei Morozov committed
92
        $logger = $this->createMock(SQLLogger::class);
93 94 95
        $logger->expects($this->once())
                ->method('startQuery')
                ->with($this->equalTo($sql), $this->equalTo($values), $this->equalTo($types));
96

97 98 99
        $this->configuration->expects($this->once())
                ->method('getSQLLogger')
                ->will($this->returnValue($logger));
100

101
        $statement = new Statement($sql, $this->conn);
102 103
        $statement->execute($values);
    }
104

105 106
    public function testExecuteCallsStartQueryWithTheParametersBoundViaBindParam()
    {
107 108
        $name   = 'foo';
        $var    = 'bar';
109
        $values = [$name => $var];
110 111
        $types  = [$name => ParameterType::STRING];
        $sql    = '';
112

113 114
        $logger = $this->createMock(SQLLogger::class);
        $logger->expects(self::once())
115
                ->method('startQuery')
116
                ->with(self::equalTo($sql), self::equalTo($values), self::equalTo($types));
117

118
        $this->configuration->expects(self::once())
119
                ->method('getSQLLogger')
120
                ->willReturn($logger);
121 122 123 124 125 126

        $statement = new Statement($sql, $this->conn);
        $statement->bindParam($name, $var);
        $statement->execute();
    }

127 128 129 130 131
    /**
     * @expectedException \Doctrine\DBAL\DBALException
     */
    public function testExecuteCallsLoggerStopQueryOnException()
    {
Sergei Morozov's avatar
Sergei Morozov committed
132
        $logger = $this->createMock(SQLLogger::class);
133 134 135 136 137 138 139 140

        $this->configuration->expects($this->once())
            ->method('getSQLLogger')
            ->will($this->returnValue($logger));

        // Needed to satisfy construction of DBALException
        $this->conn->expects($this->any())
            ->method('resolveParams')
Sergei Morozov's avatar
Sergei Morozov committed
141
            ->will($this->returnValue([]));
142 143 144 145 146 147 148 149 150

        $logger->expects($this->once())
            ->method('startQuery');

        $logger->expects($this->once())
            ->method('stopQuery');

        $this->pdoStatement->expects($this->once())
            ->method('execute')
Sergei Morozov's avatar
Sergei Morozov committed
151
            ->will($this->throwException(new Exception('Mock test exception')));
152

Sergei Morozov's avatar
Sergei Morozov committed
153
        $statement = new Statement('', $this->conn);
154 155
        $statement->execute();
    }
156
}