From 823573cea7565d799c6e9ee879f5c47cb58a3e50 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 10 Apr 2021 10:16:09 +0200 Subject: [PATCH] Updated PersistenceShortUrlRelationResolver to prevent duplicated tags --- .../PersistenceShortUrlRelationResolver.php | 3 +++ ...ersistenceShortUrlRelationResolverTest.php | 24 +++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/module/Core/src/ShortUrl/Resolver/PersistenceShortUrlRelationResolver.php b/module/Core/src/ShortUrl/Resolver/PersistenceShortUrlRelationResolver.php index fd0428bf..1b004a95 100644 --- a/module/Core/src/ShortUrl/Resolver/PersistenceShortUrlRelationResolver.php +++ b/module/Core/src/ShortUrl/Resolver/PersistenceShortUrlRelationResolver.php @@ -11,6 +11,7 @@ use Shlinkio\Shlink\Core\Entity\Domain; use Shlinkio\Shlink\Core\Entity\Tag; use function Functional\map; +use function Functional\unique; class PersistenceShortUrlRelationResolver implements ShortUrlRelationResolverInterface { @@ -42,7 +43,9 @@ class PersistenceShortUrlRelationResolver implements ShortUrlRelationResolverInt return new Collections\ArrayCollection(); } + $tags = unique($tags); $repo = $this->em->getRepository(Tag::class); + return new Collections\ArrayCollection(map($tags, function (string $tagName) use ($repo): Tag { $tag = $repo->findOneBy(['name' => $tagName]) ?? new Tag($tagName); $this->em->persist($tag); diff --git a/module/Core/test/ShortUrl/Resolver/PersistenceShortUrlRelationResolverTest.php b/module/Core/test/ShortUrl/Resolver/PersistenceShortUrlRelationResolverTest.php index 463ee1ef..187ccbe6 100644 --- a/module/Core/test/ShortUrl/Resolver/PersistenceShortUrlRelationResolverTest.php +++ b/module/Core/test/ShortUrl/Resolver/PersistenceShortUrlRelationResolverTest.php @@ -14,6 +14,7 @@ use Shlinkio\Shlink\Core\Entity\Domain; use Shlinkio\Shlink\Core\Entity\Tag; use Shlinkio\Shlink\Core\Repository\TagRepositoryInterface; use Shlinkio\Shlink\Core\ShortUrl\Resolver\PersistenceShortUrlRelationResolver; +use function count; class PersistenceShortUrlRelationResolverTest extends TestCase { @@ -66,10 +67,13 @@ class PersistenceShortUrlRelationResolverTest extends TestCase yield 'found domain' => [new Domain($authority), $authority]; } - /** @test */ - public function findsAndPersistsTagsWrappedIntoCollection(): void + /** + * @test + * @dataProvider provideTags + */ + public function findsAndPersistsTagsWrappedIntoCollection(array $tags, array $expectedTags): void { - $tags = ['foo', 'bar', 'baz']; + $expectedPersistedTags = count($expectedTags); $tagRepo = $this->prophesize(TagRepositoryInterface::class); $findTag = $tagRepo->findOneBy(Argument::type('array'))->will(function (array $args): ?Tag { @@ -81,11 +85,17 @@ class PersistenceShortUrlRelationResolverTest extends TestCase $result = $this->resolver->resolveTags($tags); - self::assertCount(3, $result); - self::assertEquals([new Tag('foo'), new Tag('bar'), new Tag('baz')], $result->toArray()); - $findTag->shouldHaveBeenCalledTimes(3); + self::assertCount($expectedPersistedTags, $result); + self::assertEquals($expectedTags, $result->toArray()); + $findTag->shouldHaveBeenCalledTimes($expectedPersistedTags); $getRepo->shouldHaveBeenCalledOnce(); - $persist->shouldHaveBeenCalledTimes(3); + $persist->shouldHaveBeenCalledTimes($expectedPersistedTags); + } + + public function provideTags(): iterable + { + yield 'no duplicated tags' => [['foo', 'bar', 'baz'], [new Tag('foo'), new Tag('bar'), new Tag('baz')]]; + yield 'duplicated tags' => [['foo', 'bar', 'bar'], [new Tag('foo'), new Tag('bar')]]; } /** @test */