]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #1500 from wallabag/v2-quote-pgsql
authorNicolas Lœuillet <nicolas@loeuillet.org>
Mon, 9 Nov 2015 15:31:59 +0000 (16:31 +0100)
committerNicolas Lœuillet <nicolas@loeuillet.org>
Mon, 9 Nov 2015 15:31:59 +0000 (16:31 +0100)
Fix quote strategy for reserved keyword in Postgres

23 files changed:
.travis.yml
app/config/config.yml
composer.json
composer.lock
src/Wallabag/ApiBundle/Tests/Controller/WallabagRestControllerTest.php
src/Wallabag/ApiBundle/Tests/WallabagApiTestCase.php [moved from src/Wallabag/ApiBundle/Tests/AbstractControllerTest.php with 96% similarity]
src/Wallabag/CoreBundle/Command/InstallCommand.php
src/Wallabag/CoreBundle/Doctrine/Mapping/PrefixedNamingStrategy.php [deleted file]
src/Wallabag/CoreBundle/Entity/Config.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Entity/Tag.php
src/Wallabag/CoreBundle/Resources/config/services.yml
src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php [new file with mode: 0644]
src/Wallabag/CoreBundle/Tests/Command/InstallCommandTest.php
src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php
src/Wallabag/CoreBundle/Tests/EventListener/LocaleListenerTest.php
src/Wallabag/CoreBundle/Tests/EventListener/RegistrationConfirmedListenerTest.php
src/Wallabag/CoreBundle/Tests/EventListener/UserLocaleListenerTest.php
src/Wallabag/CoreBundle/Tests/Helper/ContentProxyTest.php
src/Wallabag/CoreBundle/Tests/ParamConverter/UsernameRssTokenConverterTest.php
src/Wallabag/CoreBundle/Tests/Subscriber/TablePrefixSubscriberTest.php [new file with mode: 0644]
src/Wallabag/CoreBundle/Tests/WallabagCoreTestCase.php
src/Wallabag/UserBundle/Entity/User.php

index df3a5c7255654f69eba1a1ead9d669fee3c5c575..9a19be6174dd195894dad5de4f120b0a4cfcb4a5 100644 (file)
@@ -51,7 +51,7 @@ before_script:
 
 script:
     - ant prepare-$DB
-    - SYMFONY_DEPRECATIONS_HELPER=weak bin/phpunit --exclude-group command-doctrine -v
+    - SYMFONY_DEPRECATIONS_HELPER=weak bin/phpunit -v
 
 # after_script:
     # - |
index 0655fed58a39c951fb61cf8dd7612957fee20174..285fbd7cf10f96a06d5b622923ebfe6b4c7bd499 100644 (file)
@@ -88,7 +88,6 @@ doctrine:
         auto_generate_proxy_classes: "%kernel.debug%"
         entity_managers:
             default:
-                naming_strategy: wallabag_core.doctrine.prefixed_naming_strategy
                 auto_mapping: true
 
 # Swiftmailer Configuration
index b8c936f0d0cc78285f1b7a62cbf63ea0dae29a86..a46e990ade11d595cd990b08b2fa7de50c96377a 100644 (file)
@@ -31,7 +31,7 @@
         "php": ">=5.3.3",
         "symfony/symfony": "~2.7.0",
         "doctrine/orm": "~2.3",
-        "doctrine/doctrine-bundle": "~1.2",
+        "doctrine/doctrine-bundle": "1.5.2",
         "twig/extensions": "~1.0",
         "symfony/assetic-bundle": "~2.3",
         "symfony/swiftmailer-bundle": "~2.3",
index ee6e483a0fd2cd3c681f396485679e4c2d18042c..ec11324f50520f751f844a9d17e1f4f984fbd07a 100644 (file)
@@ -4,8 +4,8 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "01e7829e7ff2b39b288871661bb05e9a",
-    "content-hash": "76830bc9c2cd6f600613c9eea7c0f1b1",
+    "hash": "6bd09434f83c7e6b5e1c75fddbd7608b",
+    "content-hash": "d07d54c4cc6f4f4947c652bd659af02e",
     "packages": [
         {
             "name": "doctrine/annotations",
         },
         {
             "name": "doctrine/doctrine-bundle",
-            "version": "1.6.0",
+            "version": "v1.5.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/DoctrineBundle.git",
-                "reference": "a5b3ba908ba68f3e14e42762a7b940fde65ed7da"
+                "reference": "d63be7eb9a95d46720f7d6badac4e5bc2bcff2e3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/a5b3ba908ba68f3e14e42762a7b940fde65ed7da",
-                "reference": "a5b3ba908ba68f3e14e42762a7b940fde65ed7da",
+                "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/d63be7eb9a95d46720f7d6badac4e5bc2bcff2e3",
+                "reference": "d63be7eb9a95d46720f7d6badac4e5bc2bcff2e3",
                 "shasum": ""
             },
             "require": {
                 "orm",
                 "persistence"
             ],
-            "time": "2015-11-04 21:33:02"
+            "time": "2015-08-31 14:47:06"
         },
         {
             "name": "doctrine/doctrine-cache-bundle",
         },
         {
             "name": "sensiolabs/security-checker",
-            "version": "v3.0.1",
+            "version": "v3.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sensiolabs/security-checker.git",
-                "reference": "7735fd97ff7303d9df776b8dbc970f949399abc9"
+                "reference": "21696b0daa731064c23cfb694c60a2584a7b6e93"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/7735fd97ff7303d9df776b8dbc970f949399abc9",
-                "reference": "7735fd97ff7303d9df776b8dbc970f949399abc9",
+                "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/21696b0daa731064c23cfb694c60a2584a7b6e93",
+                "reference": "21696b0daa731064c23cfb694c60a2584a7b6e93",
                 "shasum": ""
             },
             "require": {
-                "symfony/console": "~2.0"
+                "symfony/console": "~2.0|~3.0"
             },
             "bin": [
                 "security-checker"
                 }
             ],
             "description": "A security checker for your composer.lock",
-            "time": "2015-08-11 12:11:25"
+            "time": "2015-11-07 08:07:40"
         },
         {
             "name": "simplepie/simplepie",
index bc7ef4895a9fb8dbb81b76b0fe9619a474088138..bdd36e0c6b3fb20063480f87b17b24ea2ed6afd3 100644 (file)
@@ -2,9 +2,9 @@
 
 namespace Wallabag\ApiBundle\Tests\Controller;
 
-use Wallabag\ApiBundle\Tests\AbstractControllerTest;
+use Wallabag\ApiBundle\Tests\WallabagApiTestCase;
 
-class WallabagRestControllerTest extends AbstractControllerTest
+class WallabagRestControllerTest extends WallabagApiTestCase
 {
     protected static $salt;
 
similarity index 96%
rename from src/Wallabag/ApiBundle/Tests/AbstractControllerTest.php
rename to src/Wallabag/ApiBundle/Tests/WallabagApiTestCase.php
index 09cde0f602766995b7c48b02a0e85c121390fa40..8a57fea2639ade40dd5d7cc88a963824cb6a73d1 100644 (file)
@@ -5,7 +5,7 @@ namespace Wallabag\ApiBundle\Tests;
 use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
 use Symfony\Component\BrowserKit\Cookie;
 
-abstract class AbstractControllerTest extends WebTestCase
+abstract class WallabagApiTestCase extends WebTestCase
 {
     /**
      * @var Client
index 808baaf68ec7257270d620d1028cfa763ce59377..85c4ee902ee2ad308e6f6bfcc93671710bf3886a 100644 (file)
@@ -96,10 +96,10 @@ class InstallCommand extends ContainerAwareCommand
 
         if (!$fulfilled) {
             throw new \RuntimeException('Some system requirements are not fulfilled. Please check output messages and fix them.');
-        } else {
-            $this->defaultOutput->writeln('<info>Success! Your system can run Wallabag properly.</info>');
         }
 
+        $this->defaultOutput->writeln('<info>Success! Your system can run Wallabag properly.</info>');
+
         $this->defaultOutput->writeln('');
 
         return $this;
@@ -111,14 +111,17 @@ class InstallCommand extends ContainerAwareCommand
 
         // user want to reset everything? Don't care about what is already here
         if (true === $this->defaultInput->getOption('reset')) {
-            $this->defaultOutput->writeln('Droping database, creating database and schema');
+            $this->defaultOutput->writeln('Droping database, creating database and schema, clearing the cache');
 
             $this
                 ->runCommand('doctrine:database:drop', array('--force' => true))
                 ->runCommand('doctrine:database:create')
                 ->runCommand('doctrine:schema:create')
+                ->runCommand('cache:clear')
             ;
 
+            $this->defaultOutput->writeln('');
+
             return $this;
         }
 
@@ -131,6 +134,8 @@ class InstallCommand extends ContainerAwareCommand
                 ->runCommand('cache:clear')
             ;
 
+            $this->defaultOutput->writeln('');
+
             return $this;
         }
 
@@ -283,10 +288,16 @@ class InstallCommand extends ContainerAwareCommand
         try {
             $schemaManager = $connection->getSchemaManager();
         } catch (\Exception $exception) {
+            // mysql & sqlite
             if (false !== strpos($exception->getMessage(), sprintf("Unknown database '%s'", $databaseName))) {
                 return false;
             }
 
+            // pgsql
+            if (false !== strpos($exception->getMessage(), sprintf('database "%s" does not exist', $databaseName))) {
+                return false;
+            }
+
             throw $exception;
         }
 
diff --git a/src/Wallabag/CoreBundle/Doctrine/Mapping/PrefixedNamingStrategy.php b/src/Wallabag/CoreBundle/Doctrine/Mapping/PrefixedNamingStrategy.php
deleted file mode 100644 (file)
index 509348d..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-namespace Wallabag\CoreBundle\Doctrine\Mapping;
-
-use Doctrine\ORM\Mapping\NamingStrategy;
-
-/**
- * Puts a prefix to each table.
- *
- * Solution from :
- *      - http://stackoverflow.com/a/23860613/569101
- *      - http://doctrine-orm.readthedocs.org/en/latest/reference/namingstrategy.html
- */
-class PrefixedNamingStrategy implements NamingStrategy
-{
-    protected $prefix = '';
-
-    public function __construct($prefix)
-    {
-        $this->prefix = (string) $prefix;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function classToTableName($className)
-    {
-        return strtolower($this->prefix.substr($className, strrpos($className, '\\') + 1));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function propertyToColumnName($propertyName, $className = null)
-    {
-        return $propertyName;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function referenceColumnName()
-    {
-        return 'id';
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function joinColumnName($propertyName)
-    {
-        return $propertyName.'_'.$this->referenceColumnName();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function joinTableName($sourceEntity, $targetEntity, $propertyName = null)
-    {
-        // for join table we don't want to have both table concatenated AND prefixed
-        // we just want the whole table to prefixed once
-        // ie: not "wallabag_entry_wallabag_tag" but "wallabag_entry_tag"
-        $target = substr($targetEntity, strrpos($targetEntity, '\\') + 1);
-
-        return strtolower($this->classToTableName($sourceEntity).'_'.$target);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function joinKeyColumnName($entityName, $referencedColumnName = null)
-    {
-        return strtolower($this->classToTableName($entityName).'_'.($referencedColumnName ?: $this->referenceColumnName()));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function embeddedFieldToColumnName($propertyName, $embeddedColumnName, $className = null, $embeddedClassName = null)
-    {
-        return $propertyName.'_'.$embeddedColumnName;
-    }
-}
index f4edcfa9f7af04cbbe2cd3ceda4b4aa0bd798660..b2a1915a4fdbd22f921e5ecae5212da9ff922d46 100644 (file)
@@ -9,7 +9,7 @@ use Symfony\Component\Validator\Constraints as Assert;
  * Config.
  *
  * @ORM\Entity(repositoryClass="Wallabag\CoreBundle\Repository\ConfigRepository")
- * @ORM\Table
+ * @ORM\Table(name="`config`")
  * @ORM\Entity
  */
 class Config
index 4fd74001b3efc076388f183fe794fea6180fba04..9e5446a64835db4e3f8fb920636cd0405e697d62 100644 (file)
@@ -14,7 +14,7 @@ use Wallabag\UserBundle\Entity\User;
  *
  * @XmlRoot("entry")
  * @ORM\Entity(repositoryClass="Wallabag\CoreBundle\Repository\EntryRepository")
- * @ORM\Table
+ * @ORM\Table(name="`entry`")
  * @ORM\HasLifecycleCallbacks()
  * @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())")
  */
index 5b571823f707f11659f7da8c92707ff839d60917..7cc452fd7f97b860f4eabadeaf9523ec95e4e5bd 100644 (file)
@@ -12,7 +12,7 @@ use Doctrine\Common\Collections\ArrayCollection;
  * Tag.
  *
  * @XmlRoot("tag")
- * @ORM\Table
+ * @ORM\Table(name="`tag`")
  * @ORM\Entity(repositoryClass="Wallabag\CoreBundle\Repository\TagRepository")
  * @ExclusionPolicy("all")
  */
index debbf39e0eb4ab9672e5ccad38567afd18062018..65c2c8d85dffdab025ca5c46d0d136da5398a5f5 100644 (file)
@@ -33,10 +33,12 @@ services:
         arguments:
             - @doctrine
 
-    wallabag_core.doctrine.prefixed_naming_strategy:
-        class: Wallabag\CoreBundle\Doctrine\Mapping\PrefixedNamingStrategy
+    wallabag_core.table_prefix_subscriber:
+        class: Wallabag\CoreBundle\Subscriber\TablePrefixSubscriber
         arguments:
             - %database_table_prefix%
+        tags:
+            - { name: doctrine.event_subscriber }
 
     wallabag_core.graby:
         class: Graby\Graby
diff --git a/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php b/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php
new file mode 100644 (file)
index 0000000..0019eea
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+
+namespace Wallabag\CoreBundle\Subscriber;
+
+use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
+use Doctrine\Common\EventSubscriber;
+use Doctrine\ORM\Mapping\ClassMetadataInfo;
+
+/**
+ * Puts a prefix to each table.
+ * This way were used instead of using the built-in strategy from Doctrine, using `naming_strategy`
+ * Because it conflicts with the DefaultQuoteStrategy (that espace table name, like user for Postgres)
+ * see #1498 for more detail.
+ *
+ * Solution from :
+ *      - http://stackoverflow.com/a/23860613/569101
+ *      - http://doctrine-orm.readthedocs.org/en/latest/reference/namingstrategy.html
+ */
+class TablePrefixSubscriber implements EventSubscriber
+{
+    protected $prefix = '';
+
+    public function __construct($prefix)
+    {
+        $this->prefix = (string) $prefix;
+    }
+
+    public function getSubscribedEvents()
+    {
+        return array('loadClassMetadata');
+    }
+
+    public function loadClassMetadata(LoadClassMetadataEventArgs $args)
+    {
+        $classMetadata = $args->getClassMetadata();
+
+        // if we are in an inheritance hierarchy, only apply this once
+        if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) {
+            return;
+        }
+
+        $classMetadata->setTableName($this->prefix.$classMetadata->getTableName());
+
+        foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) {
+            if ($mapping['type'] === ClassMetadataInfo::MANY_TO_MANY && isset($classMetadata->associationMappings[$fieldName]['joinTable']['name'])) {
+                $mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name'];
+                $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix.$mappedTableName;
+            }
+        }
+    }
+}
index e98dd20260ae0c32c2295a8d8f94aea97b52af5a..c9346040678abb2a26992c01eab33b1687cbd383 100644 (file)
@@ -28,9 +28,7 @@ class InstallCommandTest extends WallabagCoreTestCase
 
     public function testRunInstallCommand()
     {
-        $this->container = static::$kernel->getContainer();
-
-        $application = new Application(static::$kernel);
+        $application = new Application($this->getClient()->getKernel());
         $application->add(new InstallCommandMock());
 
         $command = $application->find('wallabag:install');
@@ -59,9 +57,7 @@ class InstallCommandTest extends WallabagCoreTestCase
 
     public function testRunInstallCommandWithReset()
     {
-        $this->container = static::$kernel->getContainer();
-
-        $application = new Application(static::$kernel);
+        $application = new Application($this->getClient()->getKernel());
         $application->add(new InstallCommandMock());
 
         $command = $application->find('wallabag:install');
@@ -89,28 +85,39 @@ class InstallCommandTest extends WallabagCoreTestCase
         $this->assertContains('Step 4 of 4. Installing assets.', $tester->getDisplay());
 
         // we force to reset everything
-        $this->assertContains('Droping database, creating database and schema', $tester->getDisplay());
+        $this->assertContains('Droping database, creating database and schema, clearing the cache', $tester->getDisplay());
     }
 
-    /**
-     * @group command-doctrine
-     */
     public function testRunInstallCommandWithDatabaseRemoved()
     {
-        $this->container = static::$kernel->getContainer();
-
-        $application = new Application(static::$kernel);
-        $application->add(new InstallCommand());
+        if ($this->getClient()->getContainer()->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOPgSql\Driver) {
+            /*
+             * LOG:  statement: CREATE DATABASE "wallabag"
+             * ERROR:  source database "template1" is being accessed by other users
+             * DETAIL:  There is 1 other session using the database.
+             * STATEMENT:  CREATE DATABASE "wallabag"
+             * FATAL:  database "wallabag" does not exist
+             *
+             * http://stackoverflow.com/a/14374832/569101
+             */
+            $this->markTestSkipped('PostgreSQL spotted: can find a good way to drop current database, skipping.');
+        }
+
+        $application = new Application($this->getClient()->getKernel());
         $application->add(new DropDatabaseDoctrineCommand());
 
         // drop database first, so the install command won't ask to reset things
-        $command = new DropDatabaseDoctrineCommand();
-        $command->setApplication($application);
+        $command = $application->find('doctrine:database:drop');
         $command->run(new ArrayInput(array(
             'command' => 'doctrine:database:drop',
             '--force' => true,
         )), new NullOutput());
 
+        // start a new application to avoid lagging connexion to pgsql
+        $client = static::createClient();
+        $application = new Application($client->getKernel());
+        $application->add(new InstallCommand());
+
         $command = $application->find('wallabag:install');
 
         // We mock the QuestionHelper
@@ -140,9 +147,7 @@ class InstallCommandTest extends WallabagCoreTestCase
 
     public function testRunInstallCommandChooseResetSchema()
     {
-        $this->container = static::$kernel->getContainer();
-
-        $application = new Application(static::$kernel);
+        $application = new Application($this->getClient()->getKernel());
         $application->add(new InstallCommandMock());
 
         $command = $application->find('wallabag:install');
@@ -176,14 +181,16 @@ class InstallCommandTest extends WallabagCoreTestCase
         $this->assertContains('Droping schema and creating schema', $tester->getDisplay());
     }
 
-    /**
-     * @group command-doctrine
-     */
     public function testRunInstallCommandChooseNothing()
     {
-        $this->container = static::$kernel->getContainer();
-
-        $application = new Application(static::$kernel);
+        if ($this->getClient()->getContainer()->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOPgSql\Driver) {
+            /*
+             * @see testRunInstallCommandWithDatabaseRemoved
+             */
+            $this->markTestSkipped('PostgreSQL spotted: can find a good way to drop current database, skipping.');
+        }
+
+        $application = new Application($this->getClient()->getKernel());
         $application->add(new InstallCommand());
         $application->add(new DropDatabaseDoctrineCommand());
         $application->add(new CreateDatabaseDoctrineCommand());
@@ -196,7 +203,7 @@ class InstallCommandTest extends WallabagCoreTestCase
             '--force' => true,
         )), new NullOutput());
 
-        $this->container->get('doctrine')->getManager()->getConnection()->close();
+        $this->getClient()->getContainer()->get('doctrine')->getConnection()->close();
 
         $command = new CreateDatabaseDoctrineCommand();
         $command->setApplication($application);
@@ -237,9 +244,7 @@ class InstallCommandTest extends WallabagCoreTestCase
 
     public function testRunInstallCommandNoInteraction()
     {
-        $this->container = static::$kernel->getContainer();
-
-        $application = new Application(static::$kernel);
+        $application = new Application($this->getClient()->getKernel());
         $application->add(new InstallCommandMock());
 
         $command = $application->find('wallabag:install');
index 5ac39d1212276a210ba3b6471d6ee815aa41ff26..56b4c9e41af815259f43ca815f7efa9486138536 100644 (file)
@@ -74,6 +74,9 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->assertEquals('This value should not be blank.', $alert[0]);
     }
 
+    /**
+     * This test will require an internet connection.
+     */
     public function testPostNewOk()
     {
         $this->logInAs('admin');
@@ -119,6 +122,9 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->assertEquals(200, $client->getResponse()->getStatusCode());
     }
 
+    /**
+     * @depends testPostNewOk
+     */
     public function testView()
     {
         $this->logInAs('admin');
index 356a411e6fd3eb9af8da64b7cce3accb76bf0447..d89bee0471129acb874f20cbc2e710471dfe3632 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace Wallabag\CoreBundle\Tests\EventListener;
 
-use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
 use Symfony\Component\EventDispatcher\EventDispatcher;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\KernelEvents;
@@ -12,7 +11,7 @@ use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
 use Symfony\Component\HttpFoundation\Session\Session;
 use Wallabag\CoreBundle\EventListener\LocaleListener;
 
-class LocaleListenerTest extends KernelTestCase
+class LocaleListenerTest extends \PHPUnit_Framework_TestCase
 {
     private function getEvent(Request $request)
     {
index df94fad25066d36b78ebe00d9ba3254259be773e..31283399d33715a2fb80f922750d11aa77ccb14f 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace Wallabag\CoreBundle\Tests\EventListener;
 
-use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
 use Symfony\Component\EventDispatcher\EventDispatcher;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
@@ -12,7 +11,7 @@ use Wallabag\CoreBundle\EventListener\RegistrationConfirmedListener;
 use Wallabag\CoreBundle\Entity\Config;
 use Wallabag\UserBundle\Entity\User;
 
-class RegistrationConfirmedListenerTest extends KernelTestCase
+class RegistrationConfirmedListenerTest extends \PHPUnit_Framework_TestCase
 {
     private $em;
     private $listener;
index e8a65fbf17251500a550b6e20682c95737b68442..80ddb4572db64aa9ed7a427c52c0bd36273516c3 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace Wallabag\CoreBundle\Tests\EventListener;
 
-use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
 use Symfony\Component\HttpFoundation\Session\Session;
@@ -12,7 +11,7 @@ use Wallabag\CoreBundle\EventListener\UserLocaleListener;
 use Wallabag\CoreBundle\Entity\Config;
 use Wallabag\UserBundle\Entity\User;
 
-class UserLocaleListenerTest extends KernelTestCase
+class UserLocaleListenerTest extends \PHPUnit_Framework_TestCase
 {
     public function testWithLanguage()
     {
index 1d0d40628deef126cba9553e1bd069d3a2e88c6b..4bce4708f2ae1e42adeb50119dc63057eb4e8de4 100644 (file)
@@ -2,12 +2,11 @@
 
 namespace Wallabag\CoreBundle\Tests\Helper;
 
-use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
 use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\UserBundle\Entity\User;
 use Wallabag\CoreBundle\Helper\ContentProxy;
 
-class ContentProxyTest extends KernelTestCase
+class ContentProxyTest extends \PHPUnit_Framework_TestCase
 {
     public function testWithEmptyContent()
     {
index e28dc4bae527a7c724d2f1b89715ecd367bc9504..1c9a4ad7c4603f5942d7cdad995fcef257a4e670 100644 (file)
@@ -2,13 +2,12 @@
 
 namespace Wallabag\CoreBundle\Tests\Command;
 
-use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
 use Wallabag\CoreBundle\ParamConverter\UsernameRssTokenConverter;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
 use Symfony\Component\HttpFoundation\Request;
 use Wallabag\UserBundle\Entity\User;
 
-class UsernameRssTokenConverterTest extends KernelTestCase
+class UsernameRssTokenConverterTest extends \PHPUnit_Framework_TestCase
 {
     public function testSupportsWithNoRegistry()
     {
diff --git a/src/Wallabag/CoreBundle/Tests/Subscriber/TablePrefixSubscriberTest.php b/src/Wallabag/CoreBundle/Tests/Subscriber/TablePrefixSubscriberTest.php
new file mode 100644 (file)
index 0000000..a26ff43
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+namespace Wallabag\CoreBundle\Tests\Subscriber;
+
+use Doctrine\ORM\Mapping\ClassMetadata;
+use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
+use Doctrine\Common\EventManager;
+use Wallabag\CoreBundle\Subscriber\TablePrefixSubscriber;
+
+class TablePrefixSubscriberTest extends \PHPUnit_Framework_TestCase
+{
+    public function dataForPrefix()
+    {
+        return array(
+            array('wallabag_', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'wallabag_user', '"wallabag_user"', new \Doctrine\DBAL\Platforms\PostgreSqlPlatform()),
+            array('wallabag_', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'wallabag_user', '`wallabag_user`', new \Doctrine\DBAL\Platforms\MySqlPlatform()),
+            array('wallabag_', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'wallabag_user', '"wallabag_user"', new \Doctrine\DBAL\Platforms\SqlitePlatform()),
+
+            array('wallabag_', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'wallabag_user', 'wallabag_user', new \Doctrine\DBAL\Platforms\PostgreSqlPlatform()),
+            array('wallabag_', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'wallabag_user', 'wallabag_user', new \Doctrine\DBAL\Platforms\MySqlPlatform()),
+            array('wallabag_', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'wallabag_user', 'wallabag_user', new \Doctrine\DBAL\Platforms\SqlitePlatform()),
+
+            array('', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'user', '"user"', new \Doctrine\DBAL\Platforms\PostgreSqlPlatform()),
+            array('', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'user', '`user`', new \Doctrine\DBAL\Platforms\MySqlPlatform()),
+            array('', 'Wallabag\UserBundle\Entity\User', '`user`', 'user', 'user', '"user"', new \Doctrine\DBAL\Platforms\SqlitePlatform()),
+
+            array('', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'user', 'user', new \Doctrine\DBAL\Platforms\PostgreSqlPlatform()),
+            array('', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'user', 'user', new \Doctrine\DBAL\Platforms\MySqlPlatform()),
+            array('', 'Wallabag\UserBundle\Entity\User', 'user', 'user', 'user', 'user', new \Doctrine\DBAL\Platforms\SqlitePlatform()),
+        );
+    }
+
+    /**
+     * @dataProvider dataForPrefix
+     */
+    public function testPrefix($prefix, $entityName, $tableName, $tableNameExpected, $finalTableName, $finalTableNameQuoted, $platform)
+    {
+        $em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $subscriber = new TablePrefixSubscriber($prefix);
+
+        $metaClass = new ClassMetadata($entityName);
+        $metaClass->setPrimaryTable(array('name' => $tableName));
+
+        $metaDataEvent = new LoadClassMetadataEventArgs($metaClass, $em);
+
+        $this->assertEquals($tableNameExpected, $metaDataEvent->getClassMetadata()->getTableName());
+
+        $subscriber->loadClassMetadata($metaDataEvent);
+
+        $this->assertEquals($finalTableName, $metaDataEvent->getClassMetadata()->getTableName());
+        $this->assertEquals($finalTableNameQuoted, $metaDataEvent->getClassMetadata()->getQuotedTableName($platform));
+    }
+
+    /**
+     * @dataProvider dataForPrefix
+     */
+    public function testSubscribedEvents($prefix, $entityName, $tableName, $tableNameExpected, $finalTableName, $finalTableNameQuoted, $platform)
+    {
+        $em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $metaClass = new ClassMetadata($entityName);
+        $metaClass->setPrimaryTable(array('name' => $tableName));
+
+        $metaDataEvent = new LoadClassMetadataEventArgs($metaClass, $em);
+
+        $subscriber = new TablePrefixSubscriber($prefix);
+
+        $evm = new EventManager();
+        $evm->addEventSubscriber($subscriber);
+
+        $evm->dispatchEvent('loadClassMetadata', $metaDataEvent);
+
+        $this->assertEquals($finalTableName, $metaDataEvent->getClassMetadata()->getTableName());
+        $this->assertEquals($finalTableNameQuoted, $metaDataEvent->getClassMetadata()->getQuotedTableName($platform));
+    }
+
+    public function testPrefixManyToMany()
+    {
+        $em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $subscriber = new TablePrefixSubscriber('yo_');
+
+        $metaClass = new ClassMetadata('Wallabag\UserBundle\Entity\Entry');
+        $metaClass->setPrimaryTable(array('name' => 'entry'));
+        $metaClass->mapManyToMany(array(
+            'fieldName' => 'tags',
+            'joinTable' => array('name' => null, 'schema' => null),
+            'targetEntity' => 'Tag',
+            'mappedBy' => null,
+            'inversedBy' => 'entries',
+            'cascade' => array('persist'),
+            'indexBy' => null,
+            'orphanRemoval' => false,
+            'fetch' => 2,
+        ));
+
+        $metaDataEvent = new LoadClassMetadataEventArgs($metaClass, $em);
+
+        $this->assertEquals('entry', $metaDataEvent->getClassMetadata()->getTableName());
+
+        $subscriber->loadClassMetadata($metaDataEvent);
+
+        $this->assertEquals('yo_entry', $metaDataEvent->getClassMetadata()->getTableName());
+        $this->assertEquals('yo_entry_tag', $metaDataEvent->getClassMetadata()->associationMappings['tags']['joinTable']['name']);
+        $this->assertEquals('yo_entry', $metaDataEvent->getClassMetadata()->getQuotedTableName(new \Doctrine\DBAL\Platforms\MySqlPlatform()));
+    }
+}
index e5096528cefe39d683a07a6fb67286913dc20a97..ce3cabe8d36af3f82d8c782a7d7855c1eb0245c1 100644 (file)
@@ -15,6 +15,8 @@ abstract class WallabagCoreTestCase extends WebTestCase
 
     public function setUp()
     {
+        parent::setUp();
+
         $this->client = static::createClient();
     }
 
index d2efd20080b4bee41b3d7b6badbbe94a7770c675..e3b9a519c7e42617ec816f98edefdf53a01cb2ad 100644 (file)
@@ -19,7 +19,7 @@ use Wallabag\CoreBundle\Entity\Tag;
  * User.
  *
  * @ORM\Entity(repositoryClass="Wallabag\UserBundle\Repository\UserRepository")
- * @ORM\Table
+ * @ORM\Table(name="`user`")
  * @ORM\HasLifecycleCallbacks()
  * @ExclusionPolicy("all")
  *