]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
TagController: fix duplicated tags when renaming them
authorKevin Decherf <kevin@kdecherf.com>
Sat, 4 Apr 2020 19:03:22 +0000 (21:03 +0200)
committerKevin Decherf <kevin@kdecherf.com>
Sat, 18 Apr 2020 16:09:07 +0000 (18:09 +0200)
The fix relies on a workaround available on TagsAssigner, see the
AssignTagsToEntry() signature for detail.

I replaced the findOneByLabel in the corresponding test to assert that
there is no duplicate.

Fixes #4216

Signed-off-by: Kevin Decherf <kevin@kdecherf.com>
src/Wallabag/CoreBundle/Controller/TagController.php
tests/Wallabag/CoreBundle/Controller/TagControllerTest.php

index a6ad131ff569a3dd431cbd226d60d0a90648bc83..c228c27a9f8c1018bdbef3f3c03e190d1154ce8e 100644 (file)
@@ -152,6 +152,10 @@ class TagController extends Controller
         $form->handleRequest($request);
 
         if ($form->isSubmitted() && $form->isValid()) {
+            $newTagLabel = $form->get('label')->getData();
+            $newTag = new Tag();
+            $newTag->setLabel($newTagLabel);
+
             $entries = $this->get('wallabag_core.entry_repository')->findAllByTagId(
                 $this->getUser()->getId(),
                 $tag->getId()
@@ -159,7 +163,8 @@ class TagController extends Controller
             foreach ($entries as $entry) {
                 $this->get('wallabag_core.tags_assigner')->assignTagsToEntry(
                     $entry,
-                    $form->get('label')->getData()
+                    $newTagLabel,
+                    [$newTag]
                 );
                 $entry->removeTag($tag);
             }
index 47c83a7ba922582a8cef770f60cc1e155ec5f9a0..20e60c324197de90c913437c3444e4844d95260c 100644 (file)
@@ -179,15 +179,24 @@ class TagControllerTest extends WallabagCoreTestCase
 
     public function testRenameTagUsingTheFormInsideTagList()
     {
+        $newTagLabel = 'rename label';
+
         $this->logInAs('admin');
         $client = $this->getClient();
 
         $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);
+
+        $entry2 = new Entry($this->getLoggedInUser());
+        $entry2->setUrl('http://0.0.0.0/bar');
+        $entry2->addTag($tag);
+        $this->getEntityManager()->persist($entry);
+
         $this->getEntityManager()->flush();
         $this->getEntityManager()->clear();
 
@@ -196,7 +205,7 @@ class TagControllerTest extends WallabagCoreTestCase
         $form = $crawler->filter('#tag-' . $tag->getId() . ' form')->form();
 
         $data = [
-            'tag[label]' => 'specific label',
+            'tag[label]' => $newTagLabel,
         ];
 
         $client->submit($form, $data);
@@ -207,19 +216,34 @@ class TagControllerTest extends WallabagCoreTestCase
             ->getRepository('WallabagCoreBundle:Entry')
             ->find($entry->getId());
 
-        $tags = $freshEntry->getTags()->toArray();
-        foreach ($tags as $key => $item) {
+        $freshEntry2 = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->find($entry2->getId());
+
+        $tags = [];
+
+        $tagsFromEntry = $freshEntry->getTags()->toArray();
+        foreach ($tagsFromEntry as $key => $item) {
             $tags[$key] = $item->getLabel();
         }
 
-        $this->assertFalse(array_search($tag->getLabel(), $tags, true), 'Previous tag is not attach to entry anymore.');
+        $tagsFromEntry2 = $freshEntry2->getTags()->toArray();
+        foreach ($tagsFromEntry2 as $key => $item) {
+            $tags[$key] = $item->getLabel();
+        }
+
+        $this->assertFalse(array_search($tag->getLabel(), $tags, true), 'Previous tag is not attach to entries anymore.');
 
         $newTag = $client->getContainer()
             ->get('doctrine.orm.entity_manager')
             ->getRepository('WallabagCoreBundle:Tag')
-            ->findOneByLabel('specific label');
-        $this->assertInstanceOf(Tag::class, $newTag, 'Tag "specific label" exists.');
-        $this->assertTrue($newTag->hasEntry($freshEntry), 'Tag "specific label" is assigned to the entry.');
+            ->findByLabel($newTagLabel);
+
+        $this->assertCount(1, $newTag, 'New tag exists.');
+
+        $this->assertTrue($newTag[0]->hasEntry($freshEntry), 'New tag is assigned to the entry.');
+        $this->assertTrue($newTag[0]->hasEntry($freshEntry2), 'New tag is assigned to the entry2.');
     }
 
     public function testAddUnicodeTagLabel()