]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - tests/Wallabag/CoreBundle/WallabagCoreTestCase.php
Isolated tests
[github/wallabag/wallabag.git] / tests / Wallabag / CoreBundle / WallabagCoreTestCase.php
index 7bf4b43ce8f32ee462aaec0187e44df448dcea76..eec6939d77756c33f72f67d90f9db7f55af23ef3 100644 (file)
@@ -2,11 +2,20 @@
 
 namespace Tests\Wallabag\CoreBundle;
 
+use Symfony\Bundle\FrameworkBundle\Client;
+use Symfony\Bundle\FrameworkBundle\Console\Application;
 use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
 use Symfony\Component\BrowserKit\Cookie;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Output\NullOutput;
+use Wallabag\CoreBundle\Entity\Config;
+use Wallabag\UserBundle\Entity\User;
 
 abstract class WallabagCoreTestCase extends WebTestCase
 {
+    /**
+     * @var Client|null
+     */
     private $client = null;
 
     public function getClient()
@@ -21,6 +30,44 @@ abstract class WallabagCoreTestCase extends WebTestCase
         $this->client = static::createClient();
     }
 
+    public function resetDatabase(Client $client)
+    {
+        $application = new Application($client->getKernel());
+        $application->setAutoExit(false);
+
+        $application->run(new ArrayInput([
+            'command' => 'doctrine:schema:drop',
+            '--no-interaction' => true,
+            '--force' => true,
+            '--env' => 'test',
+        ]), new NullOutput());
+
+        $application->run(new ArrayInput([
+            'command' => 'doctrine:schema:create',
+            '--no-interaction' => true,
+            '--env' => 'test',
+        ]), new NullOutput());
+
+        $application->run(new ArrayInput([
+            'command' => 'doctrine:fixtures:load',
+            '--no-interaction' => true,
+            '--env' => 'test',
+        ]), new NullOutput());
+
+        /*
+         * Recreate client to avoid error:
+         *
+         * [Doctrine\DBAL\ConnectionException]
+         * Transaction commit failed because the transaction has been marked for rollback only.
+         */
+        $this->client = static::createClient();
+    }
+
+    public function getEntityManager()
+    {
+        return $this->client->getContainer()->get('doctrine.orm.entity_manager');
+    }
+
     /**
      * Login a user without making a HTTP request.
      * If we make a HTTP request we lose ability to mock service in the container.
@@ -37,7 +84,7 @@ abstract class WallabagCoreTestCase extends WebTestCase
         $firewallName = $container->getParameter('fos_user.firewall_name');
 
         $user = $userManager->findUserBy(array('username' => $username));
-        $loginManager->loginUser($firewallName, $user);
+        $loginManager->logInUser($firewallName, $user);
 
         $session->set('_security_'.$firewallName, serialize($container->get('security.token_storage')->getToken()));
         $session->save();
@@ -65,22 +112,41 @@ abstract class WallabagCoreTestCase extends WebTestCase
     }
 
     /**
-     * Return the user id of the logged in user.
+     * Return the user of the logged in user.
      * You should be sure that you called `logInAs` before.
      *
-     * @return int
+     * @return User
      */
-    public function getLoggedInUserId()
+    public function getLoggedInUser()
     {
         $token = static::$kernel->getContainer()->get('security.token_storage')->getToken();
 
         if (null !== $token) {
-            return $token->getUser()->getId();
+            return $token->getUser();
         }
 
         throw new \RuntimeException('No logged in User.');
     }
 
+    /**
+     * Return the user id of the logged in user.
+     * You should be sure that you called `logInAs` before.
+     *
+     * @return int
+     */
+    public function getLoggedInUserId()
+    {
+        return $this->getLoggedInUser()->getId();
+    }
+
+    public function useTheme($theme)
+    {
+        $config = $this->getEntityManager()->getRepository(Config::class)->findOneByUser($this->getLoggedInUser());
+        $config->setTheme($theme);
+        $this->getEntityManager()->persist($config);
+        $this->getEntityManager()->flush();
+    }
+
     /**
      * Check if Redis is installed.
      * If not, mark test as skip.