StatementTest.php 4.8 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;

Sergei Morozov's avatar
Sergei Morozov committed
7 8
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\Connection;
9
use Doctrine\DBAL\DBALException;
Sergei Morozov's avatar
Sergei Morozov committed
10 11
use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Driver\Connection as DriverConnection;
12
use Doctrine\DBAL\Driver\Statement as DriverStatement;
Sergei Morozov's avatar
Sergei Morozov committed
13
use Doctrine\DBAL\Logging\SQLLogger;
14
use Doctrine\DBAL\ParameterType;
15
use Doctrine\DBAL\Statement;
Sergei Morozov's avatar
Sergei Morozov committed
16 17
use Doctrine\Tests\DbalTestCase;
use Exception;
18
use PHPUnit\Framework\MockObject\MockObject;
19

Sergei Morozov's avatar
Sergei Morozov committed
20
class StatementTest extends DbalTestCase
21
{
22
    /** @var Connection|MockObject */
23
    private $conn;
24

25
    /** @var Configuration|MockObject */
26
    private $configuration;
27

28
    /** @var DriverStatement|MockObject */
29
    private $driverStatement;
30

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

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

39 40 41 42
        $driver = $this->createMock(Driver::class);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

151 152
        $statement->execute();
    }
153
}