When the association between a tag and an entry is removed, if the tag doesn’t have other entries, we can remove it.
Also add more tests for that part and ensure TagControllerTest is isolated from the rest of the test suite (finally!)
->getRepository('WallabagCoreBundle:Entry')
->removeTag($this->getUser()->getId(), $tag);
+ $this->cleanOrphanTag($tag);
+
$json = $this->get('serializer')->serialize($tag, 'json');
return (new JsonResponse())->setJson($json);
->getRepository('WallabagCoreBundle:Entry')
->removeTags($this->getUser()->getId(), $tags);
+ $this->cleanOrphanTag($tags);
+
$json = $this->get('serializer')->serialize($tags, 'json');
return (new JsonResponse())->setJson($json);
->getRepository('WallabagCoreBundle:Entry')
->removeTag($this->getUser()->getId(), $tag);
+ $this->cleanOrphanTag($tag);
+
$json = $this->get('serializer')->serialize($tag, 'json');
return (new JsonResponse())->setJson($json);
return (new JsonResponse())->setJson($json);
}
+ /**
+ * Remove orphan tag in case no entries are associated to it.
+ *
+ * @param Tag|array $tags
+ */
+ private function cleanOrphanTag($tags)
+ {
+ if (!is_array($tags)) {
+ $tags = [$tags];
+ }
+
+ $em = $this->getDoctrine()->getManager();
+
+ foreach ($tags as $tag) {
+ if (count($tag->getEntries()) === 0) {
+ $em->remove($tag);
+ }
+ }
+
+ $em->flush();
+ }
+
/**
* Validate that the first id is equal to the second one.
* If not, throw exception. It means a user try to access information from an other user.
$entry->removeTag($tag);
$em = $this->getDoctrine()->getManager();
$em->flush();
- if (count($tag->getEntries()) == 0) {
+
+ // remove orphan tag in case no entries are associated to it
+ if (count($tag->getEntries()) === 0) {
$em->remove($tag);
+ $em->flush();
}
- $em->flush();
$redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'));
arguments:
- "@doctrine"
- wallabag_core.table_prefix_subscriber:
+ wallabag_core.subscriber.table_prefix:
class: Wallabag\CoreBundle\Subscriber\TablePrefixSubscriber
arguments:
- "%database_table_prefix%"
*/
public function testDeleteUserTag($tag)
{
+ $tagName = $tag['label'];
+
$this->client->request('DELETE', '/api/tags/'.$tag['id'].'.json');
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
->findAllByTagId($this->user->getId(), $tag['id']);
$this->assertCount(0, $entries);
+
+ $tag = $this->client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Tag')
+ ->findOneByLabel($tagName);
+
+ $this->assertNull($tag, $tagName.' was removed because it begun an orphan tag');
}
public function testDeleteTagByLabel()
$this->logInAs('admin');
$client = $this->getClient();
- $content = $client->getContainer()
- ->get('doctrine.orm.entity_manager')
+ $em = $client->getContainer()
+ ->get('doctrine.orm.entity_manager');
+
+ $content = $em
->getRepository('WallabagCoreBundle:Entry')
->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
// empty content
$content->setContent('');
- $client->getContainer()->get('doctrine.orm.entity_manager')->persist($content);
- $client->getContainer()->get('doctrine.orm.entity_manager')->flush();
+ $em->persist($content);
+ $em->flush();
$client->request('GET', '/reload/'.$content->getId());
$this->assertEquals(302, $client->getResponse()->getStatusCode());
- $content = $client->getContainer()
- ->get('doctrine.orm.entity_manager')
+ $content = $em
->getRepository('WallabagCoreBundle:Entry')
->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
$this->logInAs('admin');
$client = $this->getClient();
+ $em = $client->getContainer()
+ ->get('doctrine.orm.entity_manager');
+
// add a new content to be removed later
- $user = $client->getContainer()
- ->get('doctrine.orm.entity_manager')
+ $user = $em
->getRepository('WallabagUserBundle:User')
->findOneByUserName('admin');
$content->setArchived(true);
$content->setLanguage('fr');
- $client->getContainer()
- ->get('doctrine.orm.entity_manager')
- ->persist($content);
- $client->getContainer()
- ->get('doctrine.orm.entity_manager')
- ->flush();
+ $em->persist($content);
+ $em->flush();
$client->request('GET', '/view/'.$content->getId());
$this->assertEquals(200, $client->getResponse()->getStatusCode());
namespace Tests\Wallabag\CoreBundle\Controller;
use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
+use Wallabag\CoreBundle\Entity\Tag;
class TagControllerTest extends WallabagCoreTestCase
{
$client->request('GET', '/remove-tag/'.$entry->getId().'/'.$tag->getId());
$this->assertEquals(404, $client->getResponse()->getStatusCode());
+
+ $tag = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Tag')
+ ->findOneByLabel($this->tagName);
+
+ $this->assertNull($tag, $this->tagName.' was removed because it begun an orphan tag');
}
public function testShowEntriesForTagAction()
{
$this->logInAs('admin');
$client = $this->getClient();
+ $em = $client->getContainer()
+ ->get('doctrine.orm.entity_manager');
+
+ $tag = new Tag();
+ $tag->setLabel($this->tagName);
$entry = $client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->findByUrlAndUserId('http://0.0.0.0/entry4', $this->getLoggedInUserId());
- $tag = $client->getContainer()
- ->get('doctrine.orm.entity_manager')
- ->getRepository('WallabagCoreBundle:Tag')
- ->findOneByEntryAndTagLabel($entry, 'foo');
-
- $crawler = $client->request('GET', '/tag/list/'.$tag->getSlug());
+ $tag->addEntry($entry);
- $this->assertEquals(200, $client->getResponse()->getStatusCode());
- $this->assertCount(2, $crawler->filter('div[class=entry]'));
+ $em->persist($entry);
+ $em->persist($tag);
+ $em->flush();
$tag = $client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Tag')
- ->findOneByLabel('baz');
+ ->findOneByEntryAndTagLabel($entry, $this->tagName);
$crawler = $client->request('GET', '/tag/list/'.$tag->getSlug());
$this->assertEquals(200, $client->getResponse()->getStatusCode());
- $this->assertCount(1, $crawler->filter('div[class=entry]'));
+ $this->assertCount(1, $crawler->filter('[id*="entry-"]'));
+
+ $entry->removeTag($tag);
+ $em->remove($tag);
+ $em->flush();
}
}