Failed Conditions
Pull Request — master (#2849)
by Luís
63:28
created

testIsRollbackOnlyThrowsExceptionNoActiveTransaction()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
3
namespace Doctrine\Tests\DBAL;
4
5
use Doctrine\Common\Cache\Cache;
6
use Doctrine\Common\EventManager;
7
use Doctrine\DBAL\Cache\ArrayStatement;
8
use Doctrine\DBAL\Cache\QueryCacheProfile;
9
use Doctrine\DBAL\Configuration;
10
use Doctrine\DBAL\Connection;
11
use Doctrine\DBAL\ConnectionException;
12
use Doctrine\DBAL\DBALException;
13
use Doctrine\DBAL\Driver;
14
use Doctrine\DBAL\Events;
15
use Doctrine\DBAL\Exception\InvalidArgumentException;
16
use Doctrine\DBAL\Platforms\AbstractPlatform;
17
use Doctrine\Tests\Mocks\DriverConnectionMock;
18
use Doctrine\Tests\Mocks\DriverMock;
19
use Doctrine\Tests\Mocks\VersionAwarePlatformDriverMock;
20
21
class ConnectionTest extends \Doctrine\Tests\DbalTestCase
22
{
23
    /**
24
     * @var \Doctrine\DBAL\Connection
25
     */
26
    protected $_conn = null;
27
28
    protected $params = array(
29
        'driver' => 'pdo_mysql',
30
        'host' => 'localhost',
31
        'user' => 'root',
32
        'password' => 'password',
33
        'port' => '1234'
34
    );
35
36
    protected function setUp()
37
    {
38
        $this->_conn = \Doctrine\DBAL\DriverManager::getConnection($this->params);
39
    }
40
41
    public function getExecuteUpdateMockConnection()
42
    {
43
        $driverMock = $this->createMock(\Doctrine\DBAL\Driver::class);
44
45
        $driverMock->expects($this->any())
46
            ->method('connect')
47
            ->will($this->returnValue(new DriverConnectionMock()));
48
49
        $conn = $this->getMockBuilder(Connection::class)
50
            ->setMethods(['executeUpdate'])
51
            ->setConstructorArgs([['platform' => new Mocks\MockPlatform()], $driverMock])
52
            ->getMock();
53
54
        return $conn;
55
    }
56
57
    public function testIsConnected()
58
    {
59
        self::assertFalse($this->_conn->isConnected());
60
    }
61
62
    public function testNoTransactionActiveByDefault()
63
    {
64
        self::assertFalse($this->_conn->isTransactionActive());
65
    }
66
67
    public function testCommitThrowsExceptionWithNoActiveTransaction()
68
    {
69
        $this->expectException(ConnectionException::class);
70
        $this->_conn->commit();
71
    }
72
73
    public function testRollbackThrowsExceptionWithNoActiveTransaction()
74
    {
75
        $this->expectException(ConnectionException::class);
76
        $this->_conn->rollBack();
77
    }
78
79
    public function testSetRollbackOnlyThrowsExceptionNoActiveTransaction()
80
    {
81
        $this->expectException(ConnectionException::class);
82
        $this->_conn->setRollbackOnly();
83
    }
84
85
    public function testIsRollbackOnlyThrowsExceptionNoActiveTransaction()
86
    {
87
        $this->expectException(ConnectionException::class);
88
        $this->_conn->isRollbackOnly();
89
    }
90
91
    public function testGetConfiguration()
92
    {
93
        $config = $this->_conn->getConfiguration();
94
95
        self::assertInstanceOf('Doctrine\DBAL\Configuration', $config);
96
    }
97
98
    public function testGetHost()
99
    {
100
        self::assertEquals('localhost', $this->_conn->getHost());
101
    }
102
103
    public function testGetPort()
104
    {
105
        self::assertEquals('1234', $this->_conn->getPort());
106
    }
107
108
    public function testGetUsername()
109
    {
110
        self::assertEquals('root', $this->_conn->getUsername());
111
    }
112
113
    public function testGetPassword()
114
    {
115
        self::assertEquals('password', $this->_conn->getPassword());
116
    }
117
118
    public function testGetDriver()
119
    {
120
        self::assertInstanceOf('Doctrine\DBAL\Driver\PDOMySql\Driver', $this->_conn->getDriver());
121
    }
122
123
    public function testGetEventManager()
124
    {
125
        self::assertInstanceOf('Doctrine\Common\EventManager', $this->_conn->getEventManager());
126
    }
127
128
    public function testConnectDispatchEvent()
129
    {
130
        $listenerMock = $this->getMockBuilder('ConnectDispatchEventListener')
131
            ->setMethods(array('postConnect'))
132
            ->getMock();
133
        $listenerMock->expects($this->once())->method('postConnect');
134
135
        $eventManager = new EventManager();
136
        $eventManager->addEventListener(array(Events::postConnect), $listenerMock);
137
138
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
139
        $driverMock->expects(($this->at(0)))
140
                   ->method('connect');
141
        $platform = new Mocks\MockPlatform();
142
143
        $conn = new Connection(array('platform' => $platform), $driverMock, new Configuration(), $eventManager);
144
        $conn->connect();
145
    }
146
147
    public function testEventManagerPassedToPlatform()
148
    {
149
        $driverMock = new DriverMock();
150
        $connection = new Connection($this->params, $driverMock);
151
        self::assertInstanceOf('Doctrine\Common\EventManager', $connection->getDatabasePlatform()->getEventManager());
152
        self::assertSame($connection->getEventManager(), $connection->getDatabasePlatform()->getEventManager());
153
    }
154
155
    /**
156
     * @expectedException \Doctrine\DBAL\DBALException
157
     * @dataProvider getQueryMethods
158
     */
159
    public function testDriverExceptionIsWrapped($method)
160
    {
161
        $this->expectException(DBALException::class);
162
        $this->expectExceptionMessage("An exception occurred while executing 'MUUHAAAAHAAAA':\n\nSQLSTATE[HY000]: General error: 1 near \"MUUHAAAAHAAAA\"");
163
164
        $con = \Doctrine\DBAL\DriverManager::getConnection(array(
165
            'driver' => 'pdo_sqlite',
166
            'memory' => true,
167
        ));
168
169
        $con->$method('MUUHAAAAHAAAA');
170
    }
171
172
    public function getQueryMethods()
173
    {
174
        return array(
175
            array('exec'),
176
            array('query'),
177
            array('executeQuery'),
178
            array('executeUpdate'),
179
            array('prepare'),
180
        );
181
    }
182
183
    /**
184
     * Pretty dumb test, however we want to check that the EchoSQLLogger correctly implements the interface.
185
     *
186
     * @group DBAL-11
187
     */
188
    public function testEchoSQLLogger()
189
    {
190
        $logger = new \Doctrine\DBAL\Logging\EchoSQLLogger();
191
        $this->_conn->getConfiguration()->setSQLLogger($logger);
192
        self::assertSame($logger, $this->_conn->getConfiguration()->getSQLLogger());
193
    }
194
195
    /**
196
     * Pretty dumb test, however we want to check that the DebugStack correctly implements the interface.
197
     *
198
     * @group DBAL-11
199
     */
200
    public function testDebugSQLStack()
201
    {
202
        $logger = new \Doctrine\DBAL\Logging\DebugStack();
203
        $this->_conn->getConfiguration()->setSQLLogger($logger);
204
        self::assertSame($logger, $this->_conn->getConfiguration()->getSQLLogger());
205
    }
206
207
    /**
208
     * @group DBAL-81
209
     */
210
    public function testIsAutoCommit()
211
    {
212
        self::assertTrue($this->_conn->isAutoCommit());
213
    }
214
215
    /**
216
     * @group DBAL-81
217
     */
218
    public function testSetAutoCommit()
219
    {
220
        $this->_conn->setAutoCommit(false);
221
        self::assertFalse($this->_conn->isAutoCommit());
222
        $this->_conn->setAutoCommit(0);
0 ignored issues
show
Documentation introduced by
0 is of type integer, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
223
        self::assertFalse($this->_conn->isAutoCommit());
224
    }
225
226
    /**
227
     * @group DBAL-81
228
     */
229 View Code Duplication
    public function testConnectStartsTransactionInNoAutoCommitMode()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
230
    {
231
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
232
        $driverMock->expects($this->any())
233
            ->method('connect')
234
            ->will($this->returnValue(new DriverConnectionMock()));
235
        $conn = new Connection(array('platform' => new Mocks\MockPlatform()), $driverMock);
236
237
        $conn->setAutoCommit(false);
238
239
        self::assertFalse($conn->isTransactionActive());
240
241
        $conn->connect();
242
243
        self::assertTrue($conn->isTransactionActive());
244
    }
245
246
    /**
247
     * @group DBAL-81
248
     */
249 View Code Duplication
    public function testCommitStartsTransactionInNoAutoCommitMode()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
250
    {
251
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
252
        $driverMock->expects($this->any())
253
            ->method('connect')
254
            ->will($this->returnValue(new DriverConnectionMock()));
255
        $conn = new Connection(array('platform' => new Mocks\MockPlatform()), $driverMock);
256
257
        $conn->setAutoCommit(false);
258
        $conn->connect();
259
        $conn->commit();
260
261
        self::assertTrue($conn->isTransactionActive());
262
    }
263
264
    /**
265
     * @group DBAL-81
266
     */
267 View Code Duplication
    public function testRollBackStartsTransactionInNoAutoCommitMode()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
268
    {
269
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
270
        $driverMock->expects($this->any())
271
            ->method('connect')
272
            ->will($this->returnValue(new DriverConnectionMock()));
273
        $conn = new Connection(array('platform' => new Mocks\MockPlatform()), $driverMock);
274
275
        $conn->setAutoCommit(false);
276
        $conn->connect();
277
        $conn->rollBack();
278
279
        self::assertTrue($conn->isTransactionActive());
280
    }
281
282
    /**
283
     * @group DBAL-81
284
     */
285
    public function testSwitchingAutoCommitModeCommitsAllCurrentTransactions()
286
    {
287
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
288
        $driverMock->expects($this->any())
289
            ->method('connect')
290
            ->will($this->returnValue(new DriverConnectionMock()));
291
        $conn = new Connection(array('platform' => new Mocks\MockPlatform()), $driverMock);
292
293
        $conn->connect();
294
        $conn->beginTransaction();
295
        $conn->beginTransaction();
296
        $conn->setAutoCommit(false);
297
298
        self::assertSame(1, $conn->getTransactionNestingLevel());
299
300
        $conn->beginTransaction();
301
        $conn->beginTransaction();
302
        $conn->setAutoCommit(true);
303
304
        self::assertFalse($conn->isTransactionActive());
305
    }
306
307
    public function testEmptyInsert()
308
    {
309
        $conn = $this->getExecuteUpdateMockConnection();
310
311
        $conn->expects($this->once())
312
            ->method('executeUpdate')
313
            ->with('INSERT INTO footable () VALUES ()');
314
315
        $conn->insert('footable', array());
316
    }
317
318
    /**
319
     * @group DBAL-2511
320
     */
321
    public function testUpdateWithDifferentColumnsInDataAndIdentifiers()
322
    {
323
        $conn = $this->getExecuteUpdateMockConnection();
324
325
        $conn->expects($this->once())
326
            ->method('executeUpdate')
327
            ->with(
328
                'UPDATE TestTable SET text = ?, is_edited = ? WHERE id = ? AND name = ?',
329
                [
330
                    'some text',
331
                    true,
332
                    1,
333
                    'foo',
334
                ],
335
                [
336
                    'string',
337
                    'boolean',
338
                    'integer',
339
                    'string',
340
                ]
341
            );
342
343
        $conn->update(
344
            'TestTable',
345
            [
346
                'text' => 'some text',
347
                'is_edited' => true,
348
            ],
349
            [
350
                'id' => 1,
351
                'name' => 'foo',
352
            ],
353
            [
354
                'text' => 'string',
355
                'is_edited' => 'boolean',
356
                'id' => 'integer',
357
                'name' => 'string',
358
            ]
359
        );
360
    }
361
362
    /**
363
     * @group DBAL-2511
364
     */
365 View Code Duplication
    public function testUpdateWithSameColumnInDataAndIdentifiers()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
366
    {
367
        $conn = $this->getExecuteUpdateMockConnection();
368
369
        $conn->expects($this->once())
370
            ->method('executeUpdate')
371
            ->with(
372
                'UPDATE TestTable SET text = ?, is_edited = ? WHERE id = ? AND is_edited = ?',
373
                [
374
                    'some text',
375
                    true,
376
                    1,
377
                    false,
378
                ],
379
                [
380
                    'string',
381
                    'boolean',
382
                    'integer',
383
                    'boolean',
384
                ]
385
            );
386
387
        $conn->update(
388
            'TestTable',
389
            [
390
                'text' => 'some text',
391
                'is_edited' => true,
392
            ],
393
            [
394
                'id' => 1,
395
                'is_edited' => false,
396
            ],
397
            [
398
                'text' => 'string',
399
                'is_edited' => 'boolean',
400
                'id' => 'integer',
401
            ]
402
        );
403
    }
404
405
    /**
406
     * @group DBAL-2688
407
     */
408 View Code Duplication
    public function testUpdateWithIsNull()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
409
    {
410
        $conn = $this->getExecuteUpdateMockConnection();
411
412
        $conn->expects($this->once())
413
            ->method('executeUpdate')
414
            ->with(
415
                'UPDATE TestTable SET text = ?, is_edited = ? WHERE id IS NULL AND name = ?',
416
                [
417
                    'some text',
418
                    null,
419
                    'foo',
420
                ],
421
                [
422
                    'string',
423
                    'boolean',
424
                    'string',
425
                ]
426
            );
427
428
        $conn->update(
429
            'TestTable',
430
            [
431
                'text' => 'some text',
432
                'is_edited' => null,
433
            ],
434
            [
435
                'id' => null,
436
                'name' => 'foo',
437
            ],
438
            [
439
                'text' => 'string',
440
                'is_edited' => 'boolean',
441
                'id' => 'integer',
442
                'name' => 'string',
443
            ]
444
        );
445
    }
446
447
    /**
448
     * @group DBAL-2688
449
     */
450
    public function testDeleteWithIsNull()
451
    {
452
        $conn = $this->getExecuteUpdateMockConnection();
453
454
        $conn->expects($this->once())
455
            ->method('executeUpdate')
456
            ->with(
457
                'DELETE FROM TestTable WHERE id IS NULL AND name = ?',
458
                [
459
                    'foo',
460
                ],
461
                [
462
                    'string',
463
                ]
464
            );
465
466
        $conn->delete(
467
            'TestTable',
468
            [
469
                'id' => null,
470
                'name' => 'foo',
471
            ],
472
            [
473
                'id' => 'integer',
474
                'name' => 'string',
475
            ]
476
        );
477
    }
478
479 View Code Duplication
    public function testFetchAssoc()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
480
    {
481
        $statement = 'SELECT * FROM foo WHERE bar = ?';
482
        $params    = array(666);
483
        $types     = array(\PDO::PARAM_INT);
484
        $result    = array();
485
486
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
487
488
        $driverMock->expects($this->any())
489
            ->method('connect')
490
            ->will($this->returnValue(new DriverConnectionMock()));
491
492
        $driverStatementMock = $this->createMock('Doctrine\Tests\Mocks\DriverStatementMock');
493
494
        $driverStatementMock->expects($this->once())
495
            ->method('fetch')
496
            ->with(\PDO::FETCH_ASSOC)
497
            ->will($this->returnValue($result));
498
499
        /** @var \PHPUnit_Framework_MockObject_MockObject|\Doctrine\DBAL\Connection $conn */
500
        $conn = $this->getMockBuilder('Doctrine\DBAL\Connection')
501
            ->setMethods(array('executeQuery'))
502
            ->setConstructorArgs(array(array('platform' => new Mocks\MockPlatform()), $driverMock))
503
            ->getMock();
504
505
        $conn->expects($this->once())
0 ignored issues
show
Bug introduced by
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Doctrine\DBAL\Connection.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
506
            ->method('executeQuery')
507
            ->with($statement, $params, $types)
508
            ->will($this->returnValue($driverStatementMock));
509
510
        self::assertSame($result, $conn->fetchAssoc($statement, $params, $types));
0 ignored issues
show
Bug introduced by
The method fetchAssoc does only exist in Doctrine\DBAL\Connection, but not in PHPUnit_Framework_MockObject_MockObject.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
511
    }
512
513 View Code Duplication
    public function testFetchArray()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
514
    {
515
        $statement = 'SELECT * FROM foo WHERE bar = ?';
516
        $params    = array(666);
517
        $types     = array(\PDO::PARAM_INT);
518
        $result    = array();
519
520
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
521
522
        $driverMock->expects($this->any())
523
            ->method('connect')
524
            ->will($this->returnValue(new DriverConnectionMock()));
525
526
        $driverStatementMock = $this->createMock('Doctrine\Tests\Mocks\DriverStatementMock');
527
528
        $driverStatementMock->expects($this->once())
529
            ->method('fetch')
530
            ->with(\PDO::FETCH_NUM)
531
            ->will($this->returnValue($result));
532
533
        /** @var \PHPUnit_Framework_MockObject_MockObject|\Doctrine\DBAL\Connection $conn */
534
        $conn = $this->getMockBuilder('Doctrine\DBAL\Connection')
535
            ->setMethods(array('executeQuery'))
536
            ->setConstructorArgs(array(array('platform' => new Mocks\MockPlatform()), $driverMock))
537
            ->getMock();
538
539
        $conn->expects($this->once())
0 ignored issues
show
Bug introduced by
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Doctrine\DBAL\Connection.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
540
            ->method('executeQuery')
541
            ->with($statement, $params, $types)
542
            ->will($this->returnValue($driverStatementMock));
543
544
        self::assertSame($result, $conn->fetchArray($statement, $params, $types));
0 ignored issues
show
Bug introduced by
The method fetchArray does only exist in Doctrine\DBAL\Connection, but not in PHPUnit_Framework_MockObject_MockObject.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
545
    }
546
547
    public function testFetchColumn()
548
    {
549
        $statement = 'SELECT * FROM foo WHERE bar = ?';
550
        $params    = array(666);
551
        $types     = array(\PDO::PARAM_INT);
552
        $column    = 0;
553
        $result    = array();
554
555
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
556
557
        $driverMock->expects($this->any())
558
            ->method('connect')
559
            ->will($this->returnValue(new DriverConnectionMock()));
560
561
        $driverStatementMock = $this->createMock('Doctrine\Tests\Mocks\DriverStatementMock');
562
563
        $driverStatementMock->expects($this->once())
564
            ->method('fetchColumn')
565
            ->with($column)
566
            ->will($this->returnValue($result));
567
568
        /** @var \PHPUnit_Framework_MockObject_MockObject|\Doctrine\DBAL\Connection $conn */
569
        $conn = $this->getMockBuilder('Doctrine\DBAL\Connection')
570
            ->setMethods(array('executeQuery'))
571
            ->setConstructorArgs(array(array('platform' => new Mocks\MockPlatform()), $driverMock))
572
            ->getMock();
573
574
        $conn->expects($this->once())
0 ignored issues
show
Bug introduced by
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Doctrine\DBAL\Connection.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
575
            ->method('executeQuery')
576
            ->with($statement, $params, $types)
577
            ->will($this->returnValue($driverStatementMock));
578
579
        self::assertSame($result, $conn->fetchColumn($statement, $params, $column, $types));
0 ignored issues
show
Bug introduced by
The method fetchColumn does only exist in Doctrine\DBAL\Connection, but not in PHPUnit_Framework_MockObject_MockObject.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
580
    }
581
582
    public function testConnectionIsClosedButNotUnset()
583
    {
584
        // mock Connection, and make connect() purposefully do nothing
585
        $connection = $this->getMockBuilder('Doctrine\DBAL\Connection')
586
            ->disableOriginalConstructor()
587
            ->setMethods(array('connect'))
588
            ->getMock();
589
590
        // artificially set the wrapped connection to non-null
591
        $reflection   = new \ReflectionObject($connection);
592
        $connProperty = $reflection->getProperty('_conn');
593
        $connProperty->setAccessible(true);
594
        $connProperty->setValue($connection, new \stdClass);
595
596
        // close the connection (should nullify the wrapped connection)
597
        $connection->close();
598
599
        // the wrapped connection should be null
600
        // (and since connect() does nothing, this will not reconnect)
601
        // this will also fail if this _conn property was unset instead of set to null
602
        self::assertNull($connection->getWrappedConnection());
603
    }
604
605 View Code Duplication
    public function testFetchAll()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
606
    {
607
        $statement = 'SELECT * FROM foo WHERE bar = ?';
608
        $params    = array(666);
609
        $types     = array(\PDO::PARAM_INT);
610
        $result    = array();
611
612
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
613
614
        $driverMock->expects($this->any())
615
            ->method('connect')
616
            ->will($this->returnValue(new DriverConnectionMock()));
617
618
        $driverStatementMock = $this->createMock('Doctrine\Tests\Mocks\DriverStatementMock');
619
620
        $driverStatementMock->expects($this->once())
621
            ->method('fetchAll')
622
            ->will($this->returnValue($result));
623
624
        /** @var \PHPUnit_Framework_MockObject_MockObject|\Doctrine\DBAL\Connection $conn */
625
        $conn = $this->getMockBuilder('Doctrine\DBAL\Connection')
626
            ->setMethods(array('executeQuery'))
627
            ->setConstructorArgs(array(array('platform' => new Mocks\MockPlatform()), $driverMock))
628
            ->getMock();
629
630
        $conn->expects($this->once())
0 ignored issues
show
Bug introduced by
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Doctrine\DBAL\Connection.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
631
            ->method('executeQuery')
632
            ->with($statement, $params, $types)
633
            ->will($this->returnValue($driverStatementMock));
634
635
        self::assertSame($result, $conn->fetchAll($statement, $params, $types));
0 ignored issues
show
Bug introduced by
The method fetchAll does only exist in Doctrine\DBAL\Connection, but not in PHPUnit_Framework_MockObject_MockObject.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
636
    }
637
638 View Code Duplication
    public function testConnectionDoesNotMaintainTwoReferencesToExternalPDO()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
639
    {
640
        $params['pdo'] = new \stdClass();
0 ignored issues
show
Coding Style Comprehensibility introduced by
$params was never initialized. Although not strictly required by PHP, it is generally a good practice to add $params = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
641
642
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
643
644
        $conn = new Connection($params, $driverMock);
645
646
        self::assertArrayNotHasKey('pdo', $conn->getParams(), "Connection is maintaining additional reference to the PDO connection");
647
    }
648
649 View Code Duplication
    public function testPassingExternalPDOMeansConnectionIsConnected()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
650
    {
651
        $params['pdo'] = new \stdClass();
0 ignored issues
show
Coding Style Comprehensibility introduced by
$params was never initialized. Although not strictly required by PHP, it is generally a good practice to add $params = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
652
653
        $driverMock = $this->createMock('Doctrine\DBAL\Driver');
654
655
        $conn = new Connection($params, $driverMock);
656
657
        self::assertTrue($conn->isConnected(), "Connection is not connected after passing external PDO");
658
    }
659
660
    public function testCallingDeleteWithNoDeletionCriteriaResultsInInvalidArgumentException()
661
    {
662
        /* @var $driver \Doctrine\DBAL\Driver */
663
        $driver  = $this->createMock('Doctrine\DBAL\Driver');
664
        $pdoMock = $this->createMock('Doctrine\DBAL\Driver\Connection');
665
666
        // should never execute queries with invalid arguments
667
        $pdoMock->expects($this->never())->method('exec');
668
        $pdoMock->expects($this->never())->method('prepare');
669
670
        $conn = new Connection(array('pdo' => $pdoMock), $driver);
671
672
        $this->expectException(InvalidArgumentException::class);
673
        $conn->delete('kittens', array());
674
    }
675
676
    public function dataCallConnectOnce()
677
    {
678
        return array(
679
            array('delete', array('tbl', array('id' => 12345))),
680
            array('insert', array('tbl', array('data' => 'foo'))),
681
            array('update', array('tbl', array('data' => 'bar'), array('id' => 12345))),
682
            array('prepare', array('select * from dual')),
683
            array('executeUpdate', array('insert into tbl (id) values (?)'), array(123)),
684
        );
685
    }
686
687
    /**
688
     * @dataProvider dataCallConnectOnce
689
     */
690
    public function testCallConnectOnce($method, $params)
691
    {
692
        $driverMock   = $this->createMock('Doctrine\DBAL\Driver');
693
        $pdoMock      = $this->createMock('Doctrine\DBAL\Driver\Connection');
694
        $platformMock = new Mocks\MockPlatform();
695
        $stmtMock     = $this->createMock('Doctrine\DBAL\Driver\Statement');
696
697
        $pdoMock->expects($this->any())
698
            ->method('prepare')
699
            ->will($this->returnValue($stmtMock));
700
701
        $conn = $this->getMockBuilder('Doctrine\DBAL\Connection')
702
            ->setConstructorArgs(array(array('pdo' => $pdoMock, 'platform' => $platformMock), $driverMock))
703
            ->setMethods(array('connect'))
704
            ->getMock();
705
706
        $conn->expects($this->once())->method('connect');
707
708
        call_user_func_array(array($conn, $method), $params);
709
    }
710
711
    /**
712
     * @group DBAL-1127
713
     */
714
    public function testPlatformDetectionIsTriggerOnlyOnceOnRetrievingPlatform()
715
    {
716
        /** @var \Doctrine\Tests\Mocks\VersionAwarePlatformDriverMock|\PHPUnit_Framework_MockObject_MockObject $driverMock */
717
        $driverMock = $this->createMock('Doctrine\Tests\Mocks\VersionAwarePlatformDriverMock');
718
719
        /** @var \Doctrine\Tests\Mocks\ServerInfoAwareConnectionMock|\PHPUnit_Framework_MockObject_MockObject $driverConnectionMock */
720
        $driverConnectionMock = $this->createMock('Doctrine\Tests\Mocks\ServerInfoAwareConnectionMock');
721
722
        /** @var \Doctrine\DBAL\Platforms\AbstractPlatform|\PHPUnit_Framework_MockObject_MockObject $platformMock */
723
        $platformMock = $this->getMockForAbstractClass('Doctrine\DBAL\Platforms\AbstractPlatform');
724
725
        $connection = new Connection(array(), $driverMock);
0 ignored issues
show
Bug introduced by
It seems like $driverMock defined by $this->createMock('Doctr...arePlatformDriverMock') on line 717 can also be of type object<PHPUnit_Framework_MockObject_MockObject>; however, Doctrine\DBAL\Connection::__construct() does only seem to accept object<Doctrine\DBAL\Driver>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
726
727
        $driverMock->expects($this->once())
0 ignored issues
show
Bug introduced by
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Doctrine\Tests\Mocks\Ver...AwarePlatformDriverMock.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
728
            ->method('connect')
729
            ->will($this->returnValue($driverConnectionMock));
730
731
        $driverConnectionMock->expects($this->once())
0 ignored issues
show
Bug introduced by
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Doctrine\Tests\Mocks\ServerInfoAwareConnectionMock.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
732
            ->method('requiresQueryForServerVersion')
733
            ->will($this->returnValue(false));
734
735
        $driverConnectionMock->expects($this->once())
736
            ->method('getServerVersion')
737
            ->will($this->returnValue('6.6.6'));
738
739
        $driverMock->expects($this->once())
740
            ->method('createDatabasePlatformForVersion')
741
            ->with('6.6.6')
742
            ->will($this->returnValue($platformMock));
743
744
        self::assertSame($platformMock, $connection->getDatabasePlatform());
745
    }
746
747
    public function testConnectionParamsArePassedToTheQueryCacheProfileInExecuteCacheQuery()
748
    {
749
        $resultCacheDriverMock = $this->createMock(Cache::class);
750
751
        $resultCacheDriverMock
752
            ->expects($this->atLeastOnce())
753
            ->method('fetch')
754
            ->with('cacheKey')
755
            ->will($this->returnValue(['realKey' => []]));
756
757
        $query  = 'SELECT * FROM foo WHERE bar = ?';
758
        $params = [666];
759
        $types  = [\PDO::PARAM_INT];
760
761
        /* @var $queryCacheProfileMock QueryCacheProfile|\PHPUnit_Framework_MockObject_MockObject */
762
        $queryCacheProfileMock = $this->createMock(QueryCacheProfile::class);
763
764
        $queryCacheProfileMock
0 ignored issues
show
Bug introduced by
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Doctrine\DBAL\Cache\QueryCacheProfile.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
765
            ->expects($this->any())
766
            ->method('getResultCacheDriver')
767
            ->will($this->returnValue($resultCacheDriverMock));
768
769
        // This is our main expectation
770
        $queryCacheProfileMock
771
            ->expects($this->once())
772
            ->method('generateCacheKeys')
773
            ->with($query, $params, $types, $this->params)
774
            ->will($this->returnValue(['cacheKey', 'realKey']));
775
776
        /* @var $driver Driver */
777
        $driver = $this->createMock(Driver::class);
778
779
        self::assertInstanceOf(
780
            ArrayStatement::class,
781
            (new Connection($this->params, $driver))->executeCacheQuery($query, $params, $types, $queryCacheProfileMock)
0 ignored issues
show
Bug introduced by
It seems like $queryCacheProfileMock defined by $this->createMock(\Doctr...eryCacheProfile::class) on line 762 can also be of type object<PHPUnit_Framework_MockObject_MockObject>; however, Doctrine\DBAL\Connection::executeCacheQuery() does only seem to accept object<Doctrine\DBAL\Cache\QueryCacheProfile>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
782
        );
783
    }
784
785
    /**
786
     * @group #2821
787
     */
788
    public function testShouldNotPassPlatformInParamsToTheQueryCacheProfileInExecuteCacheQuery() : void
789
    {
790
        $resultCacheDriverMock = $this->createMock(Cache::class);
791
792
        $resultCacheDriverMock
793
            ->expects($this->atLeastOnce())
794
            ->method('fetch')
795
            ->with('cacheKey')
796
            ->will($this->returnValue(['realKey' => []]));
797
798
        /* @var $queryCacheProfileMock QueryCacheProfile|\PHPUnit_Framework_MockObject_MockObject */
799
        $queryCacheProfileMock = $this->createMock(QueryCacheProfile::class);
800
801
        $queryCacheProfileMock
0 ignored issues
show
Bug introduced by
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Doctrine\DBAL\Cache\QueryCacheProfile.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
802
            ->expects($this->any())
803
            ->method('getResultCacheDriver')
804
            ->will($this->returnValue($resultCacheDriverMock));
805
806
        $query = 'SELECT 1';
807
808
        $connectionParams = $this->params;
809
810
        $queryCacheProfileMock
811
            ->expects($this->once())
812
            ->method('generateCacheKeys')
813
            ->with($query, [], [], $connectionParams)
814
            ->will($this->returnValue(['cacheKey', 'realKey']));
815
816
        $connectionParams['platform'] = $this->createMock(AbstractPlatform::class);
817
818
        /* @var $driver Driver */
819
        $driver = $this->createMock(Driver::class);
820
821
        (new Connection($connectionParams, $driver))->executeCacheQuery($query, [], [], $queryCacheProfileMock);
0 ignored issues
show
Bug introduced by
It seems like $queryCacheProfileMock defined by $this->createMock(\Doctr...eryCacheProfile::class) on line 799 can also be of type object<PHPUnit_Framework_MockObject_MockObject>; however, Doctrine\DBAL\Connection::executeCacheQuery() does only seem to accept object<Doctrine\DBAL\Cache\QueryCacheProfile>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
822
    }
823
824
    /**
825
     * @group #2821
826
     */
827
    public function testThrowsExceptionWhenInValidPlatformSpecified() : void
828
    {
829
        $connectionParams             = $this->params;
830
        $connectionParams['platform'] = new \stdClass();
831
832
        /* @var $driver Driver */
833
        $driver = $this->createMock(Driver::class);
834
835
        $this->expectException(DBALException::class);
836
837
        new Connection($connectionParams, $driver);
838
    }
839
840
    /**
841
     * @group DBAL-990
842
     */
843
    public function testRethrowsOriginalExceptionOnDeterminingPlatformWhenConnectingToNonExistentDatabase()
844
    {
845
        /** @var \Doctrine\Tests\Mocks\VersionAwarePlatformDriverMock|\PHPUnit_Framework_MockObject_MockObject $driverMock */
846
        $driverMock = $this->createMock(VersionAwarePlatformDriverMock::class);
847
848
        $connection        = new Connection(array('dbname' => 'foo'), $driverMock);
0 ignored issues
show
Bug introduced by
It seems like $driverMock defined by $this->createMock(\Doctr...tformDriverMock::class) on line 846 can also be of type object<PHPUnit_Framework_MockObject_MockObject>; however, Doctrine\DBAL\Connection::__construct() does only seem to accept object<Doctrine\DBAL\Driver>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
849
        $originalException = new \Exception('Original exception');
850
        $fallbackException = new \Exception('Fallback exception');
851
852
        $driverMock->expects($this->at(0))
0 ignored issues
show
Bug introduced by
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Doctrine\Tests\Mocks\Ver...AwarePlatformDriverMock.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
853
            ->method('connect')
854
            ->willThrowException($originalException);
855
856
        $driverMock->expects($this->at(1))
857
            ->method('connect')
858
            ->willThrowException($fallbackException);
859
860
        $this->expectExceptionMessage($originalException->getMessage());
861
862
        $connection->getDatabasePlatform();
863
    }
864
}
865