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
|
|||
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 |
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.