Files
piratepoet/mailpoet/tests/_support/IntegrationCleanupExtension.php
Jan Jakes 200ea47926 Use mysqli to run test cleanups
[MAILPOET-6142]
2024-08-19 15:29:42 +02:00

68 lines
2.2 KiB
PHP

<?php declare(strict_types = 1);
namespace MailPoet\TestsSupport;
use Codeception\Event\SuiteEvent;
use Codeception\Event\TestEvent;
use Codeception\Events;
use Codeception\Extension;
use MailPoet\Config\Env;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\SettingEntity;
use MailPoetVendor\Doctrine\ORM\EntityManager;
use mysqli;
class IntegrationCleanupExtension extends Extension {
/** @var EntityManager */
private $entityManager;
public static $events = [
Events::TEST_BEFORE => 'beforeTest',
Events::SUITE_BEFORE => 'beforeSuite',
];
/** @var string */
private $cleanupStatements;
public function beforeSuite(SuiteEvent $event) {
$this->entityManager = ContainerWrapper::getInstance()->get(EntityManager::class);
$mpPrefix = Env::$dbPrefix;
/** @var string[] $tables */
$tables = $this->entityManager->getConnection()->fetchFirstColumn("
SELECT table_name
FROM information_schema.tables
WHERE table_name LIKE '{$mpPrefix}%'
AND table_name != '{$mpPrefix}migrations'
AND table_name != '{$mpPrefix}newsletter_option_fields'
");
$this->cleanupStatements = 'SET FOREIGN_KEY_CHECKS=0;';
foreach ($tables as $table) {
$this->cleanupStatements .= "DELETE FROM $table;";
}
// save plugin version to avoid triggering migrator and populator
$settingsTable = $this->entityManager->getMetadataFactory()->getMetadataFor(SettingEntity::class)->getTableName();
$dbVersion = Env::$version;
$this->cleanupStatements .= "
INSERT INTO $settingsTable (name, value, created_at, updated_at)
VALUES ('db_version', '$dbVersion', NOW(), NOW());
";
$this->cleanupStatements .= 'SET FOREIGN_KEY_CHECKS=1';
}
public function beforeTest(TestEvent $event) {
$mysqli = $this->entityManager->getConnection()->getNativeConnection();
$result = $mysqli instanceof mysqli ? $mysqli->multi_query($this->cleanupStatements) : false;
if ($result === false) {
$error = $mysqli instanceof mysqli ? $mysqli->error : 'Unknown error';
throw new \RuntimeException('Failed to execute DB cleanup statements: ' . $error);
}
while ($mysqli->next_result()) {
// flush all multi_query results
}
}
}