OrmFunctionalTestCase::tearDown()   F
last analyzed

Complexity

Conditions 35
Paths 1

Size

Total Lines 273
Code Lines 195

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 35
eloc 195
nc 1
nop 0
dl 0
loc 273
rs 3.3333
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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

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

751
        $conn->/** @scrutinizer ignore-call */ 
752
               getConfiguration()->setSQLLogger($this->sqlLoggerStack);
Loading history...
Bug introduced by
The method getConfiguration() does not exist on null. ( Ignorable by Annotation )

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

751
        $conn->/** @scrutinizer ignore-call */ 
752
               getConfiguration()->setSQLLogger($this->sqlLoggerStack);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
752
753
        // get rid of more global state
754
        $evm = $conn->getEventManager();
0 ignored issues
show
Bug introduced by
The method getEventManager() does not exist on Doctrine\DBAL\Driver\Connection. It seems like you code against a sub-type of Doctrine\DBAL\Driver\Connection such as Doctrine\DBAL\Connection. ( Ignorable by Annotation )

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

754
        /** @scrutinizer ignore-call */ 
755
        $evm = $conn->getEventManager();
Loading history...
755
756
        foreach ($evm->getListeners() as $event => $listeners) {
757
            foreach ($listeners as $listener) {
758
                $evm->removeEventListener([$event], $listener);
759
            }
760
        }
761
762
        if ($enableSecondLevelCache) {
763
            $evm->addEventListener('loadClassMetadata', new CacheMetadataListener());
764
        }
765
766
        if (isset($GLOBALS['db_event_subscribers'])) {
767
            foreach (explode(',', $GLOBALS['db_event_subscribers']) as $subscriberClass) {
768
                $subscriberInstance = new $subscriberClass();
769
                $evm->addEventSubscriber($subscriberInstance);
770
            }
771
        }
772
773
        if (isset($GLOBALS['debug_uow_listener'])) {
774
            $evm->addEventListener(['onFlush'], new DebugUnitOfWorkListener());
775
        }
776
777
        return EntityManager::create($conn, $config);
778
    }
779
780
    /**
781
     *
782
     *
783
     * @throws \Throwable
784
     */
785
    protected function onNotSuccessfulTest(\Throwable $e)
786
    {
787
        if ($e instanceof AssertionFailedError) {
788
            throw $e;
789
        }
790
791
        if (isset($this->sqlLoggerStack->queries) && count($this->sqlLoggerStack->queries)) {
792
            $queries       = '';
793
            $last25queries = array_slice(array_reverse($this->sqlLoggerStack->queries, true), 0, 25, true);
794
795
            foreach ($last25queries as $i => $query) {
796
                $params = array_map(
797
                    function ($p) {
798
                        return is_object($p) ? get_class($p) : var_export($p, true);
799
                    },
800
                    $query['params'] ?: []
801
                );
802
803
                $queries .= $i . ". SQL: '" . $query['sql'] . "' Params: " . implode(', ', $params) . PHP_EOL;
804
            }
805
806
            $trace    = $e->getTrace();
807
            $traceMsg = '';
808
809
            foreach ($trace as $part) {
810
                if (isset($part['file'])) {
811
                    if (strpos($part['file'], 'PHPUnit/') !== false) {
812
                        // Beginning with PHPUnit files we don't print the trace anymore.
813
                        break;
814
                    }
815
816
                    $traceMsg .= $part['file'] . ':' . $part['line'] . PHP_EOL;
817
                }
818
            }
819
820
            $message = '[' . get_class($e) . '] ' . $e->getMessage() . PHP_EOL . PHP_EOL . 'With queries:' . PHP_EOL . $queries . PHP_EOL . 'Trace:' . PHP_EOL . $traceMsg;
821
822
            throw new \Exception($message, (int) $e->getCode(), $e);
823
        }
824
825
        throw $e;
826
    }
827
828
    public static function assertSQLEquals($expectedSql, $actualSql)
829
    {
830
        self::assertEquals(
831
            strtolower((string) $expectedSql),
832
            strtolower((string) $actualSql),
833
            'Lowercase comparison of SQL statements failed.'
834
        );
835
    }
836
837
    /**
838
     * Using the SQL Logger Stack this method retrieves the current query count executed in this test.
839
     *
840
     * @return int
841
     */
842
    protected function getCurrentQueryCount()
843
    {
844
        return count($this->sqlLoggerStack->queries);
845
    }
846
847
    /**
848
     * Configures DBAL types required in tests
849
     */
850
    protected function setUpDBALTypes()
851
    {
852
        if (Type::hasType('rot13')) {
853
            Type::overrideType('rot13', Rot13Type::class);
854
        } else {
855
            Type::addType('rot13', Rot13Type::class);
856
        }
857
    }
858
}
859