]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Don't redirect to the content page after deletion 1540/head
authorJeremy Benoist <jeremy.benoist@gmail.com>
Sun, 27 Dec 2015 20:28:48 +0000 (21:28 +0100)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Mon, 28 Dec 2015 12:42:50 +0000 (13:42 +0100)
Fix #1512

We generate the url of the removed content and compare it to the referer url. If they matche, we redirect user to the homepage otherwise to the referer url.

src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php

index 6769799b7f35e2f6693311fac517d4e4f1d723bd..2f3fd6a9348ab6ec26c0ae1b301de95610e3778b 100644 (file)
@@ -5,6 +5,7 @@ namespace Wallabag\CoreBundle\Controller;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\CoreBundle\Form\Type\NewEntryType;
 use Wallabag\CoreBundle\Form\Type\EditEntryType;
@@ -316,7 +317,7 @@ class EntryController extends Controller
     }
 
     /**
-     * Deletes entry and redirect to the homepage.
+     * Deletes entry and redirect to the homepage or the last viewed page.
      *
      * @param Entry $entry
      *
@@ -328,6 +329,14 @@ class EntryController extends Controller
     {
         $this->checkUserAction($entry);
 
+        // generates the view url for this entry to check for redirection later
+        // to avoid redirecting to the deleted entry. Ugh.
+        $url = $this->generateUrl(
+            'view',
+            array('id' => $entry->getId()),
+            UrlGeneratorInterface::ABSOLUTE_URL
+        );
+
         $em = $this->getDoctrine()->getManager();
         $em->remove($entry);
         $em->flush();
@@ -337,7 +346,8 @@ class EntryController extends Controller
             'Entry deleted'
         );
 
-        return $this->redirect($request->headers->get('referer'));
+        // don't redirect user to the deleted entry
+        return $this->redirect($url !== $request->headers->get('referer') ?: $this->generateUrl('homepage'));
     }
 
     /**
index af62aee8d85f80fd2d1018a858cc14677583bf5e..9f585d85d722ecf13c89a5d6a287cccd9c0acbca 100644 (file)
@@ -3,6 +3,7 @@
 namespace Wallabag\CoreBundle\Tests\Controller;
 
 use Wallabag\CoreBundle\Tests\WallabagCoreTestCase;
+use Wallabag\CoreBundle\Entity\Entry;
 
 class EntryControllerTest extends WallabagCoreTestCase
 {
@@ -290,6 +291,51 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->assertEquals(404, $client->getResponse()->getStatusCode());
     }
 
+    /**
+     * It will create a new entry.
+     * Browse to it.
+     * Then remove it.
+     *
+     * And it'll check that user won't be redirected to the view page of the content when it had been removed
+     */
+    public function testViewAndDelete()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        // add a new content to be removed later
+        $user = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagUserBundle:User')
+            ->findOneByUserName('admin');
+
+        $content = new Entry($user);
+        $content->setUrl('http://1.1.1.1/entry');
+        $content->setReadingTime(12);
+        $content->setDomainName('domain.io');
+        $content->setMimetype('text/html');
+        $content->setTitle('test title entry');
+        $content->setContent('This is my content /o/');
+        $content->setArchived(true);
+        $content->setLanguage('fr');
+
+        $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->persist($content);
+        $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->flush();
+
+        $client->request('GET', '/view/'.$content->getId());
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+        $client->request('GET', '/delete/'.$content->getId());
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+
+        $client->followRedirect();
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+    }
+
     public function testViewOtherUserEntry()
     {
         $this->logInAs('admin');