|
|
@@ -18,6 +18,7 @@ namespace Cake\TestSuite\Fixture;
|
|
|
|
|
|
use Cake\Core\Configure;
|
|
|
use Cake\Core\Exception\Exception;
|
|
|
+use Cake\Database\ConstraintsInterface;
|
|
|
use Cake\Database\Schema\TableSchema;
|
|
|
use Cake\Database\Schema\TableSchemaAwareInterface;
|
|
|
use Cake\Datasource\ConnectionInterface;
|
|
|
@@ -210,6 +211,7 @@ class FixtureManager
|
|
|
$className = implode('\\', array_filter($nameSegments));
|
|
|
} else {
|
|
|
$className = $fixture;
|
|
|
+ /** @psalm-suppress PossiblyFalseArgument */
|
|
|
$name = preg_replace('/Fixture\z/', '', substr(strrchr($fixture, '\\'), 1));
|
|
|
}
|
|
|
|
|
|
@@ -254,7 +256,7 @@ class FixtureManager
|
|
|
|
|
|
$hasSchema = $fixture instanceof TableSchemaAwareInterface && $fixture->getTableSchema() instanceof TableSchema;
|
|
|
|
|
|
- if (($drop && $exists) || ($exists && !$isFixtureSetup && $hasSchema)) {
|
|
|
+ if (($drop && $exists) || ($exists && $hasSchema)) {
|
|
|
$fixture->drop($db);
|
|
|
$fixture->create($db);
|
|
|
} elseif (!$exists) {
|
|
|
@@ -285,16 +287,20 @@ class FixtureManager
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
- $createTables = function (ConnectionInterface $db, $fixtures) use ($test): void {
|
|
|
+ $createTables = function (ConnectionInterface $db, array $fixtures) use ($test): void {
|
|
|
$tables = $db->getSchemaCollection()->listTables();
|
|
|
$configName = $db->configName();
|
|
|
if (!isset($this->_insertionMap[$configName])) {
|
|
|
$this->_insertionMap[$configName] = [];
|
|
|
}
|
|
|
|
|
|
- /** @var \Cake\TestSuite\Fixture\TestFixture[] $fixtures */
|
|
|
+ /** @var \Cake\Datasource\FixtureInterface[] $fixtures */
|
|
|
foreach ($fixtures as $fixture) {
|
|
|
- if (in_array($fixture->table, $tables, true)) {
|
|
|
+ if (!$fixture instanceof ConstraintsInterface) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (in_array($fixture->sourceName(), $tables, true)) {
|
|
|
try {
|
|
|
$fixture->dropConstraints($db);
|
|
|
} catch (PDOException $e) {
|
|
|
@@ -318,6 +324,10 @@ class FixtureManager
|
|
|
}
|
|
|
|
|
|
foreach ($fixtures as $fixture) {
|
|
|
+ if (!$fixture instanceof ConstraintsInterface) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
try {
|
|
|
$fixture->createConstraints($db);
|
|
|
} catch (PDOException $e) {
|
|
|
@@ -334,7 +344,7 @@ class FixtureManager
|
|
|
$this->_runOperation($fixtures, $createTables);
|
|
|
|
|
|
// Use a separate transaction because of postgres.
|
|
|
- $insert = function ($db, $fixtures) use ($test): void {
|
|
|
+ $insert = function (ConnectionInterface $db, array $fixtures) use ($test): void {
|
|
|
foreach ($fixtures as $fixture) {
|
|
|
try {
|
|
|
$fixture->insert($db);
|
|
|
@@ -378,7 +388,7 @@ class FixtureManager
|
|
|
$db->disableQueryLogging();
|
|
|
}
|
|
|
$db->transactional(function (ConnectionInterface $db) use ($fixtures, $operation): void {
|
|
|
- $db->disableConstraints(function ($db) use ($fixtures, $operation): void {
|
|
|
+ $db->disableConstraints(function (ConnectionInterface $db) use ($fixtures, $operation): void {
|
|
|
$operation($db, $fixtures);
|
|
|
});
|
|
|
});
|
|
|
@@ -418,11 +428,13 @@ class FixtureManager
|
|
|
if (empty($test->fixtures)) {
|
|
|
return;
|
|
|
}
|
|
|
- $truncate = function ($db, $fixtures): void {
|
|
|
+ $truncate = function (ConnectionInterface $db, array $fixtures): void {
|
|
|
$configName = $db->configName();
|
|
|
|
|
|
foreach ($fixtures as $name => $fixture) {
|
|
|
- if ($this->isFixtureSetup($configName, $fixture)) {
|
|
|
+ if ($this->isFixtureSetup($configName, $fixture)
|
|
|
+ && $fixture instanceof ConstraintsInterface
|
|
|
+ ) {
|
|
|
$fixture->dropConstraints($db);
|
|
|
}
|
|
|
}
|
|
|
@@ -463,11 +475,15 @@ class FixtureManager
|
|
|
}
|
|
|
|
|
|
if (!$dropTables) {
|
|
|
- $fixture->dropConstraints($db);
|
|
|
+ if ($fixture instanceof ConstraintsInterface) {
|
|
|
+ $fixture->dropConstraints($db);
|
|
|
+ }
|
|
|
$fixture->truncate($db);
|
|
|
}
|
|
|
|
|
|
- $fixture->createConstraints($db);
|
|
|
+ if ($fixture instanceof ConstraintsInterface) {
|
|
|
+ $fixture->createConstraints($db);
|
|
|
+ }
|
|
|
$fixture->insert($db);
|
|
|
}
|
|
|
|
|
|
@@ -478,7 +494,7 @@ class FixtureManager
|
|
|
*/
|
|
|
public function shutDown(): void
|
|
|
{
|
|
|
- $shutdown = function (ConnectionInterface $db, $fixtures): void {
|
|
|
+ $shutdown = function (ConnectionInterface $db, array $fixtures): void {
|
|
|
$connection = $db->configName();
|
|
|
/** @var \Cake\Datasource\FixtureInterface $fixture */
|
|
|
foreach ($fixtures as $fixture) {
|