]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
TagController: support merging labels when renaming one with label of another 4310/head
authorKevin Decherf <kevin@kdecherf.com>
Wed, 15 Apr 2020 20:41:03 +0000 (22:41 +0200)
committerKevin Decherf <kevin@kdecherf.com>
Sat, 18 Apr 2020 16:12:33 +0000 (18:12 +0200)
Signed-off-by: Kevin Decherf <kevin@kdecherf.com>
src/Wallabag/CoreBundle/Controller/TagController.php
tests/Wallabag/CoreBundle/Controller/TagControllerTest.php

index f7b78f5d3bea3354726ccc5ad3fc491f7dd764db..16ded948eedc8db07f06355f34c96507f9888409 100644 (file)
@@ -151,13 +151,21 @@ class TagController extends Controller
         $form = $this->createForm(RenameTagType::class, new Tag());
         $form->handleRequest($request);
 
-        if ($form->isSubmitted()
-            && $form->isValid()
-            && $form->get('label')->getData() !== $tag->getLabel()
-           ) {
-            $newTagLabel = $form->get('label')->getData();
+        $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'), '', true);
+
+        if ($form->isSubmitted() && $form->isValid()) {
             $newTag = new Tag();
-            $newTag->setLabel($newTagLabel);
+            $newTag->setLabel($form->get('label')->getData());
+
+            if ($newTag->getLabel() === $tag->getLabel()) {
+                return $this->redirect($redirectUrl);
+            }
+
+            $tagFromRepo = $this->get('wallabag_core.tag_repository')->findOneByLabel($newTag->getLabel());
+
+            if (null !== $tagFromRepo) {
+                $newTag = $tagFromRepo;
+            }
 
             $entries = $this->get('wallabag_core.entry_repository')->findAllByTagId(
                 $this->getUser()->getId(),
@@ -166,14 +174,13 @@ class TagController extends Controller
             foreach ($entries as $entry) {
                 $this->get('wallabag_core.tags_assigner')->assignTagsToEntry(
                     $entry,
-                    $newTagLabel,
+                    $newTag->getLabel(),
                     [$newTag]
                 );
                 $entry->removeTag($tag);
             }
 
-            $em = $this->getDoctrine()->getManager();
-            $em->flush();
+            $this->getDoctrine()->getManager()->flush();
 
             $this->get('session')->getFlashBag()->add(
                 'notice',
@@ -181,8 +188,6 @@ class TagController extends Controller
             );
         }
 
-        $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'), '', true);
-
         return $this->redirect($redirectUrl);
     }
 }
index 80903b950b527618731a60cd717783d15bd549d7..fb0666324cada6cc9816b6c538afa6b799dc6fa9 100644 (file)
@@ -304,6 +304,133 @@ class TagControllerTest extends WallabagCoreTestCase
         $this->assertTrue($newTag[0]->hasEntry($freshEntry), 'Tag is still assigned to the entry.');
     }
 
+    public function testRenameTagWithSameLabelDifferentCase()
+    {
+        $tagLabel = 'same label';
+        $newTagLabel = 'saMe labEl';
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $tag = new Tag();
+        $tag->setLabel($tagLabel);
+
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://0.0.0.0/foobar');
+        $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
+        $crawler = $client->request('GET', '/tag/list');
+        $form = $crawler->filter('#tag-' . $tag->getId() . ' form')->form();
+
+        $data = [
+            'tag[label]' => $newTagLabel,
+        ];
+
+        $client->submit($form, $data);
+        $this->assertSame(302, $client->getResponse()->getStatusCode());
+        $this->assertNotContains('flashes.tag.notice.tag_renamed', $crawler->filter('body')->extract(['_text'])[0]);
+
+        $freshEntry = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->find($entry->getId());
+
+        $tags = [];
+
+        $tagsFromEntry = $freshEntry->getTags()->toArray();
+        foreach ($tagsFromEntry as $key => $item) {
+            $tags[$key] = $item->getLabel();
+        }
+
+        $this->assertFalse(array_search($newTagLabel, $tags, true));
+
+        $tagFromRepo = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Tag')
+            ->findByLabel($tagLabel);
+
+        $newTagFromRepo = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Tag')
+            ->findByLabel($newTagLabel);
+
+        $this->assertCount(0, $newTagFromRepo);
+        $this->assertCount(1, $tagFromRepo);
+
+        $this->assertSame($tag->getId(), $tagFromRepo[0]->getId(), 'Tag is unchanged.');
+
+        $this->assertTrue($tagFromRepo[0]->hasEntry($freshEntry), 'Tag is still assigned to the entry.');
+    }
+
+    public function testRenameTagWithExistingLabel()
+    {
+        $tagLabel = 'existing label';
+        $previousTagLabel = 'previous label';
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $tag = new Tag();
+        $tag->setLabel($tagLabel);
+
+        $previousTag = new Tag();
+        $previousTag->setLabel($previousTagLabel);
+
+        $entry1 = new Entry($this->getLoggedInUser());
+        $entry1->setUrl('http://0.0.0.0/foobar');
+        $entry1->addTag($previousTag);
+        $this->getEntityManager()->persist($entry1);
+
+        $entry2 = new Entry($this->getLoggedInUser());
+        $entry2->setUrl('http://0.0.0.0/baz');
+        $entry2->addTag($tag);
+        $this->getEntityManager()->persist($entry2);
+
+        $this->getEntityManager()->flush();
+        $this->getEntityManager()->clear();
+
+        // We make a first request to set an history and test redirection after tag deletion
+        $crawler = $client->request('GET', '/tag/list');
+        $form = $crawler->filter('#tag-' . $previousTag->getId() . ' form')->form();
+
+        $data = [
+            'tag[label]' => $tagLabel,
+        ];
+
+        $client->submit($form, $data);
+        $this->assertSame(302, $client->getResponse()->getStatusCode());
+        $this->assertNotContains('flashes.tag.notice.tag_renamed', $crawler->filter('body')->extract(['_text'])[0]);
+
+        $freshEntry1 = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->find($entry1->getId());
+
+        $freshEntry2 = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->find($entry2->getId());
+
+        $tagFromRepo = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Tag')
+            ->findByLabel($tagLabel);
+
+        $previousTagFromRepo = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Tag')
+            ->findByLabel($previousTagLabel);
+
+        $this->assertCount(1, $tagFromRepo);
+
+        $this->assertTrue($tagFromRepo[0]->hasEntry($freshEntry1));
+        $this->assertTrue($tagFromRepo[0]->hasEntry($freshEntry2), 'Tag is assigned to the entry.');
+        $this->assertFalse($previousTagFromRepo[0]->hasEntry($freshEntry1));
+    }
+
     public function testAddUnicodeTagLabel()
     {
         $this->logInAs('admin');