diff options
author | Jeremy Benoist <jeremy.benoist@gmail.com> | 2015-12-27 22:26:49 +0100 |
---|---|---|
committer | Jeremy Benoist <jeremy.benoist@gmail.com> | 2015-12-28 13:20:48 +0100 |
commit | fc031e5706acf89ff21f22ca8004ddc7f9b43089 (patch) | |
tree | 845fd4f69308dc11ca6c54cc9ed4be62cb4f471c /src | |
parent | 82899c040258896bff540080602e93aa49a71ae8 (diff) | |
download | wallabag-fc031e5706acf89ff21f22ca8004ddc7f9b43089.tar.gz wallabag-fc031e5706acf89ff21f22ca8004ddc7f9b43089.tar.zst wallabag-fc031e5706acf89ff21f22ca8004ddc7f9b43089.zip |
Avoid multiple tag creation
When a new tag is created but not yet persisted, it can be duplicated.
It could happen when multiple rules match the content and at least 2 of them should attach same new tag.
Fix #1528
Diffstat (limited to 'src')
3 files changed, 69 insertions, 0 deletions
diff --git a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php new file mode 100644 index 00000000..09a08bb2 --- /dev/null +++ b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php | |||
@@ -0,0 +1,41 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\DataFixtures\ORM; | ||
4 | |||
5 | use Doctrine\Common\DataFixtures\AbstractFixture; | ||
6 | use Doctrine\Common\DataFixtures\OrderedFixtureInterface; | ||
7 | use Doctrine\Common\Persistence\ObjectManager; | ||
8 | use Wallabag\CoreBundle\Entity\TaggingRule; | ||
9 | |||
10 | class LoadTaggingRuleData extends AbstractFixture implements OrderedFixtureInterface | ||
11 | { | ||
12 | /** | ||
13 | * {@inheritdoc} | ||
14 | */ | ||
15 | public function load(ObjectManager $manager) | ||
16 | { | ||
17 | $tr1 = new TaggingRule(); | ||
18 | $tr1->setRule('content matches "spurs"'); | ||
19 | $tr1->setTags(array('sport')); | ||
20 | $tr1->setConfig($this->getReference('admin-config')); | ||
21 | |||
22 | $manager->persist($tr1); | ||
23 | |||
24 | $tr2 = new TaggingRule(); | ||
25 | $tr2->setRule('content matches "basket"'); | ||
26 | $tr2->setTags(array('sport')); | ||
27 | $tr2->setConfig($this->getReference('admin-config')); | ||
28 | |||
29 | $manager->persist($tr2); | ||
30 | |||
31 | $manager->flush(); | ||
32 | } | ||
33 | |||
34 | /** | ||
35 | * {@inheritdoc} | ||
36 | */ | ||
37 | public function getOrder() | ||
38 | { | ||
39 | return 40; | ||
40 | } | ||
41 | } | ||
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php index 608ed2f0..2813c944 100644 --- a/src/Wallabag/CoreBundle/Entity/Entry.php +++ b/src/Wallabag/CoreBundle/Entity/Entry.php | |||
@@ -462,6 +462,14 @@ class Entry | |||
462 | return; | 462 | return; |
463 | } | 463 | } |
464 | 464 | ||
465 | // check if tag already exist but has not yet be persisted | ||
466 | // it seems that the previous condition with `contains()` doesn't check that case | ||
467 | foreach ($this->tags as $existingTag) { | ||
468 | if ($existingTag->getUser() !== $tag->getUser() || $existingTag->getLabel() === $tag->getLabel()) { | ||
469 | return; | ||
470 | } | ||
471 | } | ||
472 | |||
465 | $this->tags[] = $tag; | 473 | $this->tags[] = $tag; |
466 | $tag->addEntry($this); | 474 | $tag->addEntry($this); |
467 | } | 475 | } |
diff --git a/src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php b/src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php index 37e137bf..70951d46 100644 --- a/src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php +++ b/src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php | |||
@@ -121,6 +121,26 @@ class RuleBasedTaggerTest extends \PHPUnit_Framework_TestCase | |||
121 | $this->assertSame($tag, $tags[0]); | 121 | $this->assertSame($tag, $tags[0]); |
122 | } | 122 | } |
123 | 123 | ||
124 | public function testSameTagWithDifferentfMatchingRules() | ||
125 | { | ||
126 | $taggingRule = $this->getTaggingRule('bla bla', array('hey')); | ||
127 | $otherTaggingRule = $this->getTaggingRule('rule as string', array('hey')); | ||
128 | |||
129 | $user = $this->getUser([$taggingRule, $otherTaggingRule]); | ||
130 | $entry = new Entry($user); | ||
131 | |||
132 | $this->rulerz | ||
133 | ->method('satisfies') | ||
134 | ->willReturn(true); | ||
135 | |||
136 | $this->tagger->tag($entry); | ||
137 | |||
138 | $this->assertFalse($entry->getTags()->isEmpty()); | ||
139 | |||
140 | $tags = $entry->getTags(); | ||
141 | $this->assertCount(1, $tags); | ||
142 | } | ||
143 | |||
124 | private function getUser(array $taggingRules = []) | 144 | private function getUser(array $taggingRules = []) |
125 | { | 145 | { |
126 | $user = new User(); | 146 | $user = new User(); |