mirror of
https://github.com/shlinkio/shlink.git
synced 2025-02-25 18:45:27 -06:00
Added test for VisitRepository tag methods
This commit is contained in:
parent
baf77b6ffb
commit
dd4b4277c9
@ -149,11 +149,14 @@ class VisitRepository extends EntityRepository implements VisitRepositoryInterfa
|
|||||||
->where($qb->expr()->eq('t.name', ':tag'))
|
->where($qb->expr()->eq('t.name', ':tag'))
|
||||||
->setParameter('tag', $tag);
|
->setParameter('tag', $tag);
|
||||||
|
|
||||||
|
$shortUrlIds = array_column($qb->getQuery()->getArrayResult(), 'id');
|
||||||
|
$shortUrlIds[] = '-1'; // Add an invalid ID, in case the list is empty
|
||||||
|
|
||||||
// Parameters in this query need to be part of the query itself, as we need to use it a sub-query later
|
// Parameters in this query need to be part of the query itself, as we need to use it a sub-query later
|
||||||
// Since they are not strictly provided by the caller, it's reasonably safe
|
// Since they are not strictly provided by the caller, it's reasonably safe
|
||||||
$qb2 = $this->getEntityManager()->createQueryBuilder();
|
$qb2 = $this->getEntityManager()->createQueryBuilder();
|
||||||
$qb2->from(Visit::class, 'v')
|
$qb2->from(Visit::class, 'v')
|
||||||
->where($qb2->expr()->in('v.shortUrl', array_column($qb->getQuery()->getArrayResult(), 'id')));
|
->where($qb2->expr()->in('v.shortUrl', $shortUrlIds));
|
||||||
|
|
||||||
// Apply date range filtering
|
// Apply date range filtering
|
||||||
$this->applyDatesInline($qb2, $dateRange);
|
$this->applyDatesInline($qb2, $dateRange);
|
||||||
|
@ -5,9 +5,11 @@ declare(strict_types=1);
|
|||||||
namespace ShlinkioTest\Shlink\Core\Repository;
|
namespace ShlinkioTest\Shlink\Core\Repository;
|
||||||
|
|
||||||
use Cake\Chronos\Chronos;
|
use Cake\Chronos\Chronos;
|
||||||
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
use Shlinkio\Shlink\Common\Util\DateRange;
|
use Shlinkio\Shlink\Common\Util\DateRange;
|
||||||
use Shlinkio\Shlink\Core\Entity\Domain;
|
use Shlinkio\Shlink\Core\Entity\Domain;
|
||||||
use Shlinkio\Shlink\Core\Entity\ShortUrl;
|
use Shlinkio\Shlink\Core\Entity\ShortUrl;
|
||||||
|
use Shlinkio\Shlink\Core\Entity\Tag;
|
||||||
use Shlinkio\Shlink\Core\Entity\Visit;
|
use Shlinkio\Shlink\Core\Entity\Visit;
|
||||||
use Shlinkio\Shlink\Core\Entity\VisitLocation;
|
use Shlinkio\Shlink\Core\Entity\VisitLocation;
|
||||||
use Shlinkio\Shlink\Core\Model\ShortUrlMeta;
|
use Shlinkio\Shlink\Core\Model\ShortUrlMeta;
|
||||||
@ -27,6 +29,7 @@ class VisitRepositoryTest extends DatabaseTestCase
|
|||||||
Visit::class,
|
Visit::class,
|
||||||
ShortUrl::class,
|
ShortUrl::class,
|
||||||
Domain::class,
|
Domain::class,
|
||||||
|
Tag::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
private VisitRepository $repo;
|
private VisitRepository $repo;
|
||||||
@ -125,18 +128,69 @@ class VisitRepositoryTest extends DatabaseTestCase
|
|||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function createShortUrlsAndVisits(): array
|
/** @test */
|
||||||
|
public function findVisitsByTagReturnsProperData(): void
|
||||||
|
{
|
||||||
|
$foo = new Tag('foo');
|
||||||
|
$this->getEntityManager()->persist($foo);
|
||||||
|
|
||||||
|
/** @var ShortUrl $shortUrl */
|
||||||
|
[,, $shortUrl] = $this->createShortUrlsAndVisits(false);
|
||||||
|
/** @var ShortUrl $shortUrl2 */
|
||||||
|
[,, $shortUrl2] = $this->createShortUrlsAndVisits(false);
|
||||||
|
/** @var ShortUrl $shortUrl3 */
|
||||||
|
[,, $shortUrl3] = $this->createShortUrlsAndVisits(false);
|
||||||
|
|
||||||
|
$shortUrl->setTags(new ArrayCollection([$foo]));
|
||||||
|
$shortUrl2->setTags(new ArrayCollection([$foo]));
|
||||||
|
$shortUrl3->setTags(new ArrayCollection([$foo]));
|
||||||
|
|
||||||
|
$this->getEntityManager()->flush();
|
||||||
|
|
||||||
|
$this->assertCount(0, $this->repo->findVisitsByTag('invalid'));
|
||||||
|
$this->assertCount(18, $this->repo->findVisitsByTag((string) $foo));
|
||||||
|
$this->assertCount(6, $this->repo->findVisitsByTag((string) $foo, new DateRange(
|
||||||
|
Chronos::parse('2016-01-02'),
|
||||||
|
Chronos::parse('2016-01-03'),
|
||||||
|
)));
|
||||||
|
$this->assertCount(12, $this->repo->findVisitsByTag((string) $foo, new DateRange(
|
||||||
|
Chronos::parse('2016-01-03'),
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
public function countVisitsByTagReturnsProperData(): void
|
||||||
|
{
|
||||||
|
$foo = new Tag('foo');
|
||||||
|
$this->getEntityManager()->persist($foo);
|
||||||
|
|
||||||
|
/** @var ShortUrl $shortUrl */
|
||||||
|
[,, $shortUrl] = $this->createShortUrlsAndVisits(false);
|
||||||
|
/** @var ShortUrl $shortUrl2 */
|
||||||
|
[,, $shortUrl2] = $this->createShortUrlsAndVisits(false);
|
||||||
|
|
||||||
|
$shortUrl->setTags(new ArrayCollection([$foo]));
|
||||||
|
$shortUrl2->setTags(new ArrayCollection([$foo]));
|
||||||
|
|
||||||
|
$this->getEntityManager()->flush();
|
||||||
|
|
||||||
|
$this->assertEquals(0, $this->repo->countVisitsByTag('invalid'));
|
||||||
|
$this->assertEquals(12, $this->repo->countVisitsByTag((string) $foo));
|
||||||
|
$this->assertEquals(4, $this->repo->countVisitsByTag((string) $foo, new DateRange(
|
||||||
|
Chronos::parse('2016-01-02'),
|
||||||
|
Chronos::parse('2016-01-03'),
|
||||||
|
)));
|
||||||
|
$this->assertEquals(8, $this->repo->countVisitsByTag((string) $foo, new DateRange(
|
||||||
|
Chronos::parse('2016-01-03'),
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createShortUrlsAndVisits(bool $withDomain = true): array
|
||||||
{
|
{
|
||||||
$shortUrl = new ShortUrl('');
|
$shortUrl = new ShortUrl('');
|
||||||
$domain = 'example.com';
|
$domain = 'example.com';
|
||||||
$shortCode = $shortUrl->getShortCode();
|
$shortCode = $shortUrl->getShortCode();
|
||||||
$shortUrlWithDomain = new ShortUrl('', ShortUrlMeta::fromRawData([
|
|
||||||
'customSlug' => $shortCode,
|
|
||||||
'domain' => $domain,
|
|
||||||
]));
|
|
||||||
|
|
||||||
$this->getEntityManager()->persist($shortUrl);
|
$this->getEntityManager()->persist($shortUrl);
|
||||||
$this->getEntityManager()->persist($shortUrlWithDomain);
|
|
||||||
|
|
||||||
for ($i = 0; $i < 6; $i++) {
|
for ($i = 0; $i < 6; $i++) {
|
||||||
$visit = new Visit(
|
$visit = new Visit(
|
||||||
@ -147,17 +201,26 @@ class VisitRepositoryTest extends DatabaseTestCase
|
|||||||
);
|
);
|
||||||
$this->getEntityManager()->persist($visit);
|
$this->getEntityManager()->persist($visit);
|
||||||
}
|
}
|
||||||
for ($i = 0; $i < 3; $i++) {
|
|
||||||
$visit = new Visit(
|
|
||||||
$shortUrlWithDomain,
|
|
||||||
Visitor::emptyInstance(),
|
|
||||||
true,
|
|
||||||
Chronos::parse(sprintf('2016-01-0%s', $i + 1)),
|
|
||||||
);
|
|
||||||
$this->getEntityManager()->persist($visit);
|
|
||||||
}
|
|
||||||
$this->getEntityManager()->flush();
|
|
||||||
|
|
||||||
return [$shortCode, $domain];
|
if ($withDomain) {
|
||||||
|
$shortUrlWithDomain = new ShortUrl('', ShortUrlMeta::fromRawData([
|
||||||
|
'customSlug' => $shortCode,
|
||||||
|
'domain' => $domain,
|
||||||
|
]));
|
||||||
|
$this->getEntityManager()->persist($shortUrlWithDomain);
|
||||||
|
|
||||||
|
for ($i = 0; $i < 3; $i++) {
|
||||||
|
$visit = new Visit(
|
||||||
|
$shortUrlWithDomain,
|
||||||
|
Visitor::emptyInstance(),
|
||||||
|
true,
|
||||||
|
Chronos::parse(sprintf('2016-01-0%s', $i + 1)),
|
||||||
|
);
|
||||||
|
$this->getEntityManager()->persist($visit);
|
||||||
|
}
|
||||||
|
$this->getEntityManager()->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
return [$shortCode, $domain, $shortUrl];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user