diff --git a/app/AppKernel.php b/app/AppKernel.php index b9293498f..c50783a6d 100644 --- a/app/AppKernel.php +++ b/app/AppKernel.php @@ -48,6 +48,10 @@ class AppKernel extends Kernel $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(); + + if ('test' === $this->getEnvironment()) { + $bundles[] = new DAMA\DoctrineTestBundle\DAMADoctrineTestBundle(); + } } return $bundles; diff --git a/app/config/config_test.yml b/app/config/config_test.yml index f5e2c25ea..c620c3599 100644 --- a/app/config/config_test.yml +++ b/app/config/config_test.yml @@ -29,7 +29,8 @@ doctrine: user: "%test_database_user%" password: "%test_database_password%" charset: "%test_database_charset%" - path: "%test_database_path%" + path: "%env(TEST_DATABASE_PATH)%" + orm: metadata_cache_driver: type: service diff --git a/app/config/parameters_test.yml b/app/config/parameters_test.yml index 5f2e25bb9..010785e67 100644 --- a/app/config/parameters_test.yml +++ b/app/config/parameters_test.yml @@ -5,5 +5,6 @@ parameters: test_database_name: null test_database_user: null test_database_password: null - test_database_path: '%kernel.root_dir%/../data/db/wallabag_test.sqlite' + test_database_path: "%env(TEST_DATABASE_PATH)%" + env(TEST_DATABASE_PATH): "%kernel.root_dir%/../data/db/wallabag_test.sqlite" test_database_charset: utf8 diff --git a/app/config/tests/parameters_test.mysql.yml b/app/config/tests/parameters_test.mysql.yml index bca2d4663..36b227fbc 100644 --- a/app/config/tests/parameters_test.mysql.yml +++ b/app/config/tests/parameters_test.mysql.yml @@ -6,4 +6,5 @@ parameters: test_database_user: root test_database_password: ~ test_database_path: ~ + env(TEST_DATABASE_PATH): ~ test_database_charset: utf8mb4 diff --git a/app/config/tests/parameters_test.pgsql.yml b/app/config/tests/parameters_test.pgsql.yml index 3e18d4a03..60f51df6d 100644 --- a/app/config/tests/parameters_test.pgsql.yml +++ b/app/config/tests/parameters_test.pgsql.yml @@ -6,4 +6,5 @@ parameters: test_database_user: travis test_database_password: ~ test_database_path: ~ + env(TEST_DATABASE_PATH): ~ test_database_charset: utf8 diff --git a/app/config/tests/parameters_test.sqlite.yml b/app/config/tests/parameters_test.sqlite.yml index b8a5f41a7..5c731bf54 100644 --- a/app/config/tests/parameters_test.sqlite.yml +++ b/app/config/tests/parameters_test.sqlite.yml @@ -5,5 +5,8 @@ parameters: test_database_name: ~ test_database_user: ~ test_database_password: ~ - test_database_path: "%kernel.root_dir%/../data/db/wallabag_test.sqlite" + # Using an environnement variable in order to avoid the error "attempt to write a readonly database" + # when the schema is dropped then recreate + test_database_path: "%env(TEST_DATABASE_PATH)%" + env(TEST_DATABASE_PATH): "%kernel.root_dir%/../data/db/wallabag_test.sqlite" test_database_charset: utf8 diff --git a/composer.json b/composer.json index d8c58de28..60de962c3 100644 --- a/composer.json +++ b/composer.json @@ -90,9 +90,10 @@ "doctrine/doctrine-fixtures-bundle": "~2.2", "doctrine/data-fixtures": "~1.1.1", "sensio/generator-bundle": "^3.0", - "symfony/phpunit-bridge": "^3.0", + "symfony/phpunit-bridge": "^3.3", "friendsofphp/php-cs-fixer": "~1.9", - "m6web/redis-mock": "^2.0" + "m6web/redis-mock": "^2.0", + "dama/doctrine-test-bundle": "^1.0" }, "scripts": { "post-cmd": [ diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 3216b6ffb..8f5285e65 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -30,4 +30,8 @@ + + + + diff --git a/src/Wallabag/CoreBundle/Command/InstallCommand.php b/src/Wallabag/CoreBundle/Command/InstallCommand.php index 0d9364f6a..d9608246e 100644 --- a/src/Wallabag/CoreBundle/Command/InstallCommand.php +++ b/src/Wallabag/CoreBundle/Command/InstallCommand.php @@ -499,20 +499,18 @@ class InstallCommand extends ContainerAwareCommand $output = new BufferedOutput(); $exitCode = $this->getApplication()->run(new ArrayInput($parameters), $output); - if (0 !== $exitCode) { - $this->getApplication()->setAutoExit(true); - - $this->defaultOutput->writeln(''); - $this->defaultOutput->writeln('The command "'.$command.'" generates some errors: '); - $this->defaultOutput->writeln($output->fetch()); - - die(); - } - // PDO does not always close the connection after Doctrine commands. // See https://github.com/symfony/symfony/issues/11750. $this->getContainer()->get('doctrine')->getManager()->getConnection()->close(); + if (0 !== $exitCode) { + $this->getApplication()->setAutoExit(true); + + throw new \RuntimeException( + 'The command "'.$command."\" generates some errors: \n\n" + .$output->fetch()); + } + return $this; } diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php index 1a80cc1ac..0e61c6420 100644 --- a/src/Wallabag/CoreBundle/Controller/ConfigController.php +++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php @@ -250,7 +250,7 @@ class ConfigController extends Controller case 'entries': // SQLite doesn't care about cascading remove, so we need to manually remove associated stuff // otherwise they won't be removed ... - if ($this->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) { + if ($this->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) { $this->getDoctrine()->getRepository('WallabagAnnotationBundle:Annotation')->removeAllByUserId($this->getUser()->getId()); } @@ -262,7 +262,7 @@ class ConfigController extends Controller ->removeAllByUserId($this->getUser()->getId()); break; case 'archived': - if ($this->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) { + if ($this->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) { $this->removeAnnotationsForArchivedByUserId($this->getUser()->getId()); } diff --git a/src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php b/src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php index 3b4c4cf9f..5e6af8cc5 100644 --- a/src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php +++ b/src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php @@ -45,9 +45,8 @@ class SQLiteCascadeDeleteSubscriber implements EventSubscriber public function preRemove(LifecycleEventArgs $args) { $entity = $args->getEntity(); - - if (!$this->doctrine->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver || - !$entity instanceof Entry) { + if (!$this->doctrine->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform + || !$entity instanceof Entry) { return; } diff --git a/tests/Wallabag/ApiBundle/Controller/DeveloperControllerTest.php b/tests/Wallabag/ApiBundle/Controller/DeveloperControllerTest.php index 6659443ba..d37cbbf9b 100644 --- a/tests/Wallabag/ApiBundle/Controller/DeveloperControllerTest.php +++ b/tests/Wallabag/ApiBundle/Controller/DeveloperControllerTest.php @@ -3,6 +3,7 @@ namespace Tests\Wallabag\ApiBundle\Controller; use Tests\Wallabag\CoreBundle\WallabagCoreTestCase; +use Wallabag\ApiBundle\Entity\Client; class DeveloperControllerTest extends WallabagCoreTestCase { @@ -33,14 +34,10 @@ class DeveloperControllerTest extends WallabagCoreTestCase $this->assertContains('My app', $alert[0]); } - /** - * @depends testCreateClient - */ public function testCreateToken() { $client = $this->getClient(); - $em = $client->getContainer()->get('doctrine.orm.entity_manager'); - $apiClient = $em->getRepository('WallabagApiBundle:Client')->findOneByName('My app'); + $apiClient = $this->createApiClientForUser('admin'); $client->request('POST', '/oauth/v2/token', [ 'grant_type' => 'password', @@ -83,6 +80,7 @@ class DeveloperControllerTest extends WallabagCoreTestCase public function testRemoveClient() { $client = $this->getClient(); + $adminApiClient = $this->createApiClientForUser('admin'); $em = $client->getContainer()->get('doctrine.orm.entity_manager'); // Try to remove an admin's client with a wrong user @@ -90,12 +88,8 @@ class DeveloperControllerTest extends WallabagCoreTestCase $client->request('GET', '/developer'); $this->assertContains('no_client', $client->getResponse()->getContent()); - // get an ID of a admin's client - $this->logInAs('admin'); - $nbClients = $em->getRepository('WallabagApiBundle:Client')->findByUser($this->getLoggedInUserId()); - $this->logInAs('bob'); - $client->request('GET', '/developer/client/delete/'.$nbClients[0]->getId()); + $client->request('GET', '/developer/client/delete/'.$adminApiClient->getId()); $this->assertEquals(403, $client->getResponse()->getStatusCode()); // Try to remove the admin's client with the good user @@ -111,7 +105,29 @@ class DeveloperControllerTest extends WallabagCoreTestCase $client->click($link); $this->assertEquals(302, $client->getResponse()->getStatusCode()); - $newNbClients = $em->getRepository('WallabagApiBundle:Client')->findByUser($this->getLoggedInUserId()); - $this->assertGreaterThan(count($newNbClients), count($nbClients)); + $this->assertNull( + $em->getRepository('WallabagApiBundle:Client')->find($adminApiClient->getId()), + 'The client should have been removed' + ); + } + + /** + * @param string $username + * + * @return Client + */ + private function createApiClientForUser($username) + { + $client = $this->getClient(); + $em = $client->getContainer()->get('doctrine.orm.entity_manager'); + $userManager = $client->getContainer()->get('fos_user.user_manager'); + $user = $userManager->findUserBy(array('username' => $username)); + $apiClient = new Client($user); + $apiClient->setName('My app'); + $apiClient->setAllowedGrantTypes(['password']); + $em->persist($apiClient); + $em->flush(); + + return $apiClient; } } diff --git a/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php index bf7d373aa..1ecd03fb9 100644 --- a/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php +++ b/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php @@ -3,8 +3,10 @@ namespace Tests\Wallabag\ApiBundle\Controller; use Tests\Wallabag\ApiBundle\WallabagApiTestCase; +use Wallabag\CoreBundle\Entity\Entry; use Wallabag\CoreBundle\Entity\Tag; use Wallabag\CoreBundle\Helper\ContentProxy; +use Wallabag\UserBundle\Entity\User; class EntryRestControllerTest extends WallabagApiTestCase { @@ -801,22 +803,28 @@ class EntryRestControllerTest extends WallabagApiTestCase public function testDeleteEntriesTagsListAction() { - $entry = $this->client->getContainer()->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId('http://0.0.0.0/entry4', 1); + $em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); + $entry = new Entry($em->getReference(User::class, 1)); + $entry->setUrl('http://0.0.0.0/test-entry'); + $entry->addTag((new Tag())->setLabel('foo-tag')); + $entry->addTag((new Tag())->setLabel('bar-tag')); + $em->persist($entry); + $em->flush(); - $tags = $entry->getTags(); - - $this->assertCount(4, $tags); + $em->clear(); $list = [ [ - 'url' => 'http://0.0.0.0/entry4', - 'tags' => 'new tag 1, new tag 2', + 'url' => 'http://0.0.0.0/test-entry', + 'tags' => 'foo-tag, bar-tag', ], ]; $this->client->request('DELETE', '/api/entries/tags/list?list='.json_encode($list)); + $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); + + $entry = $em->getRepository('WallabagCoreBundle:Entry')->find($entry->getId()); + $this->assertCount(0, $entry->getTags()); } public function testPostEntriesListAction() @@ -841,9 +849,14 @@ class EntryRestControllerTest extends WallabagApiTestCase public function testDeleteEntriesListAction() { + $em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); + $em->persist((new Entry($em->getReference(User::class, 1)))->setUrl('http://0.0.0.0/test-entry1')); + + $em->flush(); + $em->clear(); $list = [ - 'http://www.lemonde.fr/musiques/article/2017/04/23/loin-de-la-politique-le-printemps-de-bourges-retombe-en-enfance_5115862_1654986.html', - 'http://0.0.0.0/entry3', + 'http://0.0.0.0/test-entry1', + 'http://0.0.0.0/test-entry-not-exist', ]; $this->client->request('DELETE', '/api/entries/list?urls='.json_encode($list)); @@ -853,10 +866,10 @@ class EntryRestControllerTest extends WallabagApiTestCase $content = json_decode($this->client->getResponse()->getContent(), true); $this->assertTrue($content[0]['entry']); - $this->assertEquals('http://www.lemonde.fr/musiques/article/2017/04/23/loin-de-la-politique-le-printemps-de-bourges-retombe-en-enfance_5115862_1654986.html', $content[0]['url']); + $this->assertEquals('http://0.0.0.0/test-entry1', $content[0]['url']); $this->assertFalse($content[1]['entry']); - $this->assertEquals('http://0.0.0.0/entry3', $content[1]['url']); + $this->assertEquals('http://0.0.0.0/test-entry-not-exist', $content[1]['url']); } public function testLimitBulkAction() diff --git a/tests/Wallabag/ApiBundle/Controller/TagRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/TagRestControllerTest.php index 90b132ebe..7f69bd67c 100644 --- a/tests/Wallabag/ApiBundle/Controller/TagRestControllerTest.php +++ b/tests/Wallabag/ApiBundle/Controller/TagRestControllerTest.php @@ -22,36 +22,35 @@ class TagRestControllerTest extends WallabagApiTestCase return end($content); } - /** - * @depends testGetUserTags - */ - public function testDeleteUserTag($tag) + public function testDeleteUserTag() { - $tagName = $tag['label']; + $tagLabel = 'tagtest'; + $tag = new Tag(); + $tag->setLabel($tagLabel); - $this->client->request('DELETE', '/api/tags/'.$tag['id'].'.json'); + $em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); + $em->persist($tag); + $em->flush(); + $em->clear(); + + $this->client->request('DELETE', '/api/tags/'.$tag->getId().'.json'); $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $content = json_decode($this->client->getResponse()->getContent(), true); $this->assertArrayHasKey('label', $content); - $this->assertEquals($tag['label'], $content['label']); - $this->assertEquals($tag['slug'], $content['slug']); + $this->assertEquals($tag->getLabel(), $content['label']); + $this->assertEquals($tag->getSlug(), $content['slug']); - $entries = $this->client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findAllByTagId($this->user->getId(), $tag['id']); + $entries = $em->getRepository('WallabagCoreBundle:Entry') + ->findAllByTagId($this->user->getId(), $tag->getId()); $this->assertCount(0, $entries); - $tag = $this->client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Tag') - ->findOneByLabel($tagName); + $tag = $em->getRepository('WallabagCoreBundle:Tag')->findOneByLabel($tagLabel); - $this->assertNull($tag, $tagName.' was removed because it begun an orphan tag'); + $this->assertNull($tag, $tagLabel.' was removed because it begun an orphan tag'); } public function dataForDeletingTagByLabel() diff --git a/tests/Wallabag/ApiBundle/WallabagApiTestCase.php b/tests/Wallabag/ApiBundle/WallabagApiTestCase.php index a67655c86..8709da708 100644 --- a/tests/Wallabag/ApiBundle/WallabagApiTestCase.php +++ b/tests/Wallabag/ApiBundle/WallabagApiTestCase.php @@ -8,7 +8,7 @@ use Symfony\Component\BrowserKit\Cookie; abstract class WallabagApiTestCase extends WebTestCase { /** - * @var Client + * @var \Symfony\Bundle\FrameworkBundle\Client */ protected $client = null; @@ -23,7 +23,7 @@ abstract class WallabagApiTestCase extends WebTestCase } /** - * @return Client + * @return \Symfony\Bundle\FrameworkBundle\Client */ protected function createAuthorizedClient() { diff --git a/tests/Wallabag/CoreBundle/Command/ExportCommandTest.php b/tests/Wallabag/CoreBundle/Command/ExportCommandTest.php index 284efac4b..2eebf39b4 100644 --- a/tests/Wallabag/CoreBundle/Command/ExportCommandTest.php +++ b/tests/Wallabag/CoreBundle/Command/ExportCommandTest.php @@ -55,7 +55,7 @@ class ExportCommandTest extends WallabagCoreTestCase 'username' => 'admin', ]); - $this->assertContains('Exporting 6 entrie(s) for user « admin »... Done', $tester->getDisplay()); + $this->assertContains('Exporting 5 entrie(s) for user « admin »... Done', $tester->getDisplay()); $this->assertFileExists('admin-export.json'); } diff --git a/tests/Wallabag/CoreBundle/Command/InstallCommandTest.php b/tests/Wallabag/CoreBundle/Command/InstallCommandTest.php index 71c2ffc63..94fc0b949 100644 --- a/tests/Wallabag/CoreBundle/Command/InstallCommandTest.php +++ b/tests/Wallabag/CoreBundle/Command/InstallCommandTest.php @@ -2,8 +2,11 @@ namespace Tests\Wallabag\CoreBundle\Command; +use DAMA\DoctrineTestBundle\Doctrine\DBAL\StaticDriver; use Doctrine\Bundle\DoctrineBundle\Command\CreateDatabaseDoctrineCommand; use Doctrine\Bundle\DoctrineBundle\Command\DropDatabaseDoctrineCommand; +use Doctrine\DBAL\Platforms\PostgreSqlPlatform; +use Doctrine\DBAL\Platforms\SqlitePlatform; use Symfony\Bundle\FrameworkBundle\Console\Application; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\NullOutput; @@ -18,7 +21,9 @@ class InstallCommandTest extends WallabagCoreTestCase { parent::setUp(); - if ($this->getClient()->getContainer()->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOPgSql\Driver) { + /** @var \Doctrine\DBAL\Connection $connection */ + $connection = $this->getClient()->getContainer()->get('doctrine')->getConnection(); + if ($connection->getDatabasePlatform() instanceof PostgreSqlPlatform) { /* * LOG: statement: CREATE DATABASE "wallabag" * ERROR: source database "template1" is being accessed by other users @@ -30,34 +35,44 @@ class InstallCommandTest extends WallabagCoreTestCase */ $this->markTestSkipped('PostgreSQL spotted: can\'t find a good way to drop current database, skipping.'); } + + if ($connection->getDatabasePlatform() instanceof SqlitePlatform) { + // Environnement variable useful only for sqlite to avoid the error "attempt to write a readonly database" + // We can't define always this environnement variable because pdo_mysql seems to use it + // and we have the error: + // SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; + // check the manual that corresponds to your MariaDB server version for the right syntax to use + // near '/tmp/wallabag_testTYj1kp' at line 1 + $databasePath = tempnam(sys_get_temp_dir(), 'wallabag_test'); + putenv("TEST_DATABASE_PATH=$databasePath"); + + // The environnement has been changed, recreate the client in order to update connection + parent::setUp(); + } + + // disable doctrine-test-bundle + StaticDriver::setKeepStaticConnections(false); + + $this->resetDatabase($this->getClient()); } - /** - * Ensure next tests will have a clean database. - */ - public static function tearDownAfterClass() + public function tearDown() { - $application = new Application(static::$kernel); - $application->setAutoExit(false); + $databasePath = getenv('TEST_DATABASE_PATH'); + // Remove variable environnement + putenv('TEST_DATABASE_PATH'); + if ($databasePath && file_exists($databasePath)) { + unlink($databasePath); + } else { + // Create a new client to avoid the error: + // Transaction commit failed because the transaction has been marked for rollback only. + $client = static::createClient(); + $this->resetDatabase($client); + } - $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()); + // enable doctrine-test-bundle + StaticDriver::setKeepStaticConnections(true); + parent::tearDown(); } public function testRunInstallCommand() @@ -120,7 +135,7 @@ class InstallCommandTest extends WallabagCoreTestCase { // skipped SQLite check when database is removed because while testing for the connection, // the driver will create the file (so the database) before testing if database exist - if ($this->getClient()->getContainer()->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) { + if ($this->getClient()->getContainer()->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) { $this->markTestSkipped('SQLite spotted: can\'t test with database removed.'); } diff --git a/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php b/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php index 35888f167..5bc815ee6 100644 --- a/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php @@ -67,8 +67,17 @@ class ConfigControllerTest extends WallabagCoreTestCase public function testChangeReadingSpeed() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl('http://0.0.0.0/test-entry1') + ->setReadingTime(22); + $this->getEntityManager()->persist($entry); + + $this->getEntityManager()->flush(); + $this->getEntityManager()->clear(); + $crawler = $client->request('GET', '/unread/list'); $form = $crawler->filter('button[id=submit-filter]')->form(); $dataFilters = [ @@ -409,6 +418,7 @@ class ConfigControllerTest extends WallabagCoreTestCase public function testTaggingRuleCreation() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); $crawler = $client->request('GET', '/config'); @@ -939,6 +949,7 @@ class ConfigControllerTest extends WallabagCoreTestCase public function testSwitchViewMode() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); $client->request('GET', '/unread/list'); diff --git a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php index 116e5f323..cc7b3672c 100644 --- a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php @@ -71,6 +71,7 @@ class EntryControllerTest extends WallabagCoreTestCase public function testGetNew() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); $crawler = $client->request('GET', '/new'); @@ -84,6 +85,7 @@ class EntryControllerTest extends WallabagCoreTestCase public function testPostNewViaBookmarklet() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); $crawler = $client->request('GET', '/'); @@ -195,6 +197,12 @@ class EntryControllerTest extends WallabagCoreTestCase public function testPostNewOkUrlExist() { $this->logInAs('admin'); + + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + $client = $this->getClient(); $crawler = $client->request('GET', '/new'); @@ -288,7 +296,7 @@ class EntryControllerTest extends WallabagCoreTestCase $tags = $entry->getTags(); $this->assertCount(2, $tags); - $this->assertEquals('wallabag', $tags[0]->getLabel()); + $this->assertContains('wallabag', $tags); $em->remove($entry); $em->flush(); @@ -317,7 +325,7 @@ class EntryControllerTest extends WallabagCoreTestCase $tags = $entry->getTags(); $this->assertCount(2, $tags); - $this->assertEquals('wallabag', $tags[1]->getLabel()); + $this->assertContains('wallabag', $tags); $em->remove($entry); $em->flush(); @@ -364,24 +372,23 @@ class EntryControllerTest extends WallabagCoreTestCase $this->assertEquals('/all/list', $client->getResponse()->getTargetUrl()); } - /** - * @depends testPostNewOk - */ public function testView() { $this->logInAs('admin'); $client = $this->getClient(); - $content = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl('http://example.com/foo'); + $entry->setTitle('title foo'); + $entry->setContent('foo bar baz'); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); - $crawler = $client->request('GET', '/view/'.$content->getId()); + $crawler = $client->request('GET', '/view/'.$entry->getId()); $this->assertEquals(200, $client->getResponse()->getStatusCode()); $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); - $this->assertContains($content->getTitle(), $body[0]); + $this->assertContains($entry->getTitle(), $body[0]); } /** @@ -394,27 +401,23 @@ class EntryControllerTest extends WallabagCoreTestCase $this->logInAs('admin'); $client = $this->getClient(); - $em = $client->getContainer() - ->get('doctrine.orm.entity_manager'); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $entry->setTitle('title foo'); + $entry->setContent(''); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + $this->getEntityManager()->clear(); - $content = $em - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); - - // empty content - $content->setContent(''); - $em->persist($content); - $em->flush(); - - $client->request('GET', '/reload/'.$content->getId()); + $client->request('GET', '/reload/'.$entry->getId()); $this->assertEquals(302, $client->getResponse()->getStatusCode()); - $content = $em + $entry = $this->getEntityManager() ->getRepository('WallabagCoreBundle:Entry') - ->find($content->getId()); + ->find($entry->getId()); - $this->assertNotEmpty($content->getContent()); + $this->assertNotEmpty($entry->getContent()); } /** @@ -425,32 +428,21 @@ class EntryControllerTest extends WallabagCoreTestCase $this->logInAs('admin'); $client = $this->getClient(); - $em = $client->getContainer() - ->get('doctrine.orm.entity_manager'); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl('http://0.0.0.0/failed.html'); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); - $content = $em - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); - - // put a known failed url - $content->setUrl('http://0.0.0.0/failed.html'); - $em->persist($content); - $em->flush(); - - $client->request('GET', '/reload/'.$content->getId()); + $client->request('GET', '/reload/'.$entry->getId()); $this->assertEquals(302, $client->getResponse()->getStatusCode()); // force EntityManager to clear previous entity // otherwise, retrieve the same entity will retrieve change from the previous request :0 - $em->clear(); - $newContent = $em + $this->getEntityManager()->clear(); + $newContent = $this->getEntityManager() ->getRepository('WallabagCoreBundle:Entry') - ->find($content->getId()); - - $newContent->setUrl($this->url); - $em->persist($newContent); - $em->flush(); + ->find($entry->getId()); $this->assertNotEquals($client->getContainer()->getParameter('wallabag_core.fetching_error_message'), $newContent->getContent()); } @@ -460,12 +452,12 @@ class EntryControllerTest extends WallabagCoreTestCase $this->logInAs('admin'); $client = $this->getClient(); - $content = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); - $crawler = $client->request('GET', '/edit/'.$content->getId()); + $crawler = $client->request('GET', '/edit/'.$entry->getId()); $this->assertEquals(200, $client->getResponse()->getStatusCode()); @@ -478,12 +470,12 @@ class EntryControllerTest extends WallabagCoreTestCase $this->logInAs('admin'); $client = $this->getClient(); - $content = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); - $crawler = $client->request('GET', '/edit/'.$content->getId()); + $crawler = $client->request('GET', '/edit/'.$entry->getId()); $this->assertEquals(200, $client->getResponse()->getStatusCode()); @@ -508,19 +500,20 @@ class EntryControllerTest extends WallabagCoreTestCase $this->logInAs('admin'); $client = $this->getClient(); - $content = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + $this->getEntityManager()->clear(); - $client->request('GET', '/archive/'.$content->getId()); + $client->request('GET', '/archive/'.$entry->getId()); $this->assertEquals(302, $client->getResponse()->getStatusCode()); $res = $client->getContainer() ->get('doctrine.orm.entity_manager') ->getRepository('WallabagCoreBundle:Entry') - ->find($content->getId()); + ->find($entry->getId()); $this->assertEquals($res->isArchived(), true); } @@ -530,19 +523,20 @@ class EntryControllerTest extends WallabagCoreTestCase $this->logInAs('admin'); $client = $this->getClient(); - $content = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + $this->getEntityManager()->clear(); - $client->request('GET', '/star/'.$content->getId()); + $client->request('GET', '/star/'.$entry->getId()); $this->assertEquals(302, $client->getResponse()->getStatusCode()); $res = $client->getContainer() ->get('doctrine.orm.entity_manager') ->getRepository('WallabagCoreBundle:Entry') - ->findOneById($content->getId()); + ->findOneById($entry->getId()); $this->assertEquals($res->isStarred(), true); } @@ -552,16 +546,16 @@ class EntryControllerTest extends WallabagCoreTestCase $this->logInAs('admin'); $client = $this->getClient(); - $content = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); - $client->request('GET', '/delete/'.$content->getId()); + $client->request('GET', '/delete/'.$entry->getId()); $this->assertEquals(302, $client->getResponse()->getStatusCode()); - $client->request('GET', '/delete/'.$content->getId()); + $client->request('GET', '/delete/'.$entry->getId()); $this->assertEquals(404, $client->getResponse()->getStatusCode()); } @@ -627,7 +621,13 @@ class EntryControllerTest extends WallabagCoreTestCase public function testFilterOnReadingTime() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $entry->setReadingTime(22); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); $crawler = $client->request('GET', '/unread/list'); @@ -666,9 +666,20 @@ class EntryControllerTest extends WallabagCoreTestCase public function testFilterOnReadingTimeOnlyUpper() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); - $crawler = $client->request('GET', '/unread/list'); + $crawler = $client->request('GET', '/all/list'); + $this->assertCount(5, $crawler->filter('div[class=entry]')); + + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $entry->setReadingTime(23); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + + $crawler = $client->request('GET', '/all/list'); + $this->assertCount(6, $crawler->filter('div[class=entry]')); $form = $crawler->filter('button[id=submit-filter]')->form(); @@ -678,12 +689,13 @@ class EntryControllerTest extends WallabagCoreTestCase $crawler = $client->submit($form, $data); - $this->assertCount(3, $crawler->filter('div[class=entry]')); + $this->assertCount(5, $crawler->filter('div[class=entry]')); } public function testFilterOnReadingTimeOnlyLower() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); $crawler = $client->request('GET', '/unread/list'); @@ -696,12 +708,22 @@ class EntryControllerTest extends WallabagCoreTestCase $crawler = $client->submit($form, $data); - $this->assertCount(4, $crawler->filter('div[class=entry]')); + $this->assertCount(0, $crawler->filter('div[class=entry]')); + + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $entry->setReadingTime(23); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + + $crawler = $client->submit($form, $data); + $this->assertCount(1, $crawler->filter('div[class=entry]')); } public function testFilterOnUnreadStatus() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); $crawler = $client->request('GET', '/all/list'); @@ -714,12 +736,23 @@ class EntryControllerTest extends WallabagCoreTestCase $crawler = $client->submit($form, $data); + $this->assertCount(4, $crawler->filter('div[class=entry]')); + + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $entry->setArchived(false); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + + $crawler = $client->submit($form, $data); + $this->assertCount(5, $crawler->filter('div[class=entry]')); } public function testFilterOnCreationDate() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); $crawler = $client->request('GET', '/unread/list'); @@ -733,7 +766,7 @@ class EntryControllerTest extends WallabagCoreTestCase $crawler = $client->submit($form, $data); - $this->assertCount(6, $crawler->filter('div[class=entry]')); + $this->assertCount(5, $crawler->filter('div[class=entry]')); $data = [ 'entry_filter[createdAt][left_date]' => date('d/m/Y'), @@ -742,7 +775,7 @@ class EntryControllerTest extends WallabagCoreTestCase $crawler = $client->submit($form, $data); - $this->assertCount(6, $crawler->filter('div[class=entry]')); + $this->assertCount(5, $crawler->filter('div[class=entry]')); $data = [ 'entry_filter[createdAt][left_date]' => '01/01/1970', @@ -786,6 +819,7 @@ class EntryControllerTest extends WallabagCoreTestCase public function testFilterOnDomainName() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); $crawler = $client->request('GET', '/unread/list'); @@ -818,6 +852,7 @@ class EntryControllerTest extends WallabagCoreTestCase public function testFilterOnStatus() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); $crawler = $client->request('GET', '/unread/list'); @@ -839,6 +874,7 @@ class EntryControllerTest extends WallabagCoreTestCase public function testPreviewPictureFilter() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); $crawler = $client->request('GET', '/unread/list'); @@ -846,14 +882,21 @@ class EntryControllerTest extends WallabagCoreTestCase $form['entry_filter[previewPicture]']->tick(); $crawler = $client->submit($form); - $this->assertCount(2, $crawler->filter('div[class=entry]')); + $this->assertCount(1, $crawler->filter('div[class=entry]')); } public function testFilterOnLanguage() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $entry->setLanguage('fr'); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + $crawler = $client->request('GET', '/unread/list'); $form = $crawler->filter('button[id=submit-filter]')->form(); $data = [ @@ -877,10 +920,14 @@ class EntryControllerTest extends WallabagCoreTestCase $this->logInAs('admin'); $client = $this->getClient(); - $content = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findOneByUser($this->getLoggedInUserId()); + // sharing is enabled + $client->getContainer()->get('craue_config')->set('share_public', 1); + + $content = new Entry($this->getLoggedInUser()); + $content->setUrl($this->url); + $this->getEntityManager()->persist($content); + $this->getEntityManager()->flush(); + $this->getEntityManager()->clear(); // no uid $client->request('GET', '/share/'.$content->getUid()); @@ -970,6 +1017,20 @@ class EntryControllerTest extends WallabagCoreTestCase $url = 'http://www.20minutes.fr/montpellier/1952003-20161030-video-car-tombe-panne-rugbymen-perpignan-improvisent-melee-route'; $client->getContainer()->get('craue_config')->set('download_images_enabled', 1); + $crawler = $client->request('GET', '/new'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $form = $crawler->filter('form[name=entry]')->form(); + + $data = [ + 'entry[url]' => $url, + ]; + + $client->submit($form, $data); + + $this->assertEquals(302, $client->getResponse()->getStatusCode()); + $content = $client->getContainer() ->get('doctrine.orm.entity_manager') ->getRepository('WallabagCoreBundle:Entry') @@ -987,28 +1048,19 @@ class EntryControllerTest extends WallabagCoreTestCase $this->logInAs('empty'); $client = $this->getClient(); - $em = $client->getContainer()->get('doctrine.orm.entity_manager'); - $user = $em - ->getRepository('WallabagUserBundle:User') - ->find($this->getLoggedInUserId()); - - if (!$user) { - $this->markTestSkipped('No user found in db.'); - } - // Redirect to homepage - $config = $user->getConfig(); + $config = $this->getLoggedInUser()->getConfig(); $config->setActionMarkAsRead(Config::REDIRECT_TO_HOMEPAGE); - $em->persist($config); - $em->flush(); + $this->getEntityManager()->persist($config); - $content = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $this->getEntityManager()->persist($entry); - $client->request('GET', '/view/'.$content->getId()); - $client->request('GET', '/archive/'.$content->getId()); + $this->getEntityManager()->flush(); + + $client->request('GET', '/view/'.$entry->getId()); + $client->request('GET', '/archive/'.$entry->getId()); $this->assertEquals(302, $client->getResponse()->getStatusCode()); $this->assertEquals('/', $client->getResponse()->headers->get('location')); @@ -1019,46 +1071,36 @@ class EntryControllerTest extends WallabagCoreTestCase $this->logInAs('empty'); $client = $this->getClient(); - $em = $client->getContainer()->get('doctrine.orm.entity_manager'); - $user = $em - ->getRepository('WallabagUserBundle:User') - ->find($this->getLoggedInUserId()); - - if (!$user) { - $this->markTestSkipped('No user found in db.'); - } - // Redirect to current page - $config = $user->getConfig(); + $config = $this->getLoggedInUser()->getConfig(); $config->setActionMarkAsRead(Config::REDIRECT_TO_CURRENT_PAGE); - $em->persist($config); - $em->flush(); + $this->getEntityManager()->persist($config); - $content = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $this->getEntityManager()->persist($entry); - $client->request('GET', '/view/'.$content->getId()); - $client->request('GET', '/archive/'.$content->getId()); + $this->getEntityManager()->flush(); + + $client->request('GET', '/view/'.$entry->getId()); + $client->request('GET', '/archive/'.$entry->getId()); $this->assertEquals(302, $client->getResponse()->getStatusCode()); - $this->assertContains('/view/'.$content->getId(), $client->getResponse()->headers->get('location')); + $this->assertContains('/view/'.$entry->getId(), $client->getResponse()->headers->get('location')); } public function testFilterOnHttpStatus() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); - $crawler = $client->request('GET', '/new'); - $form = $crawler->filter('form[name=entry]')->form(); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl('http://www.lemonde.fr/incorrect-url/'); + $entry->setHttpStatus(404); + $this->getEntityManager()->persist($entry); - $data = [ - 'entry[url]' => 'http://www.lemonde.fr/incorrect-url/', - ]; - - $client->submit($form, $data); + $this->getEntityManager()->flush(); $crawler = $client->request('GET', '/all/list'); $form = $crawler->filter('button[id=submit-filter]')->form(); @@ -1071,14 +1113,17 @@ class EntryControllerTest extends WallabagCoreTestCase $this->assertCount(1, $crawler->filter('div[class=entry]')); - $crawler = $client->request('GET', '/new'); - $form = $crawler->filter('form[name=entry]')->form(); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $entry->setHttpStatus(200); + $this->getEntityManager()->persist($entry); - $data = [ - 'entry[url]' => 'http://www.nextinpact.com/news/101235-wallabag-alternative-libre-a-pocket-creuse-petit-a-petit-son-nid.htm', - ]; + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl('http://www.nextinpact.com/news/101235-wallabag-alternative-libre-a-pocket-creuse-petit-a-petit-son-nid.htm'); + $entry->setHttpStatus(200); + $this->getEntityManager()->persist($entry); - $client->submit($form, $data); + $this->getEntityManager()->flush(); $crawler = $client->request('GET', '/all/list'); $form = $crawler->filter('button[id=submit-filter]')->form(); @@ -1106,8 +1151,15 @@ class EntryControllerTest extends WallabagCoreTestCase public function testSearch() { $this->logInAs('admin'); + $this->useTheme('baggy'); $client = $this->getClient(); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl($this->url); + $entry->setTitle('test'); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + // Search on unread list $crawler = $client->request('GET', '/unread/list'); @@ -1118,35 +1170,37 @@ class EntryControllerTest extends WallabagCoreTestCase $crawler = $client->submit($form, $data); - $this->assertCount(5, $crawler->filter('div[class=entry]')); + $this->assertCount(4, $crawler->filter('div[class=entry]')); // Search on starred list $crawler = $client->request('GET', '/starred/list'); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl('http://localhost/foo/bar'); + $entry->setTitle('testeur'); + $entry->setStarred(true); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + $form = $crawler->filter('form[name=search]')->form(); $data = [ - 'search_entry[term]' => 'title', + 'search_entry[term]' => 'testeur', ]; $crawler = $client->submit($form, $data); $this->assertCount(1, $crawler->filter('div[class=entry]')); - // Added new article to test on archive list - $crawler = $client->request('GET', '/new'); - $form = $crawler->filter('form[name=entry]')->form(); - $data = [ - 'entry[url]' => $this->url, - ]; - $client->submit($form, $data); - $content = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); - $client->request('GET', '/archive/'.$content->getId()); - $crawler = $client->request('GET', '/archive/list'); + // Added new article to test on archive list + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl('http://0.0.0.0/foo/baz/qux'); + $entry->setTitle('Le manège'); + $entry->setArchived(true); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + $form = $crawler->filter('form[name=search]')->form(); $data = [ 'search_entry[term]' => 'manège', @@ -1155,7 +1209,7 @@ class EntryControllerTest extends WallabagCoreTestCase $crawler = $client->submit($form, $data); $this->assertCount(1, $crawler->filter('div[class=entry]')); - $client->request('GET', '/delete/'.$content->getId()); + $client->request('GET', '/delete/'.$entry->getId()); // test on list of all articles $crawler = $client->request('GET', '/all/list'); @@ -1170,6 +1224,13 @@ class EntryControllerTest extends WallabagCoreTestCase $this->assertCount(0, $crawler->filter('div[class=entry]')); // test url search on list of all articles + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl('http://domain/qux'); + $entry->setTitle('Le manège'); + $entry->setArchived(true); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + $crawler = $client->request('GET', '/all/list'); $form = $crawler->filter('form[name=search]')->form(); diff --git a/tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php b/tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php index 63f2c829a..b38961d39 100644 --- a/tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php @@ -239,7 +239,7 @@ class ExportControllerTest extends WallabagCoreTestCase $this->assertEquals($contentInDB->getLanguage(), $content[0]['language']); $this->assertEquals($contentInDB->getReadingtime(), $content[0]['reading_time']); $this->assertEquals($contentInDB->getDomainname(), $content[0]['domain_name']); - $this->assertEquals(['foo bar', 'baz', 'foot'], $content[0]['tags']); + $this->assertEquals(['foo bar', 'baz'], $content[0]['tags']); } public function testXmlExport() diff --git a/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php index 80611a87c..f9bf7b878 100644 --- a/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php @@ -3,6 +3,7 @@ namespace Tests\Wallabag\CoreBundle\Controller; use Tests\Wallabag\CoreBundle\WallabagCoreTestCase; +use Wallabag\CoreBundle\Entity\Entry; use Wallabag\CoreBundle\Entity\Tag; class TagControllerTest extends WallabagCoreTestCase @@ -24,10 +25,11 @@ class TagControllerTest extends WallabagCoreTestCase $this->logInAs('admin'); $client = $this->getClient(); - $entry = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId('http://0.0.0.0/entry1', $this->getLoggedInUserId()); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl('http://0.0.0.0/foo'); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + $this->getEntityManager()->clear(); $crawler = $client->request('GET', '/view/'.$entry->getId()); @@ -41,23 +43,15 @@ class TagControllerTest extends WallabagCoreTestCase $this->assertEquals(302, $client->getResponse()->getStatusCode()); // be sure to reload the entry - $entry = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId('http://0.0.0.0/entry1', $this->getLoggedInUserId()); - - $this->assertEquals(4, count($entry->getTags())); + $entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId()); + $this->assertCount(1, $entry->getTags()); // tag already exists and already assigned $client->submit($form, $data); $this->assertEquals(302, $client->getResponse()->getStatusCode()); - $newEntry = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->find($entry->getId()); - - $this->assertEquals(4, count($newEntry->getTags())); + $entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId()); + $this->assertCount(1, $entry->getTags()); // tag already exists but still not assigned to this entry $data = [ @@ -67,12 +61,8 @@ class TagControllerTest extends WallabagCoreTestCase $client->submit($form, $data); $this->assertEquals(302, $client->getResponse()->getStatusCode()); - $newEntry = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->find($entry->getId()); - - $this->assertEquals(4, count($newEntry->getTags())); + $entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId()); + $this->assertCount(2, $entry->getTags()); } public function testAddMultipleTagToEntry() @@ -116,15 +106,14 @@ class TagControllerTest extends WallabagCoreTestCase $this->logInAs('admin'); $client = $this->getClient(); - $entry = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId('http://0.0.0.0/entry1', $this->getLoggedInUserId()); - - $tag = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Tag') - ->findOneByEntryAndTagLabel($entry, $this->tagName); + $tag = new Tag(); + $tag->setLabel($this->tagName); + $entry = new Entry($this->getLoggedInUser()); + $entry->setUrl('http://0.0.0.0/foo'); + $entry->addTag($tag); + $this->getEntityManager()->persist($entry); + $this->getEntityManager()->flush(); + $this->getEntityManager()->clear(); // We make a first request to set an history and test redirection after tag deletion $client->request('GET', '/view/'.$entry->getId()); @@ -134,12 +123,8 @@ class TagControllerTest extends WallabagCoreTestCase $this->assertEquals(302, $client->getResponse()->getStatusCode()); $this->assertEquals($entryUri, $client->getResponse()->getTargetUrl()); - // re-retrieve the entry to be sure to get fresh data from database (mostly for tags) - $entry = $client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findByUrlAndUserId('http://0.0.0.0/entry1', $this->getLoggedInUserId()); - + // re-retrieve the entry to be sure to get fresh data from database (mostly for tags) + $entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId()); $this->assertNotContains($this->tagName, $entry->getTags()); $client->request('GET', '/remove-tag/'.$entry->getId().'/'.$tag->getId()); diff --git a/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php b/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php index 7bf4b43ce..eec6939d7 100644 --- a/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php +++ b/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php @@ -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(); @@ -64,6 +111,23 @@ abstract class WallabagCoreTestCase extends WebTestCase $this->client->submit($form, $data); } + /** + * Return the user of the logged in user. + * You should be sure that you called `logInAs` before. + * + * @return User + */ + public function getLoggedInUser() + { + $token = static::$kernel->getContainer()->get('security.token_storage')->getToken(); + + if (null !== $token) { + 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. @@ -72,13 +136,15 @@ abstract class WallabagCoreTestCase extends WebTestCase */ public function getLoggedInUserId() { - $token = static::$kernel->getContainer()->get('security.token_storage')->getToken(); + return $this->getLoggedInUser()->getId(); + } - if (null !== $token) { - return $token->getUser()->getId(); - } - - throw new \RuntimeException('No logged in User.'); + public function useTheme($theme) + { + $config = $this->getEntityManager()->getRepository(Config::class)->findOneByUser($this->getLoggedInUser()); + $config->setTheme($theme); + $this->getEntityManager()->persist($config); + $this->getEntityManager()->flush(); } /** diff --git a/tests/Wallabag/ImportBundle/Command/ImportCommandTest.php b/tests/Wallabag/ImportBundle/Command/ImportCommandTest.php index 7043c3450..f507563cc 100644 --- a/tests/Wallabag/ImportBundle/Command/ImportCommandTest.php +++ b/tests/Wallabag/ImportBundle/Command/ImportCommandTest.php @@ -95,6 +95,7 @@ class ImportCommandTest extends WallabagCoreTestCase 'username' => 1, 'filepath' => $application->getKernel()->getContainer()->getParameter('kernel.root_dir').'/../tests/Wallabag/ImportBundle/fixtures/wallabag-v2-read.json', '--useUserId' => true, + '--importer' => 'v2', ]); } } diff --git a/tests/Wallabag/ImportBundle/Controller/WallabagV2ControllerTest.php b/tests/Wallabag/ImportBundle/Controller/WallabagV2ControllerTest.php index 18a025226..248932591 100644 --- a/tests/Wallabag/ImportBundle/Controller/WallabagV2ControllerTest.php +++ b/tests/Wallabag/ImportBundle/Controller/WallabagV2ControllerTest.php @@ -119,9 +119,10 @@ class WallabagV2ControllerTest extends WallabagCoreTestCase $this->getLoggedInUserId() ); - $this->assertNotEmpty($content->getMimetype(), 'Mimetype for http://www.liberation.fr is ok'); - $this->assertNotEmpty($content->getPreviewPicture(), 'Preview picture for http://www.liberation.fr is ok'); - $this->assertNotEmpty($content->getLanguage(), 'Language for http://www.liberation.fr is ok'); + // empty because it wasn't re-imported + $this->assertEmpty($content->getMimetype(), 'Mimetype for http://www.liberation.fr is empty'); + $this->assertEmpty($content->getPreviewPicture(), 'Preview picture for http://www.liberation.fr is empty'); + $this->assertEmpty($content->getLanguage(), 'Language for http://www.liberation.fr is empty'); $tags = $content->getTags(); $this->assertContains('foot', $tags, 'It includes the "foot" tag');