Skip to content

Commit

Permalink
Merge pull request #44 from localheinz/fix/embeddable
Browse files Browse the repository at this point in the history
Fix: Do not persist embeddables
  • Loading branch information
glaubinix authored Mar 7, 2020
2 parents 74e12fc + 4e1ac25 commit 0e6f1b6
Show file tree
Hide file tree
Showing 4 changed files with 152 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/Provider/Doctrine/FixtureFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
use Doctrine\ORM\EntityManager;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping;
use Exception;

/**
Expand Down Expand Up @@ -84,12 +85,17 @@ public function get($name, array $fieldOverrides = [])
throw EntityDefinitionUnavailable::for($name);
}

/** @var EntityDef $def */
$def = $this->entityDefs[$name];

$config = $def->getConfig();

$this->checkFieldOverrides($def, $fieldOverrides);

$ent = $def->getEntityMetadata()->newInstance();
/** @var Mapping\ClassMetadata $entityMetadata */
$entityMetadata = $def->getEntityMetadata();

$ent = $entityMetadata->newInstance();
$fieldValues = [];
foreach ($def->getFieldDefs() as $fieldName => $fieldDef) {
$fieldValues[$fieldName] = array_key_exists($fieldName, $fieldOverrides)
Expand All @@ -105,7 +111,7 @@ public function get($name, array $fieldOverrides = [])
$config['afterCreate']($ent, $fieldValues);
}

if ($this->persist) {
if ($this->persist && false === $entityMetadata->isEmbeddedClass) {
$this->em->persist($ent);
}

Expand Down
55 changes: 55 additions & 0 deletions tests/Provider/Doctrine/Fixtures/PersistingTest.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
<?php
namespace FactoryGirl\Tests\Provider\Doctrine\Fixtures;

use FactoryGirl\Provider\Doctrine\FieldDef;
use Doctrine\ORM\Mapping;

class PersistingTest extends TestCase
{
/**
Expand Down Expand Up @@ -35,4 +38,56 @@ public function doesNotPersistByDefault()
->getQuery();
$this->assertEmpty($q->getResult());
}

/**
* @test
*/
public function doesNotPersistEmbeddableWhenAutomaticPersistingIsTurnedOn()
{
$mappingClasses = [
Mapping\Embeddable::class,
Mapping\Embedded::class,
];

foreach ($mappingClasses as $mappingClass) {
if (!class_exists($mappingClass)) {
$this->markTestSkipped('Doctrine Embeddable feature not available');
}
}

$this->factory->defineEntity('Name', [
'first' => FieldDef::sequence(static function () {
$values = [
null,
'Doe',
'Smith',
];

return $values[array_rand($values)];
}),
'last' => FieldDef::sequence(static function () {
$values = [
null,
'Jane',
'John',
];

return $values[array_rand($values)];
}),
]);

$this->factory->defineEntity('Commander', [
'name' => FieldDef::reference('Name'),
]);

$this->factory->persistOnGet();

/** @var TestEntity\Commander $commander */
$commander = $this->factory->get('Commander');

$this->assertInstanceOf(TestEntity\Commander::class, $commander);
$this->assertInstanceOf(TestEntity\Name::class, $commander->name());

$this->em->flush();
}
}
46 changes: 46 additions & 0 deletions tests/Provider/Doctrine/Fixtures/TestEntity/Commander.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace FactoryGirl\Tests\Provider\Doctrine\Fixtures\TestEntity;

/**
* @Entity
*/
class Commander
{
/**
* @Id()
* @GeneratedValue(strategy="AUTO")
* @Column(
* name="id",
* type="integer"
* )
*
* @var string
*/
private $id;

/**
* @Embedded(
* class="FactoryGirl\Tests\Provider\Doctrine\Fixtures\TestEntity\Name",
* columnPrefix=false
* )
*
* @var Name
*/
private $name;

public function __construct()
{
$this->name = new Name();
}

public function id(): string
{
return $this->id;
}

public function name(): Name
{
return $this->name;
}
}
43 changes: 43 additions & 0 deletions tests/Provider/Doctrine/Fixtures/TestEntity/Name.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

namespace FactoryGirl\Tests\Provider\Doctrine\Fixtures\TestEntity;

/**
* @Embeddable
*/
final class Name
{
/**
* @Column(
* name="first_name",
* type="string",
* length=100,
* nullable=true
* )
*
* @var string|null
*/
private $first;

/**
* @Column(
* name="last_name",
* type="string",
* length=100,
* nullable=true
* )
*
* @var string|null
*/
private $last;

public function first(): ?string
{
return $this->first;
}

public function last(): ?string
{
return $this->last;
}
}

0 comments on commit 0e6f1b6

Please sign in to comment.