diff --git a/src/FixtureFactory.php b/src/FixtureFactory.php index b79db168..cde2362e 100644 --- a/src/FixtureFactory.php +++ b/src/FixtureFactory.php @@ -46,11 +46,8 @@ final class FixtureFactory public function __construct(ORM\EntityManagerInterface $em) { $this->em = $em; - $this->entityDefs = []; - $this->singletons = []; - $this->persist = false; } @@ -88,6 +85,7 @@ public function get($name, array $fieldOverrides = []) $entityMetadata = $def->getEntityMetadata(); $ent = $entityMetadata->newInstance(); + $fieldValues = []; foreach ($def->getFieldDefs() as $fieldName => $fieldDef) { @@ -167,6 +165,7 @@ public function getAsSingleton($name, array $fieldOverrides = []) if (isset($this->singletons[$name])) { throw new \Exception("Already a singleton: {$name}"); } + $this->singletons[$name] = $this->get($name, $fieldOverrides); return $this->singletons[$name]; @@ -275,6 +274,7 @@ private function createCollectionFrom($array = []) private function updateCollectionSideOfAssocation($entityBeingCreated, $metadata, $fieldName, $value): void { $assoc = $metadata->getAssociationMapping($fieldName); + $inverse = $assoc['inversedBy']; if ($inverse) { diff --git a/test/Integration/FixtureFactoryTest.php b/test/Integration/FixtureFactoryTest.php index 930047f6..d5363f1d 100644 --- a/test/Integration/FixtureFactoryTest.php +++ b/test/Integration/FixtureFactoryTest.php @@ -31,11 +31,14 @@ public function testAutomaticPersistCanBeTurnedOn(): void $fixtureFactory = new FixtureFactory($entityManager); - $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, ['name' => 'Zeta']); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, [ + 'name' => 'Zeta', + ]); $fixtureFactory->persistOnGet(); $ss = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class); + $entityManager->flush(); self::assertNotNull($ss->getId()); @@ -48,18 +51,21 @@ public function testDoesNotPersistByDefault(): void $fixtureFactory = new FixtureFactory($entityManager); - $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, ['name' => 'Zeta']); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, [ + 'name' => 'Zeta', + ]); $ss = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class); $entityManager->flush(); self::assertNull($ss->getId()); - $q = $entityManager - ->createQueryBuilder() + + $q = $entityManager->createQueryBuilder() ->select('ss') ->from(Fixture\FixtureFactory\Entity\Spaceship::class, 'ss') ->getQuery(); + self::assertEmpty($q->getResult()); } diff --git a/test/Unit/FixtureFactoryTest.php b/test/Unit/FixtureFactoryTest.php index 1a6303d7..1b1572b4 100644 --- a/test/Unit/FixtureFactoryTest.php +++ b/test/Unit/FixtureFactoryTest.php @@ -97,7 +97,9 @@ public function testThrowsWhenTryingToGiveNonexistentFieldsWhileConstructing(): { $fixtureFactory = new FixtureFactory(self::createEntityManager()); - $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, ['name' => 'Alpha']); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, [ + 'name' => 'Alpha', + ]); $this->expectException(\Exception::class); @@ -143,7 +145,9 @@ public function testAcceptsGeneratorFunctionsInEntityDefinitions(): void ]); self::assertSame('M/S Star', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); + $name = 'Superstar'; + self::assertSame('M/S Superstar', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); } @@ -155,7 +159,9 @@ public function testValuesCanBeOverriddenAtCreationTime(): void 'name' => 'My BattleCruiser', ]); - $ss = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class, ['name' => 'My CattleBruiser']); + $ss = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class, [ + 'name' => 'My CattleBruiser', + ]); self::assertSame('My CattleBruiser', $ss->getName()); } @@ -201,6 +207,7 @@ public function testArrayElementsAreMappedToCollectionAsscociationFields(): void $fixtureFactory = new FixtureFactory(self::createEntityManager()); $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Person::class, [ 'spaceship' => FieldDef::reference(Fixture\FixtureFactory\Entity\Spaceship::class), ]); @@ -210,10 +217,14 @@ public function testArrayElementsAreMappedToCollectionAsscociationFields(): void $ship = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class, [ 'name' => 'Battlestar Galaxy', - 'crew' => [$p1, $p2], + 'crew' => [ + $p1, + $p2, + ], ]); self::assertInstanceOf(Common\Collections\ArrayCollection::class, $ship->getCrew()); + self::assertTrue($ship->getCrew()->contains($p1)); self::assertTrue($ship->getCrew()->contains($p2)); } @@ -223,6 +234,7 @@ public function testUnspecifiedFieldsAreLeftNull(): void $fixtureFactory = new FixtureFactory(self::createEntityManager()); $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); + self::assertNull($fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); } @@ -233,31 +245,17 @@ public function testEntityIsDefinedToDefaultNamespace(): void $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Person\User::class); - self::assertInstanceOf( - Fixture\FixtureFactory\Entity\Spaceship::class, - $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class) - ); - - self::assertInstanceOf( - Fixture\FixtureFactory\Entity\Person\User::class, - $fixtureFactory->get(Fixture\FixtureFactory\Entity\Person\User::class) - ); + self::assertInstanceOf(Fixture\FixtureFactory\Entity\Spaceship::class, $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)); + self::assertInstanceOf(Fixture\FixtureFactory\Entity\Person\User::class, $fixtureFactory->get(Fixture\FixtureFactory\Entity\Person\User::class)); } public function testEntityCanBeDefinedToAnotherNamespace(): void { $fixtureFactory = new FixtureFactory(self::createEntityManager()); - $fixtureFactory->defineEntity( - Fixture\FixtureFactory\Entity\Artist::class - ); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Artist::class); - self::assertInstanceOf( - Fixture\FixtureFactory\Entity\Artist::class, - $fixtureFactory->get( - Fixture\FixtureFactory\Entity\Artist::class - ) - ); + self::assertInstanceOf(Fixture\FixtureFactory\Entity\Artist::class, $fixtureFactory->get(Fixture\FixtureFactory\Entity\Artist::class)); } public function testReturnsListOfEntities(): void @@ -283,11 +281,13 @@ public function testBidirectionalOntToManyReferencesAreAssignedBothWays(): void $fixtureFactory = new FixtureFactory(self::createEntityManager()); $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Person::class, [ 'spaceship' => FieldDef::reference(Fixture\FixtureFactory\Entity\Spaceship::class), ]); $person = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Person::class); + $ship = $person->getSpaceShip(); self::assertContains($person, $ship->getCrew()); @@ -300,6 +300,7 @@ public function testUnidirectionalReferencesWorkAsUsual(): void $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Badge::class, [ 'owner' => FieldDef::reference(Fixture\FixtureFactory\Entity\Person::class), ]); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Person::class); self::assertInstanceOf(Fixture\FixtureFactory\Entity\Person::class, $fixtureFactory->get(Fixture\FixtureFactory\Entity\Badge::class)->getOwner()); @@ -323,6 +324,7 @@ public function testReferencedObjectsShouldBeCreatedAutomatically(): void $crew = $spaceShip->getCrew(); self::assertInstanceOf(Common\Collections\ArrayCollection::class, $crew); + self::assertContainsOnly(Fixture\FixtureFactory\Entity\Person::class, $crew); self::assertCount(1, $crew); } @@ -349,6 +351,7 @@ public function testReferencedObjectsShouldBeOverrideable(): void $crew = $spaceShip->getCrew(); self::assertInstanceOf(Common\Collections\ArrayCollection::class, $crew); + self::assertContainsOnly(Fixture\FixtureFactory\Entity\Person::class, $crew); self::assertCount($count, $crew); } @@ -373,6 +376,7 @@ public function testReferencedObjectsShouldBeNullable(): void $crew = $spaceShip->getCrew(); self::assertInstanceOf(Common\Collections\ArrayCollection::class, $crew); + self::assertEmpty($crew); } @@ -381,12 +385,15 @@ public function testReferencedObjectsShouldBeNullableVariation(): void $fixtureFactory = new FixtureFactory(self::createEntityManager()); $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Person::class, [ 'name' => 'Eve', 'spaceship' => FieldDef::reference(Fixture\FixtureFactory\Entity\Spaceship::class), ]); - $person = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Person::class, ['spaceship' => null]); + $person = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Person::class, [ + 'spaceship' => null, + ]); self::assertNull($person->getSpaceShip()); } @@ -409,7 +416,10 @@ public function testGetAsSingletonMethodAcceptsFieldOverridesLikeGet(): void $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); - $ss = $fixtureFactory->getAsSingleton(Fixture\FixtureFactory\Entity\Spaceship::class, ['name' => 'Beta']); + $ss = $fixtureFactory->getAsSingleton(Fixture\FixtureFactory\Entity\Spaceship::class, [ + 'name' => 'Beta', + ]); + self::assertSame('Beta', $ss->getName()); self::assertSame('Beta', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); } @@ -418,7 +428,10 @@ public function testThrowsAnErrorWhenCallingGetSingletonTwiceOnTheSameEntity(): { $fixtureFactory = new FixtureFactory(self::createEntityManager()); - $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, ['name' => 'Alpha']); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, [ + 'name' => 'Alpha', + ]); + $fixtureFactory->getAsSingleton(Fixture\FixtureFactory\Entity\Spaceship::class); $this->expectException(\Exception::class); @@ -433,6 +446,7 @@ public function testAllowsSettingSingletons(): void $fixtureFactory = new FixtureFactory(self::createEntityManager()); $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); + $ss = new Fixture\FixtureFactory\Entity\Spaceship('The mothership'); $fixtureFactory->setSingleton(Fixture\FixtureFactory\Entity\Spaceship::class, $ss); @@ -445,6 +459,7 @@ public function testAllowsUnsettingSingletons(): void $fixtureFactory = new FixtureFactory(self::createEntityManager()); $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); + $ss = new Fixture\FixtureFactory\Entity\Spaceship('The mothership'); $fixtureFactory->setSingleton(Fixture\FixtureFactory\Entity\Spaceship::class, $ss); @@ -458,6 +473,7 @@ public function testAllowsOverwritingExistingSingletons(): void $fixtureFactory = new FixtureFactory(self::createEntityManager()); $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); + $ss1 = new Fixture\FixtureFactory\Entity\Spaceship('The mothership'); $ss2 = new Fixture\FixtureFactory\Entity\Spaceship('The battlecruiser'); @@ -488,6 +504,7 @@ public function testReferencedObjectsCanBeSingletons(): void $crew = $spaceShip->getCrew(); self::assertInstanceOf(Common\Collections\ArrayCollection::class, $crew); + self::assertContains($person, $crew); self::assertCount(1, $crew); } @@ -497,11 +514,13 @@ public function testWhenTheOneSideIsASingletonItMayGetSeveralChildObjects(): voi $fixtureFactory = new FixtureFactory(self::createEntityManager()); $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Person::class, [ 'spaceship' => FieldDef::reference(Fixture\FixtureFactory\Entity\Spaceship::class), ]); $ship = $fixtureFactory->getAsSingleton(Fixture\FixtureFactory\Entity\Spaceship::class); + $p1 = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Person::class); $p2 = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Person::class); @@ -513,13 +532,18 @@ public function testCanInvokeACallbackAfterObjectConstruction(): void { $fixtureFactory = new FixtureFactory(self::createEntityManager()); - $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, [ - 'name' => 'Foo', - ], [ - 'afterCreate' => static function (Fixture\FixtureFactory\Entity\Spaceship $ss, array $fieldValues): void { - $ss->setName($ss->getName() . '-' . $fieldValues['name']); - }, - ]); + $fixtureFactory->defineEntity( + Fixture\FixtureFactory\Entity\Spaceship::class, + [ + 'name' => 'Foo', + ], + [ + 'afterCreate' => static function (Fixture\FixtureFactory\Entity\Spaceship $ss, array $fieldValues): void { + $ss->setName($ss->getName() . '-' . $fieldValues['name']); + }, + ] + ); + $ss = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class); self::assertSame('Foo-Foo', $ss->getName()); @@ -529,14 +553,21 @@ public function testTheAfterCreateCallbackCanBeUsedToCallTheConstructor(): void { $fixtureFactory = new FixtureFactory(self::createEntityManager()); - $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, [ - 'name' => 'Foo', - ], [ - 'afterCreate' => static function (Fixture\FixtureFactory\Entity\Spaceship $ss, array $fieldValues): void { - $ss->__construct($fieldValues['name'] . 'Master'); - }, + $fixtureFactory->defineEntity( + Fixture\FixtureFactory\Entity\Spaceship::class, + [ + 'name' => 'Foo', + ], + [ + 'afterCreate' => static function (Fixture\FixtureFactory\Entity\Spaceship $ss, array $fieldValues): void { + $ss->__construct($fieldValues['name'] . 'Master'); + }, + ] + ); + + $ss = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class, [ + 'name' => 'Xoo', ]); - $ss = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class, ['name' => 'Xoo']); self::assertTrue($ss->constructorWasCalled()); self::assertSame('XooMaster', $ss->getName()); @@ -547,6 +578,7 @@ public function testReferencedObjectShouldBeCreatedAutomatically(): void $fixtureFactory = new FixtureFactory(self::createEntityManager()); $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); + $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Person::class, [ 'name' => 'Eve', 'spaceship' => FieldDef::reference(Fixture\FixtureFactory\Entity\Spaceship::class), @@ -594,6 +626,7 @@ public function testTransitiveReferencesWorkWithSingletons(): void $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class); $fixtureFactory->getAsSingleton(Fixture\FixtureFactory\Entity\Spaceship::class); + $badge1 = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Badge::class); $badge2 = $fixtureFactory->get(Fixture\FixtureFactory\Entity\Badge::class); @@ -610,6 +643,7 @@ public function testSequenceGeneratorCallsAFunctionWithAnIncrementingArgument(): return "Alpha {$n}"; }), ]); + self::assertSame('Alpha 1', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); self::assertSame('Alpha 2', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); self::assertSame('Alpha 3', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); @@ -623,6 +657,7 @@ public function testSequenceGeneratorCanTakeAPlaceholderString(): void $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, [ 'name' => FieldDef::sequence('Beta %d'), ]); + self::assertSame('Beta 1', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); self::assertSame('Beta 2', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); self::assertSame('Beta 3', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); @@ -636,6 +671,7 @@ public function testSequenceGeneratorCanTakeAStringToAppendTo(): void $fixtureFactory->defineEntity(Fixture\FixtureFactory\Entity\Spaceship::class, [ 'name' => FieldDef::sequence('Gamma '), ]); + self::assertSame('Gamma 1', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); self::assertSame('Gamma 2', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName()); self::assertSame('Gamma 3', $fixtureFactory->get(Fixture\FixtureFactory\Entity\Spaceship::class)->getName());