Skip to content

Commit 057abdb

Browse files
committed
bug #1638 [Autocomplete] Fix tests for ORM 3.0 (smnandre)
This PR was squashed before being merged into the 2.x branch. Discussion ---------- [Autocomplete] Fix tests for ORM 3.0 * leverage Metadata::toArray to keep the "type" data * lighten some over-specific tests * document some changes * fix deprecation Make the CI green again Commits ------- 9a79d2e [Autocomplete] Fix tests for ORM 3.0
2 parents 2027a8d + 9a79d2e commit 057abdb

File tree

3 files changed

+68
-31
lines changed

3 files changed

+68
-31
lines changed

src/Autocomplete/src/Doctrine/EntityMetadata.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\UX\Autocomplete\Doctrine;
1313

14+
use Doctrine\ORM\Mapping\AssociationMapping;
1415
use Doctrine\Persistence\Mapping\ClassMetadata;
1516

1617
/**
@@ -75,8 +76,14 @@ public function getFieldMetadata(string $propertyName): array
7576
public function getAssociationMetadata(string $propertyName): array
7677
{
7778
if (\array_key_exists($propertyName, $this->metadata->associationMappings)) {
78-
// Cast to array, because in doctrine/orm:^3.0; $metadata will be an AssociationMapping object
79-
return (array) $this->metadata->associationMappings[$propertyName];
79+
$associationMapping = $this->metadata->associationMappings[$propertyName];
80+
81+
// Doctrine ORM 3.0
82+
if (class_exists(AssociationMapping::class) && $associationMapping instanceof AssociationMapping) {
83+
return $associationMapping->toArray();
84+
}
85+
86+
return $associationMapping;
8087
}
8188

8289
throw new \InvalidArgumentException(sprintf('The "%s" field does not exist in the "%s" entity.', $propertyName, $this->metadata->getName()));

src/Autocomplete/tests/Fixtures/Kernel.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\UX\Autocomplete\Tests\Fixtures;
1313

1414
use Doctrine\Bundle\DoctrineBundle\DoctrineBundle;
15+
use Doctrine\ORM\Mapping\AssociationMapping;
1516
use Psr\Log\NullLogger;
1617
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
1718
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
@@ -100,7 +101,7 @@ protected function configureContainer(ContainerConfigurator $c): void
100101
'auto_refresh_proxies' => false,
101102
]);
102103

103-
$c->extension('doctrine', [
104+
$config = [
104105
'dbal' => ['url' => '%env(resolve:DATABASE_URL)%'],
105106
'orm' => [
106107
'auto_generate_proxy_classes' => true,
@@ -115,7 +116,14 @@ protected function configureContainer(ContainerConfigurator $c): void
115116
],
116117
],
117118
],
118-
]);
119+
];
120+
if (class_exists(AssociationMapping::class)) {
121+
// Doctrine ORM >= 3.0
122+
$config['orm']['controller_resolver'] = [
123+
'auto_mapping' => true,
124+
];
125+
}
126+
$c->extension('doctrine', $config);
119127

120128
$c->extension('security', [
121129
'password_hashers' => [

src/Autocomplete/tests/Integration/Doctrine/EntityMetadataTest.php

Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
namespace Symfony\UX\Autocomplete\Tests\Integration\Doctrine;
1313

1414
use Doctrine\DBAL\Types\Types;
15-
use Doctrine\ORM\Mapping\ClassMetadataInfo;
1615
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
1716
use Symfony\UX\Autocomplete\Doctrine\EntityMetadata;
1817
use Symfony\UX\Autocomplete\Doctrine\EntityMetadataFactory;
@@ -51,13 +50,16 @@ public function testGetPropertyDataType(): void
5150
{
5251
$metadata = $this->getMetadata();
5352
$this->assertSame(Types::STRING, $metadata->getPropertyDataType('name'));
54-
$this->assertEquals(ClassMetadataInfo::MANY_TO_ONE, $metadata->getPropertyDataType('category'));
53+
// ORM 2.* ClassMetadataInfo::MANY_TO_ONE
54+
// ORM 3.* ClassMetadata::MANY_TO_ONE
55+
$this->assertEquals(2, $metadata->getPropertyDataType('category'));
5556
}
5657

5758
public function testGetFieldMetadata(): void
5859
{
5960
$metadata = $this->getMetadata();
60-
$this->assertSame([
61+
$nameMetadata = $metadata->getFieldMetadata('name');
62+
$expected = [
6163
'fieldName' => 'name',
6264
'type' => 'string',
6365
'scale' => null,
@@ -66,48 +68,68 @@ public function testGetFieldMetadata(): void
6668
'nullable' => false,
6769
'precision' => null,
6870
'columnName' => 'name',
69-
], $metadata->getFieldMetadata('name'));
71+
];
72+
foreach ($expected as $key => $value) {
73+
$this->assertArrayHasKey($key, $nameMetadata);
74+
$this->assertSame($value, $nameMetadata[$key]);
75+
}
7076
}
7177

7278
public function testGetAssociationMetadata(): void
7379
{
7480
$metadata = $this->getMetadata();
75-
$this->assertSame([
81+
$expected = [
7682
'fieldName' => 'category',
77-
'joinColumns' => [
78-
[
79-
'name' => 'category_id',
80-
'unique' => false,
81-
'nullable' => false,
82-
'onDelete' => null,
83-
'columnDefinition' => null,
84-
'referencedColumnName' => 'id',
85-
],
86-
],
87-
'cascade' => [],
8883
'inversedBy' => 'products',
8984
'targetEntity' => 'Symfony\UX\Autocomplete\Tests\Fixtures\Entity\Category',
9085
'fetch' => 2,
91-
'type' => 2,
92-
'mappedBy' => null,
9386
'isOwningSide' => true,
9487
'sourceEntity' => 'Symfony\UX\Autocomplete\Tests\Fixtures\Entity\Product',
95-
'isCascadeRemove' => false,
96-
'isCascadePersist' => false,
97-
'isCascadeRefresh' => false,
98-
'isCascadeMerge' => false,
99-
'isCascadeDetach' => false,
10088
'sourceToTargetKeyColumns' => [
10189
'category_id' => 'id',
10290
],
103-
'joinColumnFieldNames' => [
104-
'category_id' => 'category_id',
105-
],
10691
'targetToSourceKeyColumns' => [
10792
'id' => 'category_id',
10893
],
10994
'orphanRemoval' => false,
110-
], $metadata->getAssociationMetadata('category'));
95+
];
96+
97+
$metadata = $metadata->getAssociationMetadata('category');
98+
99+
foreach ($expected as $key => $val) {
100+
$this->assertArrayHasKey($key, $metadata);
101+
if (!\is_array($val)) {
102+
$this->assertEquals($val, $metadata[$key]);
103+
continue;
104+
}
105+
foreach ($val as $k => $v) {
106+
$this->assertArrayHasKey($k, $metadata[$key]);
107+
$this->assertEquals($v, $metadata[$key][$k]);
108+
}
109+
}
110+
111+
$this->assertArrayHasKey('joinColumns', $metadata);
112+
$this->assertCount(1, $metadata['joinColumns']);
113+
$expectedJoinColumn = [
114+
'name' => 'category_id',
115+
'columnDefinition' => null,
116+
// Doctrine 3.0 removed
117+
// 'fieldName' => 'category_id',
118+
'unique' => false,
119+
'nullable' => true,
120+
'referencedColumnName' => 'id',
121+
];
122+
$this->assertArrayHasKey(0, $metadata['joinColumns']);
123+
$columnMetadata = $metadata['joinColumns'][0];
124+
foreach ($expectedJoinColumn as $key => $val) {
125+
$this->assertArrayHasKey($key, $columnMetadata);
126+
// Doctrine 3.0 changed the way it determines 'nullable' for join columns
127+
if ('nullable' === $key) {
128+
$this->assertIsBool($columnMetadata[$key]);
129+
continue;
130+
}
131+
$this->assertSame($val, $columnMetadata[$key]);
132+
}
111133
}
112134

113135
public function testIsEmbeddedClassProperty(): void

0 commit comments

Comments
 (0)