]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Change the way to login user in tests 2172/head
authorJeremy Benoist <jeremy.benoist@gmail.com>
Fri, 24 Jun 2016 09:55:45 +0000 (11:55 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Fri, 24 Jun 2016 09:55:47 +0000 (11:55 +0200)
Instead of using a HTTP request we just login user like FOSUser does.
It allows us to mock service in container for functional tests.

Also, fix a bad config name in fos_user for firewall

And finally, add functional test to PocketImport

app/config/config.yml
tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php
tests/Wallabag/CoreBundle/Controller/TagControllerTest.php
tests/Wallabag/CoreBundle/WallabagCoreTestCase.php
tests/Wallabag/ImportBundle/Controller/PocketControllerTest.php
tests/Wallabag/ImportBundle/fixtures/unnamed.png [new file with mode: 0644]

index f1321d67ba1b267a9433bb960a02194d71265d41..6a8078ccdf1c8195d63f8f96254c64da3f19f0fc 100644 (file)
@@ -176,7 +176,7 @@ liip_theme:
 
 fos_user:
     db_driver: orm
-    firewall_name: main
+    firewall_name: secured_area
     user_class: Wallabag\UserBundle\Entity\User
     registration:
         confirmation:
index f503ff4bd8daff2bd2d64209d643d2d0e231d410..03355f5abde2d02820ea5ce842c8938dccbe8dda 100644 (file)
@@ -36,7 +36,7 @@ class SecurityControllerTest extends WallabagCoreTestCase
         $em->persist($user);
         $em->flush();
 
-        $this->logInAs('admin');
+        $this->logInAsUsingHttp('admin');
         $crawler = $client->request('GET', '/config');
         $this->assertContains('scheb_two_factor.trusted', $crawler->filter('body')->extract(['_text'])[0]);
 
index a019d36c98c24cfb20882cd4d0e0f7e8f010fe81..58450e5fb0933632480e8a7c60e6c30a20efc7a3 100644 (file)
@@ -39,6 +39,12 @@ class TagControllerTest extends WallabagCoreTestCase
         $client->submit($form, $data);
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
 
+        // be sure to reload the entry
+        $entry = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->findOneByUsernameAndNotArchived('admin');
+
         $this->assertEquals(1, count($entry->getTags()));
 
         # tag already exists and already assigned
index c69e83301203ec577c9eb23577afaa8e09a8adbc..c0055888a255eaa44aa88d52f5630ff50e5c6147 100644 (file)
@@ -3,6 +3,7 @@
 namespace Tests\Wallabag\CoreBundle;
 
 use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
+use Symfony\Component\BrowserKit\Cookie;
 
 abstract class WallabagCoreTestCase extends WebTestCase
 {
@@ -20,7 +21,38 @@ abstract class WallabagCoreTestCase extends WebTestCase
         $this->client = static::createClient();
     }
 
+    /**
+     * 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();
index 6aaf1b57be7a1d00ef2ea0600b2ebbb82a217c51..e0e61df88c43d5d5161128a261738bf9385c0e69 100644 (file)
@@ -22,15 +22,13 @@ class PocketControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $crawler = $client->request('GET', '/import/pocket/auth');
+        $client->request('GET', '/import/pocket/auth');
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
     }
 
     public function testImportPocketAuth()
     {
-        $this->markTestSkipped('PocketImport: Find a way to properly mock a service.');
-
         $this->logInAs('admin');
         $client = $this->getClient();
 
@@ -43,9 +41,9 @@ class PocketControllerTest extends WallabagCoreTestCase
             ->method('getRequestToken')
             ->willReturn('token');
 
-        $client->getContainer()->set('wallabag_import.pocket.import', $pocketImport);
+        static::$kernel->getContainer()->set('wallabag_import.pocket.import', $pocketImport);
 
-        $crawler = $client->request('GET', '/import/pocket/auth');
+        $client->request('GET', '/import/pocket/auth');
 
         $this->assertEquals(301, $client->getResponse()->getStatusCode());
         $this->assertContains('getpocket.com/auth/authorize', $client->getResponse()->headers->get('location'));
@@ -56,10 +54,55 @@ class PocketControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $crawler = $client->request('GET', '/import/pocket/callback');
+        $pocketImport = $this->getMockBuilder('Wallabag\ImportBundle\Import\PocketImport')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $pocketImport
+            ->expects($this->once())
+            ->method('authorize')
+            ->willReturn(false);
+
+        static::$kernel->getContainer()->set('wallabag_import.pocket.import', $pocketImport);
+
+        $client->request('GET', '/import/pocket/callback');
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
-        $this->assertContains('import/pocket', $client->getResponse()->headers->get('location'));
+        $this->assertContains('/', $client->getResponse()->headers->get('location'), 'Import is ok, redirect to homepage');
         $this->assertEquals('flashes.import.notice.failed', $client->getContainer()->get('session')->getFlashBag()->peek('notice')[0]);
     }
+
+    public function testImportPocketCallback()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $pocketImport = $this->getMockBuilder('Wallabag\ImportBundle\Import\PocketImport')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $pocketImport
+            ->expects($this->once())
+            ->method('authorize')
+            ->willReturn(true);
+
+        $pocketImport
+            ->expects($this->once())
+            ->method('setMarkAsRead')
+            ->with(false)
+            ->willReturn($pocketImport);
+
+        $pocketImport
+            ->expects($this->once())
+            ->method('import')
+            ->willReturn(true);
+
+        static::$kernel->getContainer()->set('wallabag_import.pocket.import', $pocketImport);
+
+        $client->request('GET', '/import/pocket/callback');
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+        $this->assertContains('/', $client->getResponse()->headers->get('location'), 'Import is ok, redirect to homepage');
+        $this->assertEquals('flashes.import.notice.summary', $client->getContainer()->get('session')->getFlashBag()->peek('notice')[0]);
+    }
 }
diff --git a/tests/Wallabag/ImportBundle/fixtures/unnamed.png b/tests/Wallabag/ImportBundle/fixtures/unnamed.png
new file mode 100644 (file)
index 0000000..e6dd9ca
Binary files /dev/null and b/tests/Wallabag/ImportBundle/fixtures/unnamed.png differ