mirror of
https://github.com/shlinkio/shlink.git
synced 2025-02-25 18:45:27 -06:00
Simplified TagRepository test for tags info list, making it more predictable
This commit is contained in:
parent
361e864415
commit
6b409b06cc
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user