diff options
Diffstat (limited to 'src/Wallabag')
-rw-r--r-- | src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php | 8 | ||||
-rw-r--r-- | src/Wallabag/CoreBundle/Tests/Subscriber/TablePrefixSubscriberTest.php | 115 |
2 files changed, 121 insertions, 2 deletions
diff --git a/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php b/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php index 8ec85e64..0019eead 100644 --- a/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php +++ b/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php | |||
@@ -8,6 +8,9 @@ use Doctrine\ORM\Mapping\ClassMetadataInfo; | |||
8 | 8 | ||
9 | /** | 9 | /** |
10 | * Puts a prefix to each table. | 10 | * Puts a prefix to each table. |
11 | * This way were used instead of using the built-in strategy from Doctrine, using `naming_strategy` | ||
12 | * Because it conflicts with the DefaultQuoteStrategy (that espace table name, like user for Postgres) | ||
13 | * see #1498 for more detail. | ||
11 | * | 14 | * |
12 | * Solution from : | 15 | * Solution from : |
13 | * - http://stackoverflow.com/a/23860613/569101 | 16 | * - http://stackoverflow.com/a/23860613/569101 |
@@ -30,17 +33,18 @@ class TablePrefixSubscriber implements EventSubscriber | |||
30 | public function loadClassMetadata(LoadClassMetadataEventArgs $args) | 33 | public function loadClassMetadata(LoadClassMetadataEventArgs $args) |
31 | { | 34 | { |
32 | $classMetadata = $args->getClassMetadata(); | 35 | $classMetadata = $args->getClassMetadata(); |
36 | |||
33 | // if we are in an inheritance hierarchy, only apply this once | 37 | // if we are in an inheritance hierarchy, only apply this once |
34 | if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) { | 38 | if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) { |
35 | return; | 39 | return; |
36 | } | 40 | } |
37 | 41 | ||
38 | $classMetadata->setTableName($this->prefix . $classMetadata->getTableName()); | 42 | $classMetadata->setTableName($this->prefix.$classMetadata->getTableName()); |
39 | 43 | ||
40 | foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { | 44 | foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { |
41 | if ($mapping['type'] === ClassMetadataInfo::MANY_TO_MANY && isset($classMetadata->associationMappings[$fieldName]['joinTable']['name'])) { | 45 | if ($mapping['type'] === ClassMetadataInfo::MANY_TO_MANY && isset($classMetadata->associationMappings[$fieldName]['joinTable']['name'])) { |
42 | $mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name']; | 46 | $mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name']; |
43 | $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName; | 47 | $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix.$mappedTableName; |
44 | } | 48 | } |
45 | } | 49 | } |
46 | } | 50 | } |
diff --git a/src/Wallabag/CoreBundle/Tests/Subscriber/TablePrefixSubscriberTest.php b/src/Wallabag/CoreBundle/Tests/Subscriber/TablePrefixSubscriberTest.php new file mode 100644 index 00000000..4c138610 --- /dev/null +++ b/src/Wallabag/CoreBundle/Tests/Subscriber/TablePrefixSubscriberTest.php | |||
@@ -0,0 +1,115 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Tests\Subscriber; | ||
4 | |||
5 | use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; | ||
6 | use Doctrine\ORM\Mapping\ClassMetadata; | ||
7 | use Doctrine\ORM\Event\LoadClassMetadataEventArgs; | ||
8 | use Doctrine\Common\EventManager; | ||
9 | use Wallabag\CoreBundle\Subscriber\TablePrefixSubscriber; | ||
10 | |||
11 | class TablePrefixSubscriberTest extends KernelTestCase | ||
12 | { | ||
13 | public function dataForPrefix() | ||
14 | { | ||
15 | return array( | ||
16 | array('wallabag_', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'wallabag_user', '"wallabag_user"', new \Doctrine\DBAL\Platforms\PostgreSqlPlatform()), | ||
17 | array('wallabag_', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'wallabag_user', '`wallabag_user`', new \Doctrine\DBAL\Platforms\MySqlPlatform()), | ||
18 | array('wallabag_', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'wallabag_user', '"wallabag_user"', new \Doctrine\DBAL\Platforms\SqlitePlatform()), | ||
19 | |||
20 | array('wallabag_', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'wallabag_user', 'wallabag_user', new \Doctrine\DBAL\Platforms\PostgreSqlPlatform()), | ||
21 | array('wallabag_', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'wallabag_user', 'wallabag_user', new \Doctrine\DBAL\Platforms\MySqlPlatform()), | ||
22 | array('wallabag_', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'wallabag_user', 'wallabag_user', new \Doctrine\DBAL\Platforms\SqlitePlatform()), | ||
23 | |||
24 | array('', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'user', '"user"', new \Doctrine\DBAL\Platforms\PostgreSqlPlatform()), | ||
25 | array('', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'user', '`user`', new \Doctrine\DBAL\Platforms\MySqlPlatform()), | ||
26 | array('', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'user', '"user"', new \Doctrine\DBAL\Platforms\SqlitePlatform()), | ||
27 | |||
28 | array('', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'user', 'user', new \Doctrine\DBAL\Platforms\PostgreSqlPlatform()), | ||
29 | array('', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'user', 'user', new \Doctrine\DBAL\Platforms\MySqlPlatform()), | ||
30 | array('', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'user', 'user', new \Doctrine\DBAL\Platforms\SqlitePlatform()), | ||
31 | ); | ||
32 | } | ||
33 | |||
34 | /** | ||
35 | * @dataProvider dataForPrefix | ||
36 | */ | ||
37 | public function testPrefix($prefix, $entityName, $tableName, $tableNameExpected, $finalTableName, $finalTableNameQuoted, $platform) | ||
38 | { | ||
39 | $em = $this->getMockBuilder('Doctrine\ORM\EntityManager') | ||
40 | ->disableOriginalConstructor() | ||
41 | ->getMock(); | ||
42 | |||
43 | $subscriber = new TablePrefixSubscriber($prefix); | ||
44 | |||
45 | $metaClass = new ClassMetadata($entityName); | ||
46 | $metaClass->setPrimaryTable(array('name' => $tableName)); | ||
47 | |||
48 | $metaDataEvent = new LoadClassMetadataEventArgs($metaClass, $em); | ||
49 | |||
50 | $this->assertEquals($tableNameExpected, $metaDataEvent->getClassMetadata()->getTableName()); | ||
51 | |||
52 | $subscriber->loadClassMetadata($metaDataEvent); | ||
53 | |||
54 | $this->assertEquals($finalTableName, $metaDataEvent->getClassMetadata()->getTableName()); | ||
55 | $this->assertEquals($finalTableNameQuoted, $metaDataEvent->getClassMetadata()->getQuotedTableName($platform)); | ||
56 | } | ||
57 | |||
58 | /** | ||
59 | * @dataProvider dataForPrefix | ||
60 | */ | ||
61 | public function testSubscribedEvents($prefix, $entityName, $tableName, $tableNameExpected, $finalTableName, $finalTableNameQuoted, $platform) | ||
62 | { | ||
63 | $em = $this->getMockBuilder('Doctrine\ORM\EntityManager') | ||
64 | ->disableOriginalConstructor() | ||
65 | ->getMock(); | ||
66 | |||
67 | $metaClass = new ClassMetadata($entityName); | ||
68 | $metaClass->setPrimaryTable(array('name' => $tableName)); | ||
69 | |||
70 | $metaDataEvent = new LoadClassMetadataEventArgs($metaClass, $em); | ||
71 | |||
72 | $subscriber = new TablePrefixSubscriber($prefix); | ||
73 | |||
74 | $evm = new EventManager(); | ||
75 | $evm->addEventSubscriber($subscriber); | ||
76 | |||
77 | $evm->dispatchEvent('loadClassMetadata', $metaDataEvent); | ||
78 | |||
79 | $this->assertEquals($finalTableName, $metaDataEvent->getClassMetadata()->getTableName()); | ||
80 | $this->assertEquals($finalTableNameQuoted, $metaDataEvent->getClassMetadata()->getQuotedTableName($platform)); | ||
81 | } | ||
82 | |||
83 | public function testPrefixManyToMany() | ||
84 | { | ||
85 | $em = $this->getMockBuilder('Doctrine\ORM\EntityManager') | ||
86 | ->disableOriginalConstructor() | ||
87 | ->getMock(); | ||
88 | |||
89 | $subscriber = new TablePrefixSubscriber('yo_'); | ||
90 | |||
91 | $metaClass = new ClassMetadata('Wallabag\UserBundle\Entity\Entry'); | ||
92 | $metaClass->setPrimaryTable(array('name' => 'entry')); | ||
93 | $metaClass->mapManyToMany(array( | ||
94 | 'fieldName' => 'tags', | ||
95 | 'joinTable' => array('name' => null, 'schema' => null), | ||
96 | 'targetEntity' => 'Tag', | ||
97 | 'mappedBy' => null, | ||
98 | 'inversedBy' => 'entries', | ||
99 | 'cascade' => array('persist'), | ||
100 | 'indexBy' => null, | ||
101 | 'orphanRemoval' => false, | ||
102 | 'fetch' => 2, | ||
103 | )); | ||
104 | |||
105 | $metaDataEvent = new LoadClassMetadataEventArgs($metaClass, $em); | ||
106 | |||
107 | $this->assertEquals('entry', $metaDataEvent->getClassMetadata()->getTableName()); | ||
108 | |||
109 | $subscriber->loadClassMetadata($metaDataEvent); | ||
110 | |||
111 | $this->assertEquals('yo_entry', $metaDataEvent->getClassMetadata()->getTableName()); | ||
112 | $this->assertEquals('yo_entry_tag', $metaDataEvent->getClassMetadata()->associationMappings['tags']['joinTable']['name']); | ||
113 | $this->assertEquals('yo_entry', $metaDataEvent->getClassMetadata()->getQuotedTableName(new \Doctrine\DBAL\Platforms\MySqlPlatform())); | ||
114 | } | ||
115 | } | ||