Failed Conditions
Push — master ( 2ade86...13f838 )
by Jonathan
18s
created

tests/Doctrine/Tests/OrmFunctionalTestCase.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Doctrine\Tests;
4
5
use Doctrine\Common\Cache\ArrayCache;
6
use Doctrine\DBAL\Driver\Connection;
7
use Doctrine\DBAL\Driver\PDOSqlite\Driver as SqliteDriver;
8
use Doctrine\DBAL\Logging\DebugStack;
9
use Doctrine\DBAL\Types\Type;
10
use Doctrine\ORM\Cache\CacheConfiguration;
11
use Doctrine\ORM\Cache\DefaultCacheFactory;
12
use Doctrine\ORM\Cache\Logging\StatisticsCacheLogger;
13
use Doctrine\ORM\Configuration;
14
use Doctrine\ORM\EntityManager;
15
use Doctrine\ORM\Tools\DebugUnitOfWorkListener;
16
use Doctrine\ORM\Tools\SchemaTool;
17
use Doctrine\Tests\DbalTypes\Rot13Type;
18
use Doctrine\Tests\EventListener\CacheMetadataListener;
19
use Doctrine\Tests\Models;
20
use PHPUnit\Framework\AssertionFailedError;
21
22
/**
23
 * Base testcase class for all functional ORM testcases.
24
 *
25
 * @since 2.0
26
 */
27
abstract class OrmFunctionalTestCase extends OrmTestCase
28
{
29
    /**
30
     * The metadata cache shared between all functional tests.
31
     *
32
     * @var \Doctrine\Common\Cache\Cache|null
33
     */
34
    private static $_metadataCacheImpl = null;
35
36
    /**
37
     * The query cache shared between all functional tests.
38
     *
39
     * @var \Doctrine\Common\Cache\Cache|null
40
     */
41
    private static $_queryCacheImpl = null;
42
43
    /**
44
     * Shared connection when a TestCase is run alone (outside of its functional suite).
45
     *
46
     * @var \Doctrine\DBAL\Connection|null
47
     */
48
    protected static $_sharedConn;
49
50
    /**
51
     * @var \Doctrine\ORM\EntityManager
52
     */
53
    protected $_em;
54
55
    /**
56
     * @var \Doctrine\ORM\Tools\SchemaTool
57
     */
58
    protected $_schemaTool;
59
60
    /**
61
     * @var \Doctrine\DBAL\Logging\DebugStack
62
     */
63
    protected $_sqlLoggerStack;
64
65
    /**
66
     * The names of the model sets used in this testcase.
67
     *
68
     * @var array
69
     */
70
    protected $_usedModelSets = [];
71
72
    /**
73
     * To be configured by the test that uses result set cache
74
     *
75
     * @var \Doctrine\Common\Cache\Cache|null
76
     */
77
    protected $resultCacheImpl;
78
79
    /**
80
     * Whether the database schema has already been created.
81
     *
82
     * @var array
83
     */
84
    protected static $_tablesCreated = [];
85
86
    /**
87
     * Array of entity class name to their tables that were created.
88
     *
89
     * @var array
90
     */
91
    protected static $_entityTablesCreated = [];
92
93
    /**
94
     * List of model sets and their classes.
95
     *
96
     * @var array
97
     */
98
    protected static $_modelSets = [
99
        'cms' => [
100
            Models\CMS\CmsUser::class,
101
            Models\CMS\CmsPhonenumber::class,
102
            Models\CMS\CmsAddress::class,
103
            Models\CMS\CmsEmail::class,
104
            Models\CMS\CmsGroup::class,
105
            Models\CMS\CmsTag::class,
106
            Models\CMS\CmsArticle::class,
107
            Models\CMS\CmsComment::class,
108
        ],
109
        'company' => [
110
            Models\Company\CompanyPerson::class,
111
            Models\Company\CompanyEmployee::class,
112
            Models\Company\CompanyManager::class,
113
            Models\Company\CompanyOrganization::class,
114
            Models\Company\CompanyEvent::class,
115
            Models\Company\CompanyAuction::class,
116
            Models\Company\CompanyRaffle::class,
117
            Models\Company\CompanyCar::class,
118
            Models\Company\CompanyContract::class,
119
        ],
120
        'ecommerce' => [
121
            Models\ECommerce\ECommerceCart::class,
122
            Models\ECommerce\ECommerceCustomer::class,
123
            Models\ECommerce\ECommerceProduct::class,
124
            Models\ECommerce\ECommerceShipping::class,
125
            Models\ECommerce\ECommerceFeature::class,
126
            Models\ECommerce\ECommerceCategory::class
127
        ],
128
        'generic' => [
129
            Models\Generic\BooleanModel::class,
130
            Models\Generic\DateTimeModel::class,
131
            Models\Generic\DecimalModel::class,
132
            Models\Generic\SerializationModel::class,
133
        ],
134
        'routing' => [
135
            Models\Routing\RoutingLeg::class,
136
            Models\Routing\RoutingLocation::class,
137
            Models\Routing\RoutingRoute::class,
138
            Models\Routing\RoutingRouteBooking::class,
139
        ],
140
        'navigation' => [
141
            Models\Navigation\NavUser::class,
142
            Models\Navigation\NavCountry::class,
143
            Models\Navigation\NavPhotos::class,
144
            Models\Navigation\NavTour::class,
145
            Models\Navigation\NavPointOfInterest::class,
146
        ],
147
        'directorytree' => [
148
            Models\DirectoryTree\AbstractContentItem::class,
149
            Models\DirectoryTree\File::class,
150
            Models\DirectoryTree\Directory::class,
151
        ],
152
        'ddc117' => [
153
            Models\DDC117\DDC117Article::class,
154
            Models\DDC117\DDC117Reference::class,
155
            Models\DDC117\DDC117Translation::class,
156
            Models\DDC117\DDC117ArticleDetails::class,
157
            Models\DDC117\DDC117ApproveChanges::class,
158
            Models\DDC117\DDC117Editor::class,
159
            Models\DDC117\DDC117Link::class,
160
        ],
161
        'ddc3699' => [
162
            Models\DDC3699\DDC3699Parent::class,
163
            Models\DDC3699\DDC3699RelationOne::class,
164
            Models\DDC3699\DDC3699RelationMany::class,
165
            Models\DDC3699\DDC3699Child::class,
166
        ],
167
        'stockexchange' => [
168
            Models\StockExchange\Bond::class,
169
            Models\StockExchange\Stock::class,
170
            Models\StockExchange\Market::class,
171
        ],
172
        'legacy' => [
173
            Models\Legacy\LegacyUser::class,
174
            Models\Legacy\LegacyUserReference::class,
175
            Models\Legacy\LegacyArticle::class,
176
            Models\Legacy\LegacyCar::class,
177
        ],
178
        'customtype' => [
179
            Models\CustomType\CustomTypeChild::class,
180
            Models\CustomType\CustomTypeParent::class,
181
            Models\CustomType\CustomTypeUpperCase::class,
182
        ],
183
        'compositekeyinheritance' => [
184
            Models\CompositeKeyInheritance\JoinedRootClass::class,
185
            Models\CompositeKeyInheritance\JoinedChildClass::class,
186
            Models\CompositeKeyInheritance\SingleRootClass::class,
187
            Models\CompositeKeyInheritance\SingleChildClass::class,
188
        ],
189
        'taxi' => [
190
            Models\Taxi\PaidRide::class,
191
            Models\Taxi\Ride::class,
192
            Models\Taxi\Car::class,
193
            Models\Taxi\Driver::class,
194
        ],
195
        'cache' => [
196
            Models\Cache\Country::class,
197
            Models\Cache\State::class,
198
            Models\Cache\City::class,
199
            Models\Cache\Traveler::class,
200
            Models\Cache\TravelerProfileInfo::class,
201
            Models\Cache\TravelerProfile::class,
202
            Models\Cache\Travel::class,
203
            Models\Cache\Attraction::class,
204
            Models\Cache\Restaurant::class,
205
            Models\Cache\Beach::class,
206
            Models\Cache\Bar::class,
207
            Models\Cache\Flight::class,
208
            Models\Cache\Token::class,
209
            Models\Cache\Login::class,
210
            Models\Cache\Client::class,
211
            Models\Cache\Person::class,
212
            Models\Cache\Address::class,
213
            Models\Cache\Action::class,
214
            Models\Cache\ComplexAction::class,
215
            Models\Cache\AttractionInfo::class,
216
            Models\Cache\AttractionContactInfo::class,
217
            Models\Cache\AttractionLocationInfo::class
218
        ],
219
        'tweet' => [
220
            Models\Tweet\User::class,
221
            Models\Tweet\Tweet::class,
222
            Models\Tweet\UserList::class,
223
        ],
224
        'ddc2504' => [
225
            Models\DDC2504\DDC2504RootClass::class,
226
            Models\DDC2504\DDC2504ChildClass::class,
227
            Models\DDC2504\DDC2504OtherClass::class,
228
        ],
229
        'ddc3346' => [
230
            Models\DDC3346\DDC3346Author::class,
231
            Models\DDC3346\DDC3346Article::class,
232
        ],
233
        'quote' => [
234
            Models\Quote\Address::class,
235
            Models\Quote\City::class,
236
            Models\Quote\FullAddress::class,
237
            Models\Quote\Group::class,
238
            Models\Quote\NumericEntity::class,
239
            Models\Quote\Phone::class,
240
            Models\Quote\User::class
241
        ],
242
        'vct_onetoone' => [
243
            Models\ValueConversionType\InversedOneToOneEntity::class,
244
            Models\ValueConversionType\OwningOneToOneEntity::class
245
        ],
246
        'vct_onetoone_compositeid' => [
247
            Models\ValueConversionType\InversedOneToOneCompositeIdEntity::class,
248
            Models\ValueConversionType\OwningOneToOneCompositeIdEntity::class
249
        ],
250
        'vct_onetoone_compositeid_foreignkey' => [
251
            Models\ValueConversionType\AuxiliaryEntity::class,
252
            Models\ValueConversionType\InversedOneToOneCompositeIdForeignKeyEntity::class,
253
            Models\ValueConversionType\OwningOneToOneCompositeIdForeignKeyEntity::class
254
        ],
255
        'vct_onetomany' => [
256
            Models\ValueConversionType\InversedOneToManyEntity::class,
257
            Models\ValueConversionType\OwningManyToOneEntity::class
258
        ],
259
        'vct_onetomany_compositeid' => [
260
            Models\ValueConversionType\InversedOneToManyCompositeIdEntity::class,
261
            Models\ValueConversionType\OwningManyToOneCompositeIdEntity::class
262
        ],
263
        'vct_onetomany_compositeid_foreignkey' => [
264
            Models\ValueConversionType\AuxiliaryEntity::class,
265
            Models\ValueConversionType\InversedOneToManyCompositeIdForeignKeyEntity::class,
266
            Models\ValueConversionType\OwningManyToOneCompositeIdForeignKeyEntity::class
267
        ],
268
        'vct_onetomany_extralazy' => [
269
            Models\ValueConversionType\InversedOneToManyExtraLazyEntity::class,
270
            Models\ValueConversionType\OwningManyToOneExtraLazyEntity::class
271
        ],
272
        'vct_manytomany' => [
273
            Models\ValueConversionType\InversedManyToManyEntity::class,
274
            Models\ValueConversionType\OwningManyToManyEntity::class
275
        ],
276
        'vct_manytomany_compositeid' => [
277
            Models\ValueConversionType\InversedManyToManyCompositeIdEntity::class,
278
            Models\ValueConversionType\OwningManyToManyCompositeIdEntity::class
279
        ],
280
        'vct_manytomany_compositeid_foreignkey' => [
281
            Models\ValueConversionType\AuxiliaryEntity::class,
282
            Models\ValueConversionType\InversedManyToManyCompositeIdForeignKeyEntity::class,
283
            Models\ValueConversionType\OwningManyToManyCompositeIdForeignKeyEntity::class
284
        ],
285
        'vct_manytomany_extralazy' => [
286
            Models\ValueConversionType\InversedManyToManyExtraLazyEntity::class,
287
            Models\ValueConversionType\OwningManyToManyExtraLazyEntity::class
288
        ],
289
        'geonames' => [
290
            Models\GeoNames\Country::class,
291
            Models\GeoNames\Admin1::class,
292
            Models\GeoNames\Admin1AlternateName::class,
293
            Models\GeoNames\City::class
294
        ],
295
        'custom_id_object_type' => [
296
            Models\CustomType\CustomIdObjectTypeParent::class,
297
            Models\CustomType\CustomIdObjectTypeChild::class,
298
        ],
299
        'pagination' => [
300
            Models\Pagination\Company::class,
301
            Models\Pagination\Logo::class,
302
            Models\Pagination\Department::class,
303
            Models\Pagination\User::class,
304
            Models\Pagination\User1::class,
305
        ],
306
        'versioned_many_to_one' => [
307
            Models\VersionedManyToOne\Category::class,
308
            Models\VersionedManyToOne\Article::class,
309
        ],
310
        'issue5989' => [
311
            Models\Issue5989\Issue5989Person::class,
312
            Models\Issue5989\Issue5989Employee::class,
313
            Models\Issue5989\Issue5989Manager::class,
314
        ],
315
    ];
316
317
    /**
318
     * @param string $setName
319
     *
320
     * @return void
321
     */
322
    protected function useModelSet($setName)
323
    {
324
        $this->_usedModelSets[$setName] = true;
325
    }
326
327
    /**
328
     * Sweeps the database tables and clears the EntityManager.
329
     *
330
     * @return void
331
     */
332
    protected function tearDown()
333
    {
334
        $conn = static::$_sharedConn;
335
336
        // In case test is skipped, tearDown is called, but no setup may have run
337
        if ( ! $conn) {
338
            return;
339
        }
340
341
        $platform = $conn->getDatabasePlatform();
342
343
        $this->_sqlLoggerStack->enabled = false;
344
345 View Code Duplication
        if (isset($this->_usedModelSets['cms'])) {
346
            $conn->executeUpdate('DELETE FROM cms_users_groups');
347
            $conn->executeUpdate('DELETE FROM cms_groups');
348
            $conn->executeUpdate('DELETE FROM cms_users_tags');
349
            $conn->executeUpdate('DELETE FROM cms_tags');
350
            $conn->executeUpdate('DELETE FROM cms_addresses');
351
            $conn->executeUpdate('DELETE FROM cms_phonenumbers');
352
            $conn->executeUpdate('DELETE FROM cms_comments');
353
            $conn->executeUpdate('DELETE FROM cms_articles');
354
            $conn->executeUpdate('DELETE FROM cms_users');
355
            $conn->executeUpdate('DELETE FROM cms_emails');
356
        }
357
358 View Code Duplication
        if (isset($this->_usedModelSets['ecommerce'])) {
359
            $conn->executeUpdate('DELETE FROM ecommerce_carts_products');
360
            $conn->executeUpdate('DELETE FROM ecommerce_products_categories');
361
            $conn->executeUpdate('DELETE FROM ecommerce_products_related');
362
            $conn->executeUpdate('DELETE FROM ecommerce_carts');
363
            $conn->executeUpdate('DELETE FROM ecommerce_customers');
364
            $conn->executeUpdate('DELETE FROM ecommerce_features');
365
            $conn->executeUpdate('DELETE FROM ecommerce_products');
366
            $conn->executeUpdate('DELETE FROM ecommerce_shippings');
367
            $conn->executeUpdate('UPDATE ecommerce_categories SET parent_id = NULL');
368
            $conn->executeUpdate('DELETE FROM ecommerce_categories');
369
        }
370
371
        if (isset($this->_usedModelSets['company'])) {
372
            $conn->executeUpdate('DELETE FROM company_contract_employees');
373
            $conn->executeUpdate('DELETE FROM company_contract_managers');
374
            $conn->executeUpdate('DELETE FROM company_contracts');
375
            $conn->executeUpdate('DELETE FROM company_persons_friends');
376
            $conn->executeUpdate('DELETE FROM company_managers');
377
            $conn->executeUpdate('DELETE FROM company_employees');
378
            $conn->executeUpdate('UPDATE company_persons SET spouse_id = NULL');
379
            $conn->executeUpdate('DELETE FROM company_persons');
380
            $conn->executeUpdate('DELETE FROM company_raffles');
381
            $conn->executeUpdate('DELETE FROM company_auctions');
382
            $conn->executeUpdate('UPDATE company_organizations SET main_event_id = NULL');
383
            $conn->executeUpdate('DELETE FROM company_events');
384
            $conn->executeUpdate('DELETE FROM company_organizations');
385
        }
386
387
        if (isset($this->_usedModelSets['generic'])) {
388
            $conn->executeUpdate('DELETE FROM boolean_model');
389
            $conn->executeUpdate('DELETE FROM date_time_model');
390
            $conn->executeUpdate('DELETE FROM decimal_model');
391
            $conn->executeUpdate('DELETE FROM serialize_model');
392
        }
393
394
        if (isset($this->_usedModelSets['routing'])) {
395
            $conn->executeUpdate('DELETE FROM RoutingRouteLegs');
396
            $conn->executeUpdate('DELETE FROM RoutingRouteBooking');
397
            $conn->executeUpdate('DELETE FROM RoutingRoute');
398
            $conn->executeUpdate('DELETE FROM RoutingLeg');
399
            $conn->executeUpdate('DELETE FROM RoutingLocation');
400
        }
401
402
        if(isset($this->_usedModelSets['navigation'])) {
403
            $conn->executeUpdate('DELETE FROM navigation_tour_pois');
404
            $conn->executeUpdate('DELETE FROM navigation_photos');
405
            $conn->executeUpdate('DELETE FROM navigation_pois');
406
            $conn->executeUpdate('DELETE FROM navigation_tours');
407
            $conn->executeUpdate('DELETE FROM navigation_countries');
408
        }
409
        if (isset($this->_usedModelSets['directorytree'])) {
410
            $conn->executeUpdate('DELETE FROM ' . $platform->quoteIdentifier("file"));
411
            // MySQL doesn't know deferred deletions therefore only executing the second query gives errors.
412
            $conn->executeUpdate('DELETE FROM Directory WHERE parentDirectory_id IS NOT NULL');
413
            $conn->executeUpdate('DELETE FROM Directory');
414
        }
415
        if (isset($this->_usedModelSets['ddc117'])) {
416
            $conn->executeUpdate('DELETE FROM ddc117editor_ddc117translation');
417
            $conn->executeUpdate('DELETE FROM DDC117Editor');
418
            $conn->executeUpdate('DELETE FROM DDC117ApproveChanges');
419
            $conn->executeUpdate('DELETE FROM DDC117Link');
420
            $conn->executeUpdate('DELETE FROM DDC117Reference');
421
            $conn->executeUpdate('DELETE FROM DDC117ArticleDetails');
422
            $conn->executeUpdate('DELETE FROM DDC117Translation');
423
            $conn->executeUpdate('DELETE FROM DDC117Article');
424
        }
425
        if (isset($this->_usedModelSets['stockexchange'])) {
426
            $conn->executeUpdate('DELETE FROM exchange_bonds_stocks');
427
            $conn->executeUpdate('DELETE FROM exchange_bonds');
428
            $conn->executeUpdate('DELETE FROM exchange_stocks');
429
            $conn->executeUpdate('DELETE FROM exchange_markets');
430
        }
431
        if (isset($this->_usedModelSets['legacy'])) {
432
            $conn->executeUpdate('DELETE FROM legacy_users_cars');
433
            $conn->executeUpdate('DELETE FROM legacy_users_reference');
434
            $conn->executeUpdate('DELETE FROM legacy_articles');
435
            $conn->executeUpdate('DELETE FROM legacy_cars');
436
            $conn->executeUpdate('DELETE FROM legacy_users');
437
        }
438
439
        if (isset($this->_usedModelSets['customtype'])) {
440
            $conn->executeUpdate('DELETE FROM customtype_parent_friends');
441
            $conn->executeUpdate('DELETE FROM customtype_parents');
442
            $conn->executeUpdate('DELETE FROM customtype_children');
443
            $conn->executeUpdate('DELETE FROM customtype_uppercases');
444
        }
445
446
        if (isset($this->_usedModelSets['compositekeyinheritance'])) {
447
            $conn->executeUpdate('DELETE FROM JoinedChildClass');
448
            $conn->executeUpdate('DELETE FROM JoinedRootClass');
449
            $conn->executeUpdate('DELETE FROM SingleRootClass');
450
        }
451
452 View Code Duplication
        if (isset($this->_usedModelSets['taxi'])) {
453
            $conn->executeUpdate('DELETE FROM taxi_paid_ride');
454
            $conn->executeUpdate('DELETE FROM taxi_ride');
455
            $conn->executeUpdate('DELETE FROM taxi_car');
456
            $conn->executeUpdate('DELETE FROM taxi_driver');
457
        }
458
459
        if (isset($this->_usedModelSets['tweet'])) {
460
            $conn->executeUpdate('DELETE FROM tweet_tweet');
461
            $conn->executeUpdate('DELETE FROM tweet_user_list');
462
            $conn->executeUpdate('DELETE FROM tweet_user');
463
        }
464
465
        if (isset($this->_usedModelSets['cache'])) {
466
            $conn->executeUpdate('DELETE FROM cache_attraction_location_info');
467
            $conn->executeUpdate('DELETE FROM cache_attraction_contact_info');
468
            $conn->executeUpdate('DELETE FROM cache_attraction_info');
469
            $conn->executeUpdate('DELETE FROM cache_visited_cities');
470
            $conn->executeUpdate('DELETE FROM cache_flight');
471
            $conn->executeUpdate('DELETE FROM cache_attraction');
472
            $conn->executeUpdate('DELETE FROM cache_travel');
473
            $conn->executeUpdate('DELETE FROM cache_traveler');
474
            $conn->executeUpdate('DELETE FROM cache_traveler_profile_info');
475
            $conn->executeUpdate('DELETE FROM cache_traveler_profile');
476
            $conn->executeUpdate('DELETE FROM cache_city');
477
            $conn->executeUpdate('DELETE FROM cache_state');
478
            $conn->executeUpdate('DELETE FROM cache_country');
479
            $conn->executeUpdate('DELETE FROM cache_login');
480
            $conn->executeUpdate('DELETE FROM cache_token');
481
            $conn->executeUpdate('DELETE FROM cache_complex_action');
482
            $conn->executeUpdate('DELETE FROM cache_action');
483
            $conn->executeUpdate('DELETE FROM cache_client');
484
        }
485
486
        if (isset($this->_usedModelSets['ddc3346'])) {
487
            $conn->executeUpdate('DELETE FROM ddc3346_articles');
488
            $conn->executeUpdate('DELETE FROM ddc3346_users');
489
        }
490
491
        if (isset($this->_usedModelSets['quote'])) {
492
            $conn->executeUpdate(
493
                sprintf(
494
                    'UPDATE %s SET %s = NULL',
495
                    $platform->quoteIdentifier("quote-address"),
496
                    $platform->quoteIdentifier('user-id')
497
                )
498
            );
499
500
            $conn->executeUpdate('DELETE FROM ' . $platform->quoteIdentifier('quote-users-groups'));
501
            $conn->executeUpdate('DELETE FROM ' . $platform->quoteIdentifier('quote-group'));
502
            $conn->executeUpdate('DELETE FROM ' . $platform->quoteIdentifier('quote-phone'));
503
            $conn->executeUpdate('DELETE FROM ' . $platform->quoteIdentifier('quote-user'));
504
            $conn->executeUpdate('DELETE FROM ' . $platform->quoteIdentifier('quote-address'));
505
            $conn->executeUpdate('DELETE FROM ' . $platform->quoteIdentifier('quote-city'));
506
        }
507
508
        if (isset($this->_usedModelSets['vct_onetoone'])) {
509
            $conn->executeUpdate('DELETE FROM vct_owning_onetoone');
510
            $conn->executeUpdate('DELETE FROM vct_inversed_onetoone');
511
        }
512
513
        if (isset($this->_usedModelSets['vct_onetoone_compositeid'])) {
514
            $conn->executeUpdate('DELETE FROM vct_owning_onetoone_compositeid');
515
            $conn->executeUpdate('DELETE FROM vct_inversed_onetoone_compositeid');
516
        }
517
518
        if (isset($this->_usedModelSets['vct_onetoone_compositeid_foreignkey'])) {
519
            $conn->executeUpdate('DELETE FROM vct_owning_onetoone_compositeid_foreignkey');
520
            $conn->executeUpdate('DELETE FROM vct_inversed_onetoone_compositeid_foreignkey');
521
            $conn->executeUpdate('DELETE FROM vct_auxiliary');
522
        }
523
524
        if (isset($this->_usedModelSets['vct_onetomany'])) {
525
            $conn->executeUpdate('DELETE FROM vct_owning_manytoone');
526
            $conn->executeUpdate('DELETE FROM vct_inversed_onetomany');
527
        }
528
529
        if (isset($this->_usedModelSets['vct_onetomany_compositeid'])) {
530
            $conn->executeUpdate('DELETE FROM vct_owning_manytoone_compositeid');
531
            $conn->executeUpdate('DELETE FROM vct_inversed_onetomany_compositeid');
532
        }
533
534
        if (isset($this->_usedModelSets['vct_onetomany_compositeid_foreignkey'])) {
535
            $conn->executeUpdate('DELETE FROM vct_owning_manytoone_compositeid_foreignkey');
536
            $conn->executeUpdate('DELETE FROM vct_inversed_onetomany_compositeid_foreignkey');
537
            $conn->executeUpdate('DELETE FROM vct_auxiliary');
538
        }
539
540
        if (isset($this->_usedModelSets['vct_onetomany_extralazy'])) {
541
            $conn->executeUpdate('DELETE FROM vct_owning_manytoone_extralazy');
542
            $conn->executeUpdate('DELETE FROM vct_inversed_onetomany_extralazy');
543
        }
544
545
        if (isset($this->_usedModelSets['vct_manytomany'])) {
546
            $conn->executeUpdate('DELETE FROM vct_xref_manytomany');
547
            $conn->executeUpdate('DELETE FROM vct_owning_manytomany');
548
            $conn->executeUpdate('DELETE FROM vct_inversed_manytomany');
549
        }
550
551
        if (isset($this->_usedModelSets['vct_manytomany_compositeid'])) {
552
            $conn->executeUpdate('DELETE FROM vct_xref_manytomany_compositeid');
553
            $conn->executeUpdate('DELETE FROM vct_owning_manytomany_compositeid');
554
            $conn->executeUpdate('DELETE FROM vct_inversed_manytomany_compositeid');
555
        }
556
557
        if (isset($this->_usedModelSets['vct_manytomany_compositeid_foreignkey'])) {
558
            $conn->executeUpdate('DELETE FROM vct_xref_manytomany_compositeid_foreignkey');
559
            $conn->executeUpdate('DELETE FROM vct_owning_manytomany_compositeid_foreignkey');
560
            $conn->executeUpdate('DELETE FROM vct_inversed_manytomany_compositeid_foreignkey');
561
            $conn->executeUpdate('DELETE FROM vct_auxiliary');
562
        }
563
564
        if (isset($this->_usedModelSets['vct_manytomany_extralazy'])) {
565
            $conn->executeUpdate('DELETE FROM vct_xref_manytomany_extralazy');
566
            $conn->executeUpdate('DELETE FROM vct_owning_manytomany_extralazy');
567
            $conn->executeUpdate('DELETE FROM vct_inversed_manytomany_extralazy');
568
        }
569
        if (isset($this->_usedModelSets['geonames'])) {
570
            $conn->executeUpdate('DELETE FROM geonames_admin1_alternate_name');
571
            $conn->executeUpdate('DELETE FROM geonames_admin1');
572
            $conn->executeUpdate('DELETE FROM geonames_city');
573
            $conn->executeUpdate('DELETE FROM geonames_country');
574
        }
575
576
        if (isset($this->_usedModelSets['custom_id_object_type'])) {
577
            $conn->executeUpdate('DELETE FROM custom_id_type_child');
578
            $conn->executeUpdate('DELETE FROM custom_id_type_parent');
579
        }
580
581 View Code Duplication
        if (isset($this->_usedModelSets['pagination'])) {
0 ignored issues
show
This code seems to be duplicated across 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...
582
            $conn->executeUpdate('DELETE FROM pagination_logo');
583
            $conn->executeUpdate('DELETE FROM pagination_department');
584
            $conn->executeUpdate('DELETE FROM pagination_company');
585
            $conn->executeUpdate('DELETE FROM pagination_user');
586
        }
587
588
        if (isset($this->_usedModelSets['versioned_many_to_one'])) {
589
            $conn->executeUpdate('DELETE FROM versioned_many_to_one_article');
590
            $conn->executeUpdate('DELETE FROM versioned_many_to_one_category');
591
        }
592
593
        if (isset($this->_usedModelSets['issue5989'])) {
594
            $conn->executeUpdate('DELETE FROM issue5989_persons');
595
            $conn->executeUpdate('DELETE FROM issue5989_employees');
596
            $conn->executeUpdate('DELETE FROM issue5989_managers');
597
        }
598
599
        $this->_em->clear();
600
    }
601
602
    /**
603
     * @param array $classNames
604
     *
605
     * @return void
606
     *
607
     * @throws \RuntimeException
608
     */
609
    protected function setUpEntitySchema(array $classNames)
610
    {
611
        if ($this->_em === null) {
612
            throw new \RuntimeException("EntityManager not set, you have to call parent::setUp() before invoking this method.");
613
        }
614
615
        $classes = [];
616
        foreach ($classNames as $className) {
617
            if ( ! isset(static::$_entityTablesCreated[$className])) {
618
                static::$_entityTablesCreated[$className] = true;
619
                $classes[] = $this->_em->getClassMetadata($className);
620
            }
621
        }
622
623
        if ($classes) {
624
            $this->_schemaTool->createSchema($classes);
625
        }
626
    }
627
628
    /**
629
     * Creates a connection to the test database, if there is none yet, and
630
     * creates the necessary tables.
631
     *
632
     * @return void
633
     */
634
    protected function setUp()
635
    {
636
        $this->setUpDBALTypes();
637
638
        if ( ! isset(static::$_sharedConn)) {
639
            static::$_sharedConn = TestUtil::getConnection();
640
        }
641
642
        if (isset($GLOBALS['DOCTRINE_MARK_SQL_LOGS'])) {
643
            if (in_array(static::$_sharedConn->getDatabasePlatform()->getName(), ["mysql", "postgresql"])) {
644
                static::$_sharedConn->executeQuery('SELECT 1 /*' . get_class($this) . '*/');
645
            } else if (static::$_sharedConn->getDatabasePlatform()->getName() == "oracle") {
646
                static::$_sharedConn->executeQuery('SELECT 1 /*' . get_class($this) . '*/ FROM dual');
647
            }
648
        }
649
650
        if ( ! $this->_em) {
651
            $this->_em = $this->_getEntityManager();
652
            $this->_schemaTool = new SchemaTool($this->_em);
653
        }
654
655
        $classes = [];
656
657
        foreach ($this->_usedModelSets as $setName => $bool) {
658
            if ( ! isset(static::$_tablesCreated[$setName])) {
659
                foreach (static::$_modelSets[$setName] as $className) {
660
                    $classes[] = $this->_em->getClassMetadata($className);
661
                }
662
663
                static::$_tablesCreated[$setName] = true;
664
            }
665
        }
666
667
        if ($classes) {
668
            $this->_schemaTool->createSchema($classes);
669
        }
670
671
        $this->_sqlLoggerStack->enabled = true;
672
    }
673
674
    /**
675
     * Gets an EntityManager for testing purposes.
676
     *
677
     * @return EntityManager
678
     *
679
     * @throws \Doctrine\ORM\ORMException
680
     */
681
    protected function _getEntityManager(Connection $connection = null) {
682
        // NOTE: Functional tests use their own shared metadata cache, because
683
        // the actual database platform used during execution has effect on some
684
        // metadata mapping behaviors (like the choice of the ID generation).
685
        if (is_null(self::$_metadataCacheImpl)) {
686
            if (isset($GLOBALS['DOCTRINE_CACHE_IMPL'])) {
687
                self::$_metadataCacheImpl = new $GLOBALS['DOCTRINE_CACHE_IMPL'];
688
            } else {
689
                self::$_metadataCacheImpl = new ArrayCache();
690
            }
691
        }
692
693
        if (is_null(self::$_queryCacheImpl)) {
694
            self::$_queryCacheImpl = new ArrayCache();
695
        }
696
697
        $this->_sqlLoggerStack = new DebugStack();
698
        $this->_sqlLoggerStack->enabled = false;
699
700
        //FIXME: two different configs! $conn and the created entity manager have
701
        // different configs.
702
        $config = new Configuration();
703
        $config->setMetadataCacheImpl(self::$_metadataCacheImpl);
704
        $config->setQueryCacheImpl(self::$_queryCacheImpl);
705
        $config->setProxyDir(__DIR__ . '/Proxies');
706
        $config->setProxyNamespace('Doctrine\Tests\Proxies');
707
708
        if (null !== $this->resultCacheImpl) {
709
            $config->setResultCacheImpl($this->resultCacheImpl);
710
        }
711
712
        $enableSecondLevelCache = getenv('ENABLE_SECOND_LEVEL_CACHE');
713
714
        if ($this->isSecondLevelCacheEnabled || $enableSecondLevelCache) {
715
716
            $cacheConfig    = new CacheConfiguration();
717
            $cache          = $this->getSharedSecondLevelCacheDriverImpl();
718
            $factory        = new DefaultCacheFactory($cacheConfig->getRegionsConfiguration(), $cache);
719
720
            $this->secondLevelCacheFactory = $factory;
721
722
            if ($this->isSecondLevelCacheLogEnabled) {
723
                $this->secondLevelCacheLogger = new StatisticsCacheLogger();
724
                $cacheConfig->setCacheLogger($this->secondLevelCacheLogger);
725
            }
726
727
            $cacheConfig->setCacheFactory($factory);
728
            $config->setSecondLevelCacheEnabled(true);
729
            $config->setSecondLevelCacheConfiguration($cacheConfig);
730
731
            $this->isSecondLevelCacheEnabled = true;
732
        }
733
734
        $config->setMetadataDriverImpl(
735
            $config->newDefaultAnnotationDriver(
736
                [
737
                    realpath(__DIR__ . '/Models/Cache'),
738
                    realpath(__DIR__ . '/Models/GeoNames')
739
                ],
740
                true
741
            )
742
        );
743
744
        $conn = $connection ?: static::$_sharedConn;
745
        $conn->getConfiguration()->setSQLLogger($this->_sqlLoggerStack);
746
747
        // get rid of more global state
748
        $evm = $conn->getEventManager();
749
        foreach ($evm->getListeners() AS $event => $listeners) {
750
            foreach ($listeners AS $listener) {
751
                $evm->removeEventListener([$event], $listener);
752
            }
753
        }
754
755
        if ($enableSecondLevelCache) {
756
            $evm->addEventListener('loadClassMetadata', new CacheMetadataListener());
757
        }
758
759
        if (isset($GLOBALS['db_event_subscribers'])) {
760
            foreach (explode(",", $GLOBALS['db_event_subscribers']) AS $subscriberClass) {
761
                $subscriberInstance = new $subscriberClass();
762
                $evm->addEventSubscriber($subscriberInstance);
763
            }
764
        }
765
766
        if (isset($GLOBALS['debug_uow_listener'])) {
767
            $evm->addEventListener(['onFlush'], new DebugUnitOfWorkListener());
768
        }
769
770
        return EntityManager::create($conn, $config);
771
    }
772
773
    /**
774
     * @param \Throwable $e
775
     *
776
     * @return void
777
     *
778
     * @throws \Throwable
779
     */
780
    protected function onNotSuccessfulTest(\Throwable $e)
781
    {
782
        if ($e instanceof AssertionFailedError) {
783
            throw $e;
784
        }
785
786
        if(isset($this->_sqlLoggerStack->queries) && count($this->_sqlLoggerStack->queries)) {
787
            $queries = "";
788
            $last25queries = array_slice(array_reverse($this->_sqlLoggerStack->queries, true), 0, 25, true);
789
            foreach ($last25queries as $i => $query) {
790
                $params = array_map(function($p) { if (is_object($p)) return get_class($p); else return var_export($p, true); }, $query['params'] ?: []
791
                );
792
                $queries .= $i.". SQL: '".$query['sql']."' Params: ".implode(", ", $params).PHP_EOL;
793
            }
794
795
            $trace = $e->getTrace();
796
            $traceMsg = "";
797
            foreach($trace AS $part) {
798
                if(isset($part['file'])) {
799
                    if(strpos($part['file'], "PHPUnit/") !== false) {
800
                        // Beginning with PHPUnit files we don't print the trace anymore.
801
                        break;
802
                    }
803
804
                    $traceMsg .= $part['file'].":".$part['line'].PHP_EOL;
805
                }
806
            }
807
808
            $message = "[".get_class($e)."] ".$e->getMessage().PHP_EOL.PHP_EOL."With queries:".PHP_EOL.$queries.PHP_EOL."Trace:".PHP_EOL.$traceMsg;
809
810
            throw new \Exception($message, (int)$e->getCode(), $e);
811
        }
812
        throw $e;
813
    }
814
815
    public function assertSQLEquals($expectedSql, $actualSql)
816
    {
817
        return $this->assertEquals(strtolower($expectedSql), strtolower($actualSql), "Lowercase comparison of SQL statements failed.");
818
    }
819
820
    /**
821
     * Using the SQL Logger Stack this method retrieves the current query count executed in this test.
822
     *
823
     * @return int
824
     */
825
    protected function getCurrentQueryCount()
826
    {
827
        return count($this->_sqlLoggerStack->queries);
828
    }
829
830
    /**
831
     * Configures DBAL types required in tests
832
     */
833
    protected function setUpDBALTypes()
834
    {
835
        if (Type::hasType('rot13')) {
836
            Type::overrideType('rot13', Rot13Type::class);
837
        } else {
838
            Type::addType('rot13', Rot13Type::class);
839
        }
840
    }
841
}
842