]> 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 c69e83301203ec577c9eb23577afaa8e09a8adbc..eec6939d77756c33f72f67d90f9db7f55af23ef3 100644 (file)
@@ -2,10 +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()
@@ -20,7 +30,76 @@ 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.
+     *
+     * @param string $username User to log in
+     */
     public function logInAs($username)
+    {
+        $container = $this->client->getContainer();
+        $session = $container->get('session');
+
+        $userManager = $container->get('fos_user.user_manager');
+        $loginManager = $container->get('fos_user.security.login_manager');
+        $firewallName = $container->getParameter('fos_user.firewall_name');
+
+        $user = $userManager->findUserBy(array('username' => $username));
+        $loginManager->logInUser($firewallName, $user);
+
+        $session->set('_security_'.$firewallName, serialize($container->get('security.token_storage')->getToken()));
+        $session->save();
+
+        $cookie = new Cookie($session->getName(), $session->getId());
+        $this->client->getCookieJar()->set($cookie);
+    }
+
+    /**
+     * Instead of `logInAs` this method use a HTTP request to log in the user.
+     * Could be better for some tests.
+     *
+     * @param string $username User to log in
+     */
+    public function logInAsUsingHttp($username)
     {
         $crawler = $this->client->request('GET', '/login');
         $form = $crawler->filter('button[type=submit]')->form();
@@ -33,19 +112,51 @@ 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.
+     */
+    protected function checkRedis()
+    {
+        try {
+            $this->client->getContainer()->get('wallabag_core.redis.client')->connect();
+        } catch (\Exception $e) {
+            $this->markTestSkipped('Redis is not installed/activated');
+        }
+    }
 }