StatementTest.php 4.71 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;
7
use Doctrine\DBAL\DBALException;
Sergei Morozov's avatar
Sergei Morozov committed
8 9
use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Driver\Connection as DriverConnection;
10
use Doctrine\DBAL\Driver\Statement as DriverStatement;
Sergei Morozov's avatar
Sergei Morozov committed
11
use Doctrine\DBAL\Logging\SQLLogger;
12
use Doctrine\DBAL\ParameterType;
13
use Doctrine\DBAL\Statement;
Sergei Morozov's avatar
Sergei Morozov committed
14 15 16
use Doctrine\Tests\DbalTestCase;
use Exception;
use PDOStatement;
17

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

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

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

29
    protected function setUp() : void
30
    {
31
        $this->driverStatement = $this->createMock(DriverStatement::class);
32

33 34 35
        $driverConnection = $this->createConfiguredMock(DriverConnection::class, [
            'prepare' => $this->driverStatement,
        ]);
36

37 38 39 40
        $driver = $this->createMock(Driver::class);

        $this->conn = $this->getMockBuilder(Connection::class)
            ->setConstructorArgs([[], $driver])
41
            ->getMock();
42 43 44
        $this->conn->expects($this->atLeastOnce())
                ->method('getWrappedConnection')
                ->will($this->returnValue($driverConnection));
45

Sergei Morozov's avatar
Sergei Morozov committed
46
        $this->configuration = $this->createMock(Configuration::class);
47 48 49
        $this->conn->expects($this->any())
                ->method('getConfiguration')
                ->will($this->returnValue($this->configuration));
50 51 52 53

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

56
    public function testExecuteCallsLoggerStartQueryWithParametersWhenValuesBound() : void
57
    {
58 59 60 61 62 63
        $name   = 'foo';
        $var    = 'bar';
        $type   = ParameterType::STRING;
        $values = [$name => $var];
        $types  = [$name => $type];
        $sql    = '';
64

Sergei Morozov's avatar
Sergei Morozov committed
65
        $logger = $this->createMock(SQLLogger::class);
66 67 68
        $logger->expects($this->once())
                ->method('startQuery')
                ->with($this->equalTo($sql), $this->equalTo($values), $this->equalTo($types));
69

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

74
        $statement = new Statement($sql, $this->conn);
75 76 77
        $statement->bindValue($name, $var, $type);
        $statement->execute();
    }
78

79
    public function testExecuteCallsLoggerStartQueryWithParametersWhenParamsPassedToExecute() : void
80
    {
Sergei Morozov's avatar
Sergei Morozov committed
81 82 83 84 85
        $name   = 'foo';
        $var    = 'bar';
        $values = [$name => $var];
        $types  = [];
        $sql    = '';
86

Sergei Morozov's avatar
Sergei Morozov committed
87
        $logger = $this->createMock(SQLLogger::class);
88 89 90
        $logger->expects($this->once())
                ->method('startQuery')
                ->with($this->equalTo($sql), $this->equalTo($values), $this->equalTo($types));
91

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

96
        $statement = new Statement($sql, $this->conn);
97 98
        $statement->execute($values);
    }
99

100
    public function testExecuteCallsStartQueryWithTheParametersBoundViaBindParam() : void
101
    {
102 103
        $name   = 'foo';
        $var    = 'bar';
104
        $values = [$name => $var];
105 106
        $types  = [$name => ParameterType::STRING];
        $sql    = '';
107

108 109
        $logger = $this->createMock(SQLLogger::class);
        $logger->expects(self::once())
110
                ->method('startQuery')
111
                ->with(self::equalTo($sql), self::equalTo($values), self::equalTo($types));
112

113
        $this->configuration->expects(self::once())
114
                ->method('getSQLLogger')
115
                ->willReturn($logger);
116 117 118 119 120 121

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

122
    public function testExecuteCallsLoggerStopQueryOnException() : void
123
    {
Sergei Morozov's avatar
Sergei Morozov committed
124
        $logger = $this->createMock(SQLLogger::class);
125 126 127 128 129 130 131 132

        $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
133
            ->will($this->returnValue([]));
134 135 136 137 138 139 140

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

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

141
        $this->driverStatement->expects($this->once())
142
            ->method('execute')
Sergei Morozov's avatar
Sergei Morozov committed
143
            ->will($this->throwException(new Exception('Mock test exception')));
144

Sergei Morozov's avatar
Sergei Morozov committed
145
        $statement = new Statement('', $this->conn);
146 147 148

        $this->expectException(DBALException::class);

149 150
        $statement->execute();
    }
151
}