From cf8a9fdc36903ca6842e1b44489272856994eae7 Mon Sep 17 00:00:00 2001 From: Nicolas PHILIPPE Date: Sat, 4 Jan 2025 14:32:29 +0100 Subject: [PATCH] test: add orphan removal premutation --- ...cadePersistOnLoadClassMetadataListener.php | 4 +++ ...hangesEntityRelationshipCascadePersist.php | 7 ++-- .../DoctrineCascadeRelationshipMetadata.php | 36 ++++++++++++++++--- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/tests/Fixture/DoctrineCascadeRelationship/ChangeCascadePersistOnLoadClassMetadataListener.php b/tests/Fixture/DoctrineCascadeRelationship/ChangeCascadePersistOnLoadClassMetadataListener.php index e5b2e302b..ba3327ef9 100644 --- a/tests/Fixture/DoctrineCascadeRelationship/ChangeCascadePersistOnLoadClassMetadataListener.php +++ b/tests/Fixture/DoctrineCascadeRelationship/ChangeCascadePersistOnLoadClassMetadataListener.php @@ -44,6 +44,10 @@ public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void foreach ($this->metadata as $metadatum) { if ($classMetadata->getName() === $metadatum->class) { $classMetadata->getAssociationMapping($metadatum->field)['cascade'] = $metadatum->cascade ? ['persist'] : []; + + if ($metadatum->orphanRemoval) { + $classMetadata->getAssociationMapping($metadatum->field)['orphanRemoval'] = true; + } } } } diff --git a/tests/Fixture/DoctrineCascadeRelationship/ChangesEntityRelationshipCascadePersist.php b/tests/Fixture/DoctrineCascadeRelationship/ChangesEntityRelationshipCascadePersist.php index a244beec4..895747a0d 100644 --- a/tests/Fixture/DoctrineCascadeRelationship/ChangesEntityRelationshipCascadePersist.php +++ b/tests/Fixture/DoctrineCascadeRelationship/ChangesEntityRelationshipCascadePersist.php @@ -112,9 +112,12 @@ public static function provideCascadeRelationshipsCombinations(): iterable throw new \LogicException(\sprintf("Wrong parameters for attribute \"%s\". Association \"{$class}::\${$field}\" does not exist.", UsingRelationships::class)); } - $relationshipFields[] = ['class' => $association['sourceEntity'], 'field' => $association['fieldName']]; + $relationshipFields[] = ['class' => $association['sourceEntity'], 'field' => $association['fieldName'], 'isOneToMany' => $association['type'] === ClassMetadata::ONE_TO_MANY]; if ($association['inversedBy'] ?? $association['mappedBy'] ?? null) { - $relationshipFields[] = ['class' => $association['targetEntity'], 'field' => $association['inversedBy'] ?? $association['mappedBy']]; + /** @var ClassMetadata $metadataTargetEntity */ + $metadataTargetEntity = $persistenceManager->metadataFor($association['targetEntity']); // @phpstan-ignore argument.templateType + $associationTargetEntity = $metadataTargetEntity->getAssociationMapping($association['inversedBy'] ?? $association['mappedBy']); + $relationshipFields[] = ['class' => $associationTargetEntity['sourceEntity'], 'field' => $associationTargetEntity['fieldName'], 'isOneToMany' => $associationTargetEntity['type'] === ClassMetadata::ONE_TO_MANY]; } } } diff --git a/tests/Fixture/DoctrineCascadeRelationship/DoctrineCascadeRelationshipMetadata.php b/tests/Fixture/DoctrineCascadeRelationship/DoctrineCascadeRelationshipMetadata.php index ffc2be412..a5b3b54ed 100644 --- a/tests/Fixture/DoctrineCascadeRelationship/DoctrineCascadeRelationshipMetadata.php +++ b/tests/Fixture/DoctrineCascadeRelationship/DoctrineCascadeRelationshipMetadata.php @@ -22,24 +22,31 @@ private function __construct( public readonly string $class, public readonly string $field, public readonly bool $cascade, + public readonly bool $orphanRemoval, ) { } public function __toString(): string { - return \sprintf('%s::$%s - %s', $this->class, $this->field, $this->cascade ? 'cascade' : 'no cascade'); + $name = \sprintf('%s::$%s - %s', $this->class, $this->field, $this->cascade ? 'cascade' : 'no cascade'); + + if ($this->orphanRemoval) { + $name = "{$name} - (orphan removal)"; + } + + return $name; } /** * @param array{class: class-string, field: string} $source */ - public static function fromArray(array $source, bool $cascade = false): self + public static function fromArray(array $source, bool $cascade = false, bool $orphanRemoval = false): self { - return new self(class: $source['class'], field: $source['field'], cascade: $cascade); + return new self(class: $source['class'], field: $source['field'], cascade: $cascade, orphanRemoval: $orphanRemoval); } /** - * @param list $relationshipFields + * @param list $relationshipFields * @return \Generator> */ public static function allCombinations(array $relationshipFields): iterable @@ -55,6 +62,8 @@ public static function allCombinations(array $relationshipFields): iterable $total = 2 ** \count($relationshipFields); + $hasOneToMany = false; + for ($i = 0; $i < $total; ++$i) { $temp = []; @@ -64,9 +73,28 @@ public static function allCombinations(array $relationshipFields): iterable $temp[] = $metadata; $permutationName = "{$permutationName}$metadata\n"; + + if ($relationshipFields[$j]['isOneToMany']) { + $hasOneToMany = true; + } } yield $permutationName => $temp; } + + if (!$hasOneToMany) { + return; + } + + // if we have at least one OneToMany relationship, we need to test with orphan removal + // let's add only one permutation with orphan removal (and all cascade to true) + $temp = []; + $permutationName = "\n"; + foreach ($relationshipFields as $relationshipField) { + $metadata = self::fromArray($relationshipField, cascade: true, orphanRemoval: $relationshipField['isOneToMany']); + $temp[] = $metadata; + $permutationName = "{$permutationName}$metadata\n"; + } + yield $permutationName => $temp; } }