From fdc90ceb172bb7b237e34a1a01f53018c09f514b Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Fri, 24 Jun 2016 11:55:45 +0200 Subject: Change the way to login user in tests 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 --- .../Controller/SecurityControllerTest.php | 2 +- .../CoreBundle/Controller/TagControllerTest.php | 6 +++ tests/Wallabag/CoreBundle/WallabagCoreTestCase.php | 32 ++++++++++++ .../Controller/PocketControllerTest.php | 57 ++++++++++++++++++--- tests/Wallabag/ImportBundle/fixtures/unnamed.png | Bin 0 -> 3688 bytes 5 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 tests/Wallabag/ImportBundle/fixtures/unnamed.png (limited to 'tests/Wallabag') diff --git a/tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php b/tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php index f503ff4b..03355f5a 100644 --- a/tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php @@ -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]); diff --git a/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php index a019d36c..58450e5f 100644 --- a/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php @@ -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 diff --git a/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php b/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php index c69e8330..c0055888 100644 --- a/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php +++ b/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php @@ -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(); diff --git a/tests/Wallabag/ImportBundle/Controller/PocketControllerTest.php b/tests/Wallabag/ImportBundle/Controller/PocketControllerTest.php index 6aaf1b57..e0e61df8 100644 --- a/tests/Wallabag/ImportBundle/Controller/PocketControllerTest.php +++ b/tests/Wallabag/ImportBundle/Controller/PocketControllerTest.php @@ -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 index 00000000..e6dd9caa Binary files /dev/null and b/tests/Wallabag/ImportBundle/fixtures/unnamed.png differ -- cgit v1.2.3