Completed
Pull Request — 2.7 (#7987)
by Benjamin
38:26 queued 32:39
created

QueryTest::testNonExistentExecutor()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
eloc 3
c 1
b 1
f 0
dl 0
loc 6
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Doctrine\Tests\ORM\Query;
4
5
use DateTime;
6
use Doctrine\Common\Cache\ArrayCache;
7
use Doctrine\Common\Collections\ArrayCollection;
8
use Doctrine\DBAL\Types\Type;
9
use Doctrine\ORM\Internal\Hydration\IterableResult;
10
use Doctrine\ORM\Query\Parameter;
11
use Doctrine\ORM\Query\QueryException;
12
use Doctrine\ORM\UnitOfWork;
13
use Doctrine\Tests\Mocks\DriverConnectionMock;
14
use Doctrine\Tests\Mocks\EntityManagerMock;
15
use Doctrine\Tests\Mocks\StatementArrayMock;
16
use Doctrine\Tests\Models\CMS\CmsAddress;
17
use Doctrine\Tests\Models\CMS\CmsUser;
18
use Doctrine\Tests\Models\Generic\DateTimeModel;
19
use Doctrine\Tests\OrmTestCase;
20
21
class QueryTest extends OrmTestCase
22
{
23
    /** @var EntityManagerMock */
24
    protected $_em;
25
26
    protected function setUp()
27
    {
28
        $this->_em = $this->_getTestEntityManager();
29
    }
30
31
    public function testGetParameters()
32
    {
33
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1");
34
35
        $parameters = new ArrayCollection();
36
37
        $this->assertEquals($parameters, $query->getParameters());
38
    }
39
40
    public function testGetParameters_HasSomeAlready()
41
    {
42
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1");
43
        $query->setParameter(2, 84);
44
45
        $parameters = new ArrayCollection();
46
        $parameters->add(new Parameter(2, 84));
47
48
        $this->assertEquals($parameters, $query->getParameters());
49
    }
50
51
    public function testSetParameters()
52
    {
53
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1");
54
55
        $parameters = new ArrayCollection();
56
        $parameters->add(new Parameter(1, 'foo'));
57
        $parameters->add(new Parameter(2, 'bar'));
58
59
        $query->setParameters($parameters);
60
61
        $this->assertEquals($parameters, $query->getParameters());
62
    }
63
64
    public function testFree()
65
    {
66
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1");
67
        $query->setParameter(2, 84, \PDO::PARAM_INT);
68
69
        $query->free();
70
71
        $this->assertEquals(0, count($query->getParameters()));
72
    }
73
74
    public function testClone()
75
    {
76
        $dql = "select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1";
77
78
        $query = $this->_em->createQuery($dql);
79
        $query->setParameter(2, 84, \PDO::PARAM_INT);
80
        $query->setHint('foo', 'bar');
81
82
        $cloned = clone $query;
83
84
        $this->assertEquals($dql, $cloned->getDQL());
85
        $this->assertEquals(0, count($cloned->getParameters()));
86
        $this->assertFalse($cloned->getHint('foo'));
87
    }
88
89
    public function testFluentQueryInterface()
90
    {
91
        $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a");
92
        $q2 = $q->expireQueryCache(true)
93
          ->setQueryCacheLifetime(3600)
94
          ->setQueryCacheDriver(null)
95
          ->expireResultCache(true)
96
          ->setHint('foo', 'bar')
97
          ->setHint('bar', 'baz')
98
          ->setParameter(1, 'bar')
99
          ->setParameters(new ArrayCollection([new Parameter(2, 'baz')]))
100
          ->setResultCacheDriver(null)
101
          ->setResultCacheId('foo')
102
          ->setDQL('foo')
103
          ->setFirstResult(10)
104
          ->setMaxResults(10);
105
106
        $this->assertSame($q2, $q);
107
    }
108
109
    /**
110
     * @group DDC-968
111
     */
112
    public function testHints()
113
    {
114
        $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a");
115
        $q->setHint('foo', 'bar')->setHint('bar', 'baz');
116
117
        $this->assertEquals('bar', $q->getHint('foo'));
118
        $this->assertEquals('baz', $q->getHint('bar'));
119
        $this->assertEquals(['foo' => 'bar', 'bar' => 'baz'], $q->getHints());
120
        $this->assertTrue($q->hasHint('foo'));
121
        $this->assertFalse($q->hasHint('barFooBaz'));
122
    }
123
124
    /**
125
     * @group DDC-1588
126
     */
127
    public function testQueryDefaultResultCache()
128
    {
129
        $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
130
        $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a");
131
        $q->enableResultCache();
132
        $this->assertSame($this->_em->getConfiguration()->getResultCacheImpl(), $q->getQueryCacheProfile()->getResultCacheDriver());
133
    }
134
135
    /**
136
     * @expectedException Doctrine\ORM\Query\QueryException
137
     **/
138
    public function testIterateWithNoDistinctAndWrongSelectClause()
139
    {
140
        $q = $this->_em->createQuery("select u, a from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a");
141
        $q->iterate();
142
    }
143
144
    /**
145
     * @expectedException Doctrine\ORM\Query\QueryException
146
     **/
147
    public function testIterateWithNoDistinctAndWithValidSelectClause()
148
    {
149
        $q = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a");
150
        $q->iterate();
151
    }
152
153
    public function testIterateWithDistinct()
154
    {
155
        $q = $this->_em->createQuery("SELECT DISTINCT u from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a");
156
157
        self::assertInstanceOf(IterableResult::class, $q->iterate());
158
    }
159
160
    /**
161
     * @group DDC-1697
162
     */
163
    public function testCollectionParameters()
164
    {
165
        $cities = [
166
            0 => "Paris",
167
            3 => "Canne",
168
            9 => "St Julien"
169
        ];
170
171
        $query  = $this->_em
172
                ->createQuery("SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.city IN (:cities)")
173
                ->setParameter('cities', $cities);
174
175
        $parameters = $query->getParameters();
176
        $parameter  = $parameters->first();
177
178
        $this->assertEquals('cities', $parameter->getName());
179
        $this->assertEquals($cities, $parameter->getValue());
180
    }
181
182
    /**
183
     * @group DDC-2224
184
     */
185
    public function testProcessParameterValueClassMetadata()
186
    {
187
        $query  = $this->_em->createQuery("SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.city IN (:cities)");
188
        $this->assertEquals(
189
            CmsAddress::class,
190
            $query->processParameterValue($this->_em->getClassMetadata(CmsAddress::class))
191
        );
192
    }
193
194
    public function testProcessParameterValueObject() : void
195
    {
196
        $query = $this->_em->createQuery('SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.user = :user');
197
        $user = new CmsUser();
198
        $user->id = 12345;
199
200
        self::assertSame(
201
            12345,
202
            $query->processParameterValue($user)
203
        );
204
    }
205
206
    public function testProcessParameterValueNull() : void
207
    {
208
        $query = $this->_em->createQuery('SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.user = :user');
209
210
        self::assertNull($query->processParameterValue(null));
211
    }
212
213
    public function testDefaultQueryHints()
214
    {
215
        $config = $this->_em->getConfiguration();
216
        $defaultHints = [
217
            'hint_name_1' => 'hint_value_1',
218
            'hint_name_2' => 'hint_value_2',
219
            'hint_name_3' => 'hint_value_3',
220
        ];
221
222
        $config->setDefaultQueryHints($defaultHints);
223
        $query = $this->_em->createQuery();
224
        $this->assertSame($config->getDefaultQueryHints(), $query->getHints());
225
        $this->_em->getConfiguration()->setDefaultQueryHint('hint_name_1', 'hint_another_value_1');
226
        $this->assertNotSame($config->getDefaultQueryHints(), $query->getHints());
227
        $q2 = clone $query;
228
        $this->assertSame($config->getDefaultQueryHints(), $q2->getHints());
229
    }
230
231
    /**
232
     * @group DDC-3714
233
     */
234
    public function testResultCacheCaching()
235
    {
236
        $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
237
        $this->_em->getConfiguration()->setQueryCacheImpl(new ArrayCache());
238
        /** @var DriverConnectionMock $driverConnectionMock */
239
        $driverConnectionMock = $this->_em->getConnection()->getWrappedConnection();
240
        $stmt = new StatementArrayMock([
241
            [
242
                'id_0' => 1,
243
            ]
244
        ]);
245
        $driverConnectionMock->setStatementMock($stmt);
246
        $res = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u")
247
            ->useQueryCache(true)
248
            ->enableResultCache(60)
249
            //let it cache
250
            ->getResult();
251
252
        $this->assertCount(1, $res);
253
254
        $driverConnectionMock->setStatementMock(null);
255
256
        $res = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u")
257
            ->useQueryCache(true)
258
            ->disableResultCache()
259
            ->getResult();
260
        $this->assertCount(0, $res);
261
    }
262
263
    /**
264
     * @group DDC-3741
265
     */
266
    public function testSetHydrationCacheProfileNull()
267
    {
268
        $query = $this->_em->createQuery();
269
        $query->setHydrationCacheProfile(null);
270
        $this->assertNull($query->getHydrationCacheProfile());
271
    }
272
273
    /**
274
     * @group 2947
275
     */
276
    public function testResultCacheEviction()
277
    {
278
        $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
279
280
        $query = $this->_em->createQuery("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u")
281
                           ->enableResultCache();
282
283
        /** @var DriverConnectionMock $driverConnectionMock */
284
        $driverConnectionMock = $this->_em->getConnection()
285
                                          ->getWrappedConnection();
286
287
        $driverConnectionMock->setStatementMock(new StatementArrayMock([['id_0' => 1]]));
288
289
        // Performs the query and sets up the initial cache
290
        self::assertCount(1, $query->getResult());
291
292
        $driverConnectionMock->setStatementMock(new StatementArrayMock([['id_0' => 1], ['id_0' => 2]]));
293
294
        // Retrieves cached data since expire flag is false and we have a cached result set
295
        self::assertCount(1, $query->getResult());
296
297
        // Performs the query and caches the result set since expire flag is true
298
        self::assertCount(2, $query->expireResultCache(true)->getResult());
299
300
        $driverConnectionMock->setStatementMock(new StatementArrayMock([['id_0' => 1]]));
301
302
        // Retrieves cached data since expire flag is false and we have a cached result set
303
        self::assertCount(2, $query->expireResultCache(false)->getResult());
304
    }
305
306
    /**
307
     * @group #6162
308
     */
309
    public function testSelectJoinSubquery()
310
    {
311
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u JOIN (SELECT )");
312
313
        $this->expectException(QueryException::class);
314
        $this->expectExceptionMessage('Subquery');
315
        $query->getSQL();
316
    }
317
318
    /**
319
     * @group #6162
320
     */
321
    public function testSelectFromSubquery()
322
    {
323
        $query = $this->_em->createQuery("select u from (select Doctrine\Tests\Models\CMS\CmsUser c) as u");
324
325
        $this->expectException(QueryException::class);
326
        $this->expectExceptionMessage('Subquery');
327
        $query->getSQL();
328
    }
329
330
    /**
331
     * @group 6699
332
     */
333
    public function testGetParameterTypeJuggling() : void
334
    {
335
        $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id = ?0');
336
337
        $query->setParameter(0, 0);
338
339
        self::assertCount(1, $query->getParameters());
340
        self::assertSame(0, $query->getParameter(0)->getValue());
341
        self::assertSame(0, $query->getParameter('0')->getValue());
342
    }
343
344
    /**
345
     * @group 6699
346
     */
347
    public function testSetParameterWithNameZeroIsNotOverridden() : void
348
    {
349
        $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name');
350
351
        $query->setParameter(0, 0);
352
        $query->setParameter('name', 'Doctrine');
353
354
        self::assertCount(2, $query->getParameters());
355
        self::assertSame(0, $query->getParameter('0')->getValue());
356
        self::assertSame('Doctrine', $query->getParameter('name')->getValue());
357
    }
358
359
    /**
360
     * @group 6699
361
     */
362
    public function testSetParameterWithNameZeroDoesNotOverrideAnotherParameter() : void
363
    {
364
        $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name');
365
366
        $query->setParameter('name', 'Doctrine');
367
        $query->setParameter(0, 0);
368
369
        self::assertCount(2, $query->getParameters());
370
        self::assertSame(0, $query->getParameter(0)->getValue());
371
        self::assertSame('Doctrine', $query->getParameter('name')->getValue());
372
    }
373
374
    /**
375
     * @group 6699
376
     */
377
    public function testSetParameterWithTypeJugglingWorks() : void
378
    {
379
        $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name');
380
381
        $query->setParameter('0', 1);
382
        $query->setParameter('name', 'Doctrine');
383
        $query->setParameter(0, 2);
384
        $query->setParameter('0', 3);
385
386
        self::assertCount(2, $query->getParameters());
387
        self::assertSame(3, $query->getParameter(0)->getValue());
388
        self::assertSame(3, $query->getParameter('0')->getValue());
389
        self::assertSame('Doctrine', $query->getParameter('name')->getValue());
390
    }
391
392
    /**
393
     * @group 6748
394
     */
395
    public function testResultCacheProfileCanBeRemovedViaSetter() : void
396
    {
397
        $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
398
399
        $query = $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u');
400
        $query->enableResultCache();
401
        $query->setResultCacheProfile();
402
403
        self::assertAttributeSame(null, '_queryCacheProfile', $query);
0 ignored issues
show
Deprecated Code introduced by
The function PHPUnit\Framework\Assert::assertAttributeSame() has been deprecated: https://github.com/sebastianbergmann/phpunit/issues/3338 ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

403
        /** @scrutinizer ignore-deprecated */ self::assertAttributeSame(null, '_queryCacheProfile', $query);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
404
    }
405
406
    /** @group 7527 */
407
    public function testValuesAreNotBeingResolvedForSpecifiedParameterTypes() : void
408
    {
409
        $unitOfWork = $this->createMock(UnitOfWork::class);
410
411
        $this->_em->setUnitOfWork($unitOfWork);
412
413
        $unitOfWork
414
            ->expects(self::never())
415
            ->method('getSingleIdentifierValue');
416
417
        $query = $this->_em->createQuery('SELECT d FROM ' . DateTimeModel::class . ' d WHERE d.datetime = :value');
418
419
        $query->setParameter('value', new DateTime(), Type::DATETIME);
420
421
        self::assertEmpty($query->getResult());
422
    }
423
424
    /** @group 7982 */
425
    public function testNonExistentExecutor()
426
    {
427
        $this->expectException(QueryException::class);
428
        $this->expectExceptionMessage('[Syntax Error] line 0, col -1: Error: Expected SELECT, UPDATE or DELETE, got end of string.');
429
430
        $query = $this->_em->createQuery('0')->execute();
0 ignored issues
show
Unused Code introduced by
The assignment to $query is dead and can be removed.
Loading history...
431
    }
432
}
433