]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
If reload content failed, don’t update it
authorJeremy Benoist <jeremy.benoist@gmail.com>
Thu, 20 Oct 2016 20:49:46 +0000 (22:49 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Thu, 20 Oct 2016 20:49:46 +0000 (22:49 +0200)
In case user wants a fresh version of the current one and the website isn’t available, don’t erase it with a boring message saying wallabag wasn’t able to refresh the content.

app/config/config.yml
src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/DependencyInjection/Configuration.php
src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php
src/Wallabag/CoreBundle/Resources/config/services.yml
tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php

index 5127c8cf73789f3d75d17d779cacf466a2df4fbd..a56cbdd9e01d2afab2947e3273cd62831991bdda 100644 (file)
@@ -50,6 +50,7 @@ wallabag_core:
     rss_limit: 50
     reading_speed: 1
     cache_lifetime: 10
+    fetching_error_message: "wallabag can't retrieve contents for this article. Please report this issue to us."
 
 wallabag_user:
     registration_enabled: "%fosuser_registration%"
index 3b28e635025253a8a7baa1c4eb6ff6c12600aba4..97bb3d12fa3b07afc7ef8a4620e1ae512d946151 100644 (file)
@@ -330,6 +330,15 @@ class EntryController extends Controller
 
         $this->updateEntry($entry, 'entry_reloaded');
 
+        // if refreshing entry failed, don't save it
+        if ($this->getParameter('wallabag_core.fetching_error_message') === $entry->getContent()) {
+            $bag = $this->get('session')->getFlashBag();
+            $bag->clear();
+            $bag->add('notice', 'flashes.entry.notice.entry_reloaded_failed');
+
+            return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()]));
+        }
+
         $em = $this->getDoctrine()->getManager();
         $em->persist($entry);
         $em->flush();
index d8141eea993ffbb277bf0954407ddeb2d774466e..3a3da0246f2d5869537a4b620fcb80782bcee99d 100644 (file)
@@ -39,6 +39,8 @@ class Configuration implements ConfigurationInterface
                 ->integerNode('cache_lifetime')
                     ->defaultValue(10)
                 ->end()
+                ->scalarNode('fetching_error_message')
+                ->end()
             ->end()
         ;
 
index 0cbde908d0f205f8a2f6e798316c18837866289e..b4992d545066506cf4824d0357977f6dfc08ac2b 100644 (file)
@@ -23,6 +23,7 @@ class WallabagCoreExtension extends Extension
         $container->setParameter('wallabag_core.version', $config['version']);
         $container->setParameter('wallabag_core.paypal_url', $config['paypal_url']);
         $container->setParameter('wallabag_core.cache_lifetime', $config['cache_lifetime']);
+        $container->setParameter('wallabag_core.fetching_error_message', $config['fetching_error_message']);
 
         $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
         $loader->load('services.yml');
index a4b727f42b57d21ef4b3a9eedc881370ecca8cef..614488a64fd92596243a19ba5bea04d81c989c1a 100644 (file)
@@ -40,7 +40,7 @@ services:
         class: Graby\Graby
         arguments:
             -
-                error_message: "wallabag can't retrieve contents for this article. Please report this issue to us."
+                error_message: '%wallabag_core.fetching_error_message%'
                 http_client:
                     user_agents:
                         'lifehacker.com': 'PHP/5.2'
index 9b03a5193d1c7b8edb6d660f0cb021336061f663..c742c62043c6ef61162154ab7c50dc13f07da59a 100644 (file)
@@ -359,11 +359,51 @@ class EntryControllerTest extends WallabagCoreTestCase
 
         $content = $em
             ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
+            ->find($content->getId());
 
         $this->assertNotEmpty($content->getContent());
     }
 
+    /**
+     * @depends testPostNewOk
+     *
+     * This test will require an internet connection.
+     */
+    public function testReloadWithFetchingFailed()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $em = $client->getContainer()
+            ->get('doctrine.orm.entity_manager');
+
+        $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());
+
+        $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
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->find($content->getId());
+
+        $newContent->setUrl($this->url);
+        $em->persist($newContent);
+        $em->flush();
+
+        $this->assertNotEquals($client->getContainer()->getParameter('wallabag_core.fetching_error_message'), $newContent->getContent());
+    }
+
     public function testEdit()
     {
         $this->logInAs('admin');