Simplified TagRepository test for tags info list, making it more predictable

This commit is contained in:
Alejandro Celaya 2022-01-21 22:04:53 +01:00
parent 361e864415
commit 6b409b06cc

View File

@ -13,7 +13,6 @@ use Shlinkio\Shlink\Core\Model\ShortUrlMeta;
use Shlinkio\Shlink\Core\Model\Visitor; use Shlinkio\Shlink\Core\Model\Visitor;
use Shlinkio\Shlink\Core\Repository\TagRepository; use Shlinkio\Shlink\Core\Repository\TagRepository;
use Shlinkio\Shlink\Core\ShortUrl\Resolver\PersistenceShortUrlRelationResolver; use Shlinkio\Shlink\Core\ShortUrl\Resolver\PersistenceShortUrlRelationResolver;
use Shlinkio\Shlink\Core\Tag\Model\TagInfo;
use Shlinkio\Shlink\Core\Tag\Model\TagsListFiltering; use Shlinkio\Shlink\Core\Tag\Model\TagsListFiltering;
use Shlinkio\Shlink\Rest\ApiKey\Model\ApiKeyMeta; use Shlinkio\Shlink\Rest\ApiKey\Model\ApiKeyMeta;
use Shlinkio\Shlink\Rest\ApiKey\Model\RoleDefinition; use Shlinkio\Shlink\Rest\ApiKey\Model\RoleDefinition;
@ -21,6 +20,7 @@ use Shlinkio\Shlink\Rest\Entity\ApiKey;
use Shlinkio\Shlink\TestUtils\DbTest\DatabaseTestCase; use Shlinkio\Shlink\TestUtils\DbTest\DatabaseTestCase;
use function array_chunk; use function array_chunk;
use function count;
class TagRepositoryTest extends DatabaseTestCase class TagRepositoryTest extends DatabaseTestCase
{ {
@ -57,7 +57,7 @@ class TagRepositoryTest extends DatabaseTestCase
* @test * @test
* @dataProvider provideFilters * @dataProvider provideFilters
*/ */
public function properTagsInfoIsReturned(?TagsListFiltering $filtering, callable $asserts): void public function properTagsInfoIsReturned(?TagsListFiltering $filtering, array $expectedList): void
{ {
$names = ['foo', 'bar', 'baz', 'another']; $names = ['foo', 'bar', 'baz', 'another'];
foreach ($names as $name) { foreach ($names as $name) {
@ -92,231 +92,114 @@ class TagRepositoryTest extends DatabaseTestCase
ShortUrl::fromMeta($metaWithTags(['bar'], null), $this->relationResolver), ShortUrl::fromMeta($metaWithTags(['bar'], null), $this->relationResolver),
); );
$this->getEntityManager()->persist( $this->getEntityManager()->persist(
ShortUrl::fromMeta($metaWithTags(['bar'], null), $this->relationResolver), ShortUrl::fromMeta($metaWithTags(['bar'], $apiKey), $this->relationResolver),
); );
$this->getEntityManager()->flush(); $this->getEntityManager()->flush();
$result = $this->repo->findTagsWithInfo($filtering); $result = $this->repo->findTagsWithInfo($filtering);
$asserts($result, $names); self::assertCount(count($expectedList), $result);
foreach ($expectedList as $index => [$tag, $shortUrlsCount, $visitsCount]) {
self::assertEquals($shortUrlsCount, $result[$index]->shortUrlsCount());
self::assertEquals($visitsCount, $result[$index]->visitsCount());
self::assertEquals($tag, $result[$index]->tag()->__toString());
}
} }
public function provideFilters(): iterable public function provideFilters(): iterable
{ {
$defaultAsserts = static function (array $result, array $tagNames): void { $defaultList = [
/** @var TagInfo[] $result */ ['another', 0, 0],
self::assertCount(4, $result); ['bar', 3, 3],
self::assertEquals(0, $result[0]->shortUrlsCount()); ['baz', 1, 3],
self::assertEquals(0, $result[0]->visitsCount()); ['foo', 2, 4],
self::assertEquals($tagNames[3], $result[0]->tag()->__toString());
self::assertEquals(3, $result[1]->shortUrlsCount());
self::assertEquals(3, $result[1]->visitsCount());
self::assertEquals($tagNames[1], $result[1]->tag()->__toString());
self::assertEquals(1, $result[2]->shortUrlsCount());
self::assertEquals(3, $result[2]->visitsCount());
self::assertEquals($tagNames[2], $result[2]->tag()->__toString());
self::assertEquals(2, $result[3]->shortUrlsCount());
self::assertEquals(4, $result[3]->visitsCount());
self::assertEquals($tagNames[0], $result[3]->tag()->__toString());
};
yield 'no filter' => [null, $defaultAsserts];
yield 'empty filter' => [new TagsListFiltering(), $defaultAsserts];
yield 'limit' => [new TagsListFiltering(2), static function (array $result, array $tagNames): void {
/** @var TagInfo[] $result */
self::assertCount(2, $result);
self::assertEquals(0, $result[0]->shortUrlsCount());
self::assertEquals(0, $result[0]->visitsCount());
self::assertEquals($tagNames[3], $result[0]->tag()->__toString());
self::assertEquals(3, $result[1]->shortUrlsCount());
self::assertEquals(3, $result[1]->visitsCount());
self::assertEquals($tagNames[1], $result[1]->tag()->__toString());
}];
yield 'offset' => [new TagsListFiltering(null, 3), static function (array $result, array $tagNames): void {
/** @var TagInfo[] $result */
self::assertCount(1, $result);
self::assertEquals(2, $result[0]->shortUrlsCount());
self::assertEquals(4, $result[0]->visitsCount());
self::assertEquals($tagNames[0], $result[0]->tag()->__toString());
}];
yield 'limit and offset' => [
new TagsListFiltering(2, 1),
static function (array $result, array $tagNames): void {
/** @var TagInfo[] $result */
self::assertCount(2, $result);
self::assertEquals(3, $result[0]->shortUrlsCount());
self::assertEquals(3, $result[0]->visitsCount());
self::assertEquals($tagNames[1], $result[0]->tag()->__toString());
self::assertEquals(1, $result[1]->shortUrlsCount());
self::assertEquals(3, $result[1]->visitsCount());
self::assertEquals($tagNames[2], $result[1]->tag()->__toString());
},
]; ];
yield 'search term' => [
new TagsListFiltering(null, null, 'ba'),
static function (array $result, array $tagNames): void {
/** @var TagInfo[] $result */
self::assertCount(2, $result);
self::assertEquals(3, $result[0]->shortUrlsCount());
self::assertEquals(3, $result[0]->visitsCount());
self::assertEquals($tagNames[1], $result[0]->tag()->__toString());
self::assertEquals(1, $result[1]->shortUrlsCount()); yield 'no filter' => [null, $defaultList];
self::assertEquals(3, $result[1]->visitsCount()); yield 'empty filter' => [new TagsListFiltering(), $defaultList];
self::assertEquals($tagNames[2], $result[1]->tag()->__toString()); yield 'limit' => [new TagsListFiltering(2), [
}, ['another', 0, 0],
]; ['bar', 3, 3],
]];
yield 'offset' => [new TagsListFiltering(null, 3), [
['foo', 2, 4],
]];
yield 'limit and offset' => [new TagsListFiltering(2, 1), [
['bar', 3, 3],
['baz', 1, 3],
]];
yield 'search term' => [new TagsListFiltering(null, null, 'ba'), [
['bar', 3, 3],
['baz', 1, 3],
]];
yield 'ASC ordering' => [ yield 'ASC ordering' => [
new TagsListFiltering(null, null, null, Ordering::fromTuple(['tag', 'ASC'])), new TagsListFiltering(null, null, null, Ordering::fromTuple(['tag', 'ASC'])),
$defaultAsserts, $defaultList,
];
yield 'DESC ordering' => [
new TagsListFiltering(null, null, null, Ordering::fromTuple(['tag', 'DESC'])),
static function (array $result, array $tagNames): void {
/** @var TagInfo[] $result */
self::assertCount(4, $result);
self::assertEquals(0, $result[3]->shortUrlsCount());
self::assertEquals(0, $result[3]->visitsCount());
self::assertEquals($tagNames[3], $result[3]->tag()->__toString());
self::assertEquals(3, $result[2]->shortUrlsCount());
self::assertEquals(3, $result[2]->visitsCount());
self::assertEquals($tagNames[1], $result[2]->tag()->__toString());
self::assertEquals(1, $result[1]->shortUrlsCount());
self::assertEquals(3, $result[1]->visitsCount());
self::assertEquals($tagNames[2], $result[1]->tag()->__toString());
self::assertEquals(2, $result[0]->shortUrlsCount());
self::assertEquals(4, $result[0]->visitsCount());
self::assertEquals($tagNames[0], $result[0]->tag()->__toString());
},
]; ];
yield 'DESC ordering' => [new TagsListFiltering(null, null, null, Ordering::fromTuple(['tag', 'DESC'])), [
['foo', 2, 4],
['baz', 1, 3],
['bar', 3, 3],
['another', 0, 0],
]];
yield 'short URLs count ASC ordering' => [ yield 'short URLs count ASC ordering' => [
new TagsListFiltering(null, null, null, Ordering::fromTuple(['shortUrlsCount', 'ASC'])), new TagsListFiltering(null, null, null, Ordering::fromTuple(['shortUrlsCount', 'ASC'])),
static function (array $result, array $tagNames): void { [
/** @var TagInfo[] $result */ ['another', 0, 0],
self::assertCount(4, $result); ['baz', 1, 3],
self::assertEquals(0, $result[0]->shortUrlsCount()); ['foo', 2, 4],
self::assertEquals(0, $result[0]->visitsCount()); ['bar', 3, 3],
self::assertEquals($tagNames[3], $result[0]->tag()->__toString()); ],
self::assertEquals(1, $result[1]->shortUrlsCount());
self::assertEquals(3, $result[1]->visitsCount());
self::assertEquals($tagNames[2], $result[1]->tag()->__toString());
self::assertEquals(2, $result[2]->shortUrlsCount());
self::assertEquals(4, $result[2]->visitsCount());
self::assertEquals($tagNames[0], $result[2]->tag()->__toString());
self::assertEquals(3, $result[3]->shortUrlsCount());
self::assertEquals(3, $result[3]->visitsCount());
self::assertEquals($tagNames[1], $result[3]->tag()->__toString());
},
]; ];
yield 'short URLs count DESC ordering' => [ yield 'short URLs count DESC ordering' => [
new TagsListFiltering(null, null, null, Ordering::fromTuple(['shortUrlsCount', 'DESC'])), new TagsListFiltering(null, null, null, Ordering::fromTuple(['shortUrlsCount', 'DESC'])),
static function (array $result, array $tagNames): void { [
/** @var TagInfo[] $result */ ['bar', 3, 3],
self::assertCount(4, $result); ['foo', 2, 4],
self::assertEquals(3, $result[0]->shortUrlsCount()); ['baz', 1, 3],
self::assertEquals(3, $result[0]->visitsCount()); ['another', 0, 0],
self::assertEquals($tagNames[1], $result[0]->tag()->__toString()); ],
self::assertEquals(2, $result[1]->shortUrlsCount());
self::assertEquals(4, $result[1]->visitsCount());
self::assertEquals($tagNames[0], $result[1]->tag()->__toString());
self::assertEquals(1, $result[2]->shortUrlsCount());
self::assertEquals(3, $result[2]->visitsCount());
self::assertEquals($tagNames[2], $result[2]->tag()->__toString());
self::assertEquals(0, $result[3]->shortUrlsCount());
self::assertEquals(0, $result[3]->visitsCount());
self::assertEquals($tagNames[3], $result[3]->tag()->__toString());
},
]; ];
yield 'visits count ASC ordering' => [ yield 'visits count ASC ordering' => [
new TagsListFiltering(null, null, null, Ordering::fromTuple(['visitsCount', 'ASC'])), new TagsListFiltering(null, null, null, Ordering::fromTuple(['visitsCount', 'ASC'])),
static function (array $result, array $tagNames): void { [
/** @var TagInfo[] $result */ ['another', 0, 0],
self::assertCount(4, $result); ['bar', 3, 3],
self::assertEquals(0, $result[0]->shortUrlsCount()); ['baz', 1, 3],
self::assertEquals(0, $result[0]->visitsCount()); ['foo', 2, 4],
self::assertEquals($tagNames[3], $result[0]->tag()->__toString()); ],
self::assertEquals(3, $result[1]->shortUrlsCount());
self::assertEquals(3, $result[1]->visitsCount());
self::assertEquals($tagNames[1], $result[1]->tag()->__toString());
self::assertEquals(1, $result[2]->shortUrlsCount());
self::assertEquals(3, $result[2]->visitsCount());
self::assertEquals($tagNames[2], $result[2]->tag()->__toString());
self::assertEquals(2, $result[3]->shortUrlsCount());
self::assertEquals(4, $result[3]->visitsCount());
self::assertEquals($tagNames[0], $result[3]->tag()->__toString());
},
]; ];
yield 'visits count DESC ordering' => [ yield 'visits count DESC ordering' => [
new TagsListFiltering(null, null, null, Ordering::fromTuple(['visitsCount', 'DESC'])), new TagsListFiltering(null, null, null, Ordering::fromTuple(['visitsCount', 'DESC'])),
static function (array $result, array $tagNames): void { [
/** @var TagInfo[] $result */ ['foo', 2, 4],
self::assertCount(4, $result); ['bar', 3, 3],
self::assertEquals(2, $result[0]->shortUrlsCount()); ['baz', 1, 3],
self::assertEquals(4, $result[0]->visitsCount()); ['another', 0, 0],
self::assertEquals($tagNames[0], $result[0]->tag()->__toString()); ],
self::assertEquals(3, $result[1]->shortUrlsCount());
self::assertEquals(3, $result[1]->visitsCount());
self::assertEquals($tagNames[1], $result[1]->tag()->__toString());
self::assertEquals(1, $result[2]->shortUrlsCount());
self::assertEquals(3, $result[2]->visitsCount());
self::assertEquals($tagNames[2], $result[2]->tag()->__toString());
self::assertEquals(0, $result[3]->shortUrlsCount());
self::assertEquals(0, $result[3]->visitsCount());
self::assertEquals($tagNames[3], $result[3]->tag()->__toString());
},
]; ];
yield 'visits count DESC ordering and limit' => [ yield 'visits count DESC ordering and limit' => [
new TagsListFiltering(2, null, null, Ordering::fromTuple(['visitsCount', 'DESC'])), new TagsListFiltering(2, null, null, Ordering::fromTuple(['visitsCount', 'DESC'])),
static function (array $result, array $tagNames): void { [
/** @var TagInfo[] $result */ ['foo', 2, 4],
self::assertCount(2, $result); ['bar', 3, 3],
self::assertEquals(2, $result[0]->shortUrlsCount()); ],
self::assertEquals(4, $result[0]->visitsCount());
self::assertEquals($tagNames[0], $result[0]->tag()->__toString());
self::assertEquals(3, $result[1]->shortUrlsCount());
self::assertEquals(3, $result[1]->visitsCount());
self::assertEquals($tagNames[1], $result[1]->tag()->__toString());
},
]; ];
yield 'api key' => [new TagsListFiltering(null, null, null, null, ApiKey::fromMeta( yield 'api key' => [new TagsListFiltering(null, null, null, null, ApiKey::fromMeta(
ApiKeyMeta::withRoles(RoleDefinition::forAuthoredShortUrls()), ApiKeyMeta::withRoles(RoleDefinition::forAuthoredShortUrls()),
)), static function (array $result, array $tagNames): void { )), [
/** @var TagInfo[] $result */ ['bar', 2, 3],
self::assertCount(3, $result); ['baz', 1, 3],
self::assertEquals(1, $result[0]->shortUrlsCount()); ['foo', 1, 3],
self::assertEquals(3, $result[0]->visitsCount()); ]];
self::assertEquals($tagNames[1], $result[0]->tag()->__toString()); yield 'combined' => [new TagsListFiltering(1, null, null, Ordering::fromTuple(
['shortUrls', 'DESC'],
self::assertEquals(1, $result[1]->shortUrlsCount()); ), ApiKey::fromMeta(
self::assertEquals(3, $result[1]->visitsCount()); ApiKeyMeta::withRoles(RoleDefinition::forAuthoredShortUrls()),
self::assertEquals($tagNames[2], $result[1]->tag()->__toString()); )), [
['foo', 1, 3],
self::assertEquals(1, $result[2]->shortUrlsCount()); ]];
self::assertEquals(3, $result[2]->visitsCount());
self::assertEquals($tagNames[0], $result[2]->tag()->__toString());
}];
} }
/** @test */ /** @test */