StatementTest.php 4.71 KB
Newer Older
1 2
<?php

3
namespace Doctrine\DBAL\Tests;
4

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
use Exception;
Grégoire Paris's avatar
Grégoire Paris committed
15
use PHPUnit\Framework\MockObject\MockObject;
16
use PHPUnit\Framework\TestCase;
17

18
class StatementTest extends TestCase
19
{
Grégoire Paris's avatar
Grégoire Paris committed
20
    /** @var Connection&MockObject */
21
    private $conn;
22

Grégoire Paris's avatar
Grégoire Paris committed
23
    /** @var Configuration&MockObject */
24
    private $configuration;
25

26
    /** @var DriverStatement&MockObject */
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
        $this->conn->expects(self::atLeastOnce())
43
                ->method('getWrappedConnection')
44
                ->will(self::returnValue($driverConnection));
45

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

51
        $this->conn->expects(self::any())
52
            ->method('getDriver')
53
            ->will(self::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
        $logger->expects(self::once())
67
                ->method('startQuery')
68
                ->with(self::equalTo($sql), self::equalTo($values), self::equalTo($types));
69

70
        $this->configuration->expects(self::once())
71
                ->method('getSQLLogger')
72
                ->will(self::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
        $logger->expects(self::once())
89
                ->method('startQuery')
90
                ->with(self::equalTo($sql), self::equalTo($values), self::equalTo($types));
91

92
        $this->configuration->expects(self::once())
93
                ->method('getSQLLogger')
94
                ->will(self::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
        $this->configuration->expects(self::once())
127
            ->method('getSQLLogger')
128
            ->will(self::returnValue($logger));
129

130
        $this->conn->expects(self::any())
131
            ->method('handleExceptionDuringQuery')
132
            ->will(self::throwException(new DBALException()));
133

134
        $logger->expects(self::once())
135 136
            ->method('startQuery');

137
        $logger->expects(self::once())
138 139
            ->method('stopQuery');

140
        $this->driverStatement->expects(self::once())
141
            ->method('execute')
142
            ->will(self::throwException(new Exception('Mock test exception')));
143

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

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

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