From db3c5a303181012325825b5da002ecbd2690b7e9 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 22 May 2021 20:32:30 +0200 Subject: [PATCH] Added new models to pass to repositories when listing visits of any kind --- .../Adapter/OrphanVisitsPaginatorAdapter.php | 9 ++- .../Adapter/VisitsForTagPaginatorAdapter.php | 12 ++- .../Adapter/VisitsPaginatorAdapter.php | 12 ++- .../Core/src/Repository/VisitRepository.php | 57 ++++++-------- .../Repository/VisitRepositoryInterface.php | 22 +----- .../Repository/VisitRepositoryTest.php | 74 ++++++++++++------- .../OrphanVisitsPaginatorAdapterTest.php | 5 +- .../VisitsForTagPaginatorAdapterTest.php | 6 +- .../Adapter/VisitsPaginatorAdapterTest.php | 9 ++- .../Core/test/Visit/VisitsStatsHelperTest.php | 11 +-- 10 files changed, 116 insertions(+), 101 deletions(-) diff --git a/module/Core/src/Paginator/Adapter/OrphanVisitsPaginatorAdapter.php b/module/Core/src/Paginator/Adapter/OrphanVisitsPaginatorAdapter.php index 9d96d5ab..0cc9ae7d 100644 --- a/module/Core/src/Paginator/Adapter/OrphanVisitsPaginatorAdapter.php +++ b/module/Core/src/Paginator/Adapter/OrphanVisitsPaginatorAdapter.php @@ -7,6 +7,7 @@ namespace Shlinkio\Shlink\Core\Paginator\Adapter; use Shlinkio\Shlink\Core\Model\VisitsParams; use Shlinkio\Shlink\Core\Repository\VisitRepositoryInterface; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; +use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; class OrphanVisitsPaginatorAdapter extends AbstractCacheableCountPaginatorAdapter { @@ -26,6 +27,12 @@ class OrphanVisitsPaginatorAdapter extends AbstractCacheableCountPaginatorAdapte public function getSlice($offset, $length): iterable // phpcs:ignore { - return $this->repo->findOrphanVisits($this->params->getDateRange(), $length, $offset); + return $this->repo->findOrphanVisits(new VisitsListFiltering( + $this->params->getDateRange(), + $this->params->excludeBots(), + null, + $length, + $offset, + )); } } diff --git a/module/Core/src/Paginator/Adapter/VisitsForTagPaginatorAdapter.php b/module/Core/src/Paginator/Adapter/VisitsForTagPaginatorAdapter.php index df1eba11..d7c0580f 100644 --- a/module/Core/src/Paginator/Adapter/VisitsForTagPaginatorAdapter.php +++ b/module/Core/src/Paginator/Adapter/VisitsForTagPaginatorAdapter.php @@ -8,6 +8,7 @@ use Happyr\DoctrineSpecification\Specification\Specification; use Shlinkio\Shlink\Core\Model\VisitsParams; use Shlinkio\Shlink\Core\Repository\VisitRepositoryInterface; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; +use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; use Shlinkio\Shlink\Rest\Entity\ApiKey; class VisitsForTagPaginatorAdapter extends AbstractCacheableCountPaginatorAdapter @@ -33,10 +34,13 @@ class VisitsForTagPaginatorAdapter extends AbstractCacheableCountPaginatorAdapte { return $this->visitRepository->findVisitsByTag( $this->tag, - $this->params->getDateRange(), - $length, - $offset, - $this->resolveSpec(), + new VisitsListFiltering( + $this->params->getDateRange(), + $this->params->excludeBots(), + $this->resolveSpec(), + $length, + $offset, + ), ); } diff --git a/module/Core/src/Paginator/Adapter/VisitsPaginatorAdapter.php b/module/Core/src/Paginator/Adapter/VisitsPaginatorAdapter.php index a0f002ff..5369bd05 100644 --- a/module/Core/src/Paginator/Adapter/VisitsPaginatorAdapter.php +++ b/module/Core/src/Paginator/Adapter/VisitsPaginatorAdapter.php @@ -9,6 +9,7 @@ use Shlinkio\Shlink\Core\Model\ShortUrlIdentifier; use Shlinkio\Shlink\Core\Model\VisitsParams; use Shlinkio\Shlink\Core\Repository\VisitRepositoryInterface; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; +use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; class VisitsPaginatorAdapter extends AbstractCacheableCountPaginatorAdapter { @@ -34,10 +35,13 @@ class VisitsPaginatorAdapter extends AbstractCacheableCountPaginatorAdapter return $this->visitRepository->findVisitsByShortCode( $this->identifier->shortCode(), $this->identifier->domain(), - $this->params->getDateRange(), - $length, - $offset, - $this->spec, + new VisitsListFiltering( + $this->params->getDateRange(), + $this->params->excludeBots(), + $this->spec, + $length, + $offset, + ), ); } diff --git a/module/Core/src/Repository/VisitRepository.php b/module/Core/src/Repository/VisitRepository.php index bab885f6..5d3bacbc 100644 --- a/module/Core/src/Repository/VisitRepository.php +++ b/module/Core/src/Repository/VisitRepository.php @@ -7,12 +7,12 @@ namespace Shlinkio\Shlink\Core\Repository; use Doctrine\ORM\Query\ResultSetMappingBuilder; use Doctrine\ORM\QueryBuilder; use Happyr\DoctrineSpecification\Repository\EntitySpecificationRepository; -use Happyr\DoctrineSpecification\Specification\Specification; use Shlinkio\Shlink\Common\Util\DateRange; use Shlinkio\Shlink\Core\Entity\ShortUrl; use Shlinkio\Shlink\Core\Entity\Visit; use Shlinkio\Shlink\Core\Entity\VisitLocation; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; +use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; use Shlinkio\Shlink\Core\Visit\Spec\CountOfOrphanVisits; use Shlinkio\Shlink\Core\Visit\Spec\CountOfShortUrlVisits; use Shlinkio\Shlink\Rest\Entity\ApiKey; @@ -84,21 +84,15 @@ class VisitRepository extends EntitySpecificationRepository implements VisitRepo /** * @return Visit[] */ - public function findVisitsByShortCode( - string $shortCode, - ?string $domain = null, - ?DateRange $dateRange = null, - ?int $limit = null, - ?int $offset = null, - ?Specification $spec = null - ): array { - $qb = $this->createVisitsByShortCodeQueryBuilder($shortCode, $domain, $dateRange, $spec); - return $this->resolveVisitsWithNativeQuery($qb, $limit, $offset); + public function findVisitsByShortCode(string $shortCode, ?string $domain, VisitsListFiltering $filtering): array + { + $qb = $this->createVisitsByShortCodeQueryBuilder($shortCode, $domain, $filtering); + return $this->resolveVisitsWithNativeQuery($qb, $filtering->limit(), $filtering->offset()); } public function countVisitsByShortCode(string $shortCode, ?string $domain, VisitsCountFiltering $filtering): int { - $qb = $this->createVisitsByShortCodeQueryBuilder($shortCode, $domain, $filtering->dateRange(), $filtering->spec()); + $qb = $this->createVisitsByShortCodeQueryBuilder($shortCode, $domain, $filtering); $qb->select('COUNT(v.id)'); return (int) $qb->getQuery()->getSingleScalarResult(); @@ -107,12 +101,11 @@ class VisitRepository extends EntitySpecificationRepository implements VisitRepo private function createVisitsByShortCodeQueryBuilder( string $shortCode, ?string $domain, - ?DateRange $dateRange, - ?Specification $spec = null + VisitsCountFiltering $filtering ): QueryBuilder { /** @var ShortUrlRepositoryInterface $shortUrlRepo */ $shortUrlRepo = $this->getEntityManager()->getRepository(ShortUrl::class); - $shortUrl = $shortUrlRepo->findOne($shortCode, $domain, $spec); + $shortUrl = $shortUrlRepo->findOne($shortCode, $domain, $filtering->spec()); $shortUrlId = $shortUrl !== null ? $shortUrl->getId() : -1; // Parameters in this query need to be part of the query itself, as we need to use it a sub-query later @@ -122,35 +115,27 @@ class VisitRepository extends EntitySpecificationRepository implements VisitRepo ->where($qb->expr()->eq('v.shortUrl', $shortUrlId)); // Apply date range filtering - $this->applyDatesInline($qb, $dateRange); + $this->applyDatesInline($qb, $filtering->dateRange()); return $qb; } - public function findVisitsByTag( - string $tag, - ?DateRange $dateRange = null, - ?int $limit = null, - ?int $offset = null, - ?Specification $spec = null - ): array { - $qb = $this->createVisitsByTagQueryBuilder($tag, $dateRange, $spec); - return $this->resolveVisitsWithNativeQuery($qb, $limit, $offset); + public function findVisitsByTag(string $tag, VisitsListFiltering $filtering): array + { + $qb = $this->createVisitsByTagQueryBuilder($tag, $filtering); + return $this->resolveVisitsWithNativeQuery($qb, $filtering->limit(), $filtering->offset()); } public function countVisitsByTag(string $tag, VisitsCountFiltering $filtering): int { - $qb = $this->createVisitsByTagQueryBuilder($tag, $filtering->dateRange(), $filtering->spec()); + $qb = $this->createVisitsByTagQueryBuilder($tag, $filtering); $qb->select('COUNT(v.id)'); return (int) $qb->getQuery()->getSingleScalarResult(); } - private function createVisitsByTagQueryBuilder( - string $tag, - ?DateRange $dateRange, - ?Specification $spec - ): QueryBuilder { + private function createVisitsByTagQueryBuilder(string $tag, VisitsCountFiltering $filtering): QueryBuilder + { // Parameters in this query need to be inlined, not bound, as we need to use it as sub-query later // Since they are not strictly provided by the caller, it's reasonably safe $qb = $this->getEntityManager()->createQueryBuilder(); @@ -159,13 +144,13 @@ class VisitRepository extends EntitySpecificationRepository implements VisitRepo ->join('s.tags', 't') ->where($qb->expr()->eq('t.name', '\'' . $tag . '\'')); // This needs to be concatenated, not bound - $this->applyDatesInline($qb, $dateRange); - $this->applySpecification($qb, $spec, 'v'); + $this->applyDatesInline($qb, $filtering->dateRange()); + $this->applySpecification($qb, $filtering->spec(), 'v'); return $qb; } - public function findOrphanVisits(?DateRange $dateRange = null, ?int $limit = null, ?int $offset = null): array + public function findOrphanVisits(VisitsListFiltering $filtering): array { // Parameters in this query need to be inlined, not bound, as we need to use it as sub-query later // Since they are not strictly provided by the caller, it's reasonably safe @@ -173,9 +158,9 @@ class VisitRepository extends EntitySpecificationRepository implements VisitRepo $qb->from(Visit::class, 'v') ->where($qb->expr()->isNull('v.shortUrl')); - $this->applyDatesInline($qb, $dateRange); + $this->applyDatesInline($qb, $filtering->dateRange()); - return $this->resolveVisitsWithNativeQuery($qb, $limit, $offset); + return $this->resolveVisitsWithNativeQuery($qb, $filtering->limit(), $filtering->offset()); } public function countOrphanVisits(VisitsCountFiltering $filtering): int diff --git a/module/Core/src/Repository/VisitRepositoryInterface.php b/module/Core/src/Repository/VisitRepositoryInterface.php index a3a6ca1a..05a59720 100644 --- a/module/Core/src/Repository/VisitRepositoryInterface.php +++ b/module/Core/src/Repository/VisitRepositoryInterface.php @@ -6,10 +6,9 @@ namespace Shlinkio\Shlink\Core\Repository; use Doctrine\Persistence\ObjectRepository; use Happyr\DoctrineSpecification\Repository\EntitySpecificationRepositoryInterface; -use Happyr\DoctrineSpecification\Specification\Specification; -use Shlinkio\Shlink\Common\Util\DateRange; use Shlinkio\Shlink\Core\Entity\Visit; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; +use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; use Shlinkio\Shlink\Rest\Entity\ApiKey; interface VisitRepositoryInterface extends ObjectRepository, EntitySpecificationRepositoryInterface @@ -34,34 +33,21 @@ interface VisitRepositoryInterface extends ObjectRepository, EntitySpecification /** * @return Visit[] */ - public function findVisitsByShortCode( - string $shortCode, - ?string $domain = null, - ?DateRange $dateRange = null, - ?int $limit = null, - ?int $offset = null, - ?Specification $spec = null - ): array; + public function findVisitsByShortCode(string $shortCode, ?string $domain, VisitsListFiltering $filtering): array; public function countVisitsByShortCode(string $shortCode, ?string $domain, VisitsCountFiltering $filtering): int; /** * @return Visit[] */ - public function findVisitsByTag( - string $tag, - ?DateRange $dateRange = null, - ?int $limit = null, - ?int $offset = null, - ?Specification $spec = null - ): array; + public function findVisitsByTag(string $tag, VisitsListFiltering $filtering): array; public function countVisitsByTag(string $tag, VisitsCountFiltering $filtering): int; /** * @return Visit[] */ - public function findOrphanVisits(?DateRange $dateRange = null, ?int $limit = null, ?int $offset = null): array; + public function findOrphanVisits(VisitsListFiltering $filtering): array; public function countOrphanVisits(VisitsCountFiltering $filtering): int; diff --git a/module/Core/test-db/Repository/VisitRepositoryTest.php b/module/Core/test-db/Repository/VisitRepositoryTest.php index 9bf32182..02be1260 100644 --- a/module/Core/test-db/Repository/VisitRepositoryTest.php +++ b/module/Core/test-db/Repository/VisitRepositoryTest.php @@ -16,6 +16,7 @@ use Shlinkio\Shlink\Core\Model\Visitor; use Shlinkio\Shlink\Core\Repository\VisitRepository; use Shlinkio\Shlink\Core\ShortUrl\Resolver\PersistenceShortUrlRelationResolver; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; +use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; use Shlinkio\Shlink\IpGeolocation\Model\Location; use Shlinkio\Shlink\Rest\ApiKey\Model\ApiKeyMeta; use Shlinkio\Shlink\Rest\ApiKey\Model\RoleDefinition; @@ -88,22 +89,33 @@ class VisitRepositoryTest extends DatabaseTestCase { [$shortCode, $domain] = $this->createShortUrlsAndVisits(); - self::assertCount(0, $this->repo->findVisitsByShortCode('invalid')); - self::assertCount(6, $this->repo->findVisitsByShortCode($shortCode)); - self::assertCount(3, $this->repo->findVisitsByShortCode($shortCode, $domain)); - self::assertCount(2, $this->repo->findVisitsByShortCode($shortCode, null, new DateRange( - Chronos::parse('2016-01-02'), - Chronos::parse('2016-01-03'), + self::assertCount(0, $this->repo->findVisitsByShortCode('invalid', null, new VisitsListFiltering())); + self::assertCount(6, $this->repo->findVisitsByShortCode($shortCode, null, new VisitsListFiltering())); + self::assertCount(3, $this->repo->findVisitsByShortCode($shortCode, $domain, new VisitsListFiltering())); + self::assertCount(2, $this->repo->findVisitsByShortCode($shortCode, null, new VisitsListFiltering( + DateRange::withStartAndEndDate(Chronos::parse('2016-01-02'), Chronos::parse('2016-01-03')), ))); - self::assertCount(4, $this->repo->findVisitsByShortCode($shortCode, null, new DateRange( - Chronos::parse('2016-01-03'), + self::assertCount(4, $this->repo->findVisitsByShortCode($shortCode, null, new VisitsListFiltering( + DateRange::withStartDate(Chronos::parse('2016-01-03')), ))); - self::assertCount(1, $this->repo->findVisitsByShortCode($shortCode, $domain, new DateRange( - Chronos::parse('2016-01-03'), + self::assertCount(1, $this->repo->findVisitsByShortCode($shortCode, $domain, new VisitsListFiltering( + DateRange::withStartDate(Chronos::parse('2016-01-03')), ))); - self::assertCount(3, $this->repo->findVisitsByShortCode($shortCode, null, null, 3, 2)); - self::assertCount(2, $this->repo->findVisitsByShortCode($shortCode, null, null, 5, 4)); - self::assertCount(1, $this->repo->findVisitsByShortCode($shortCode, $domain, null, 3, 2)); + self::assertCount(3, $this->repo->findVisitsByShortCode( + $shortCode, + null, + new VisitsListFiltering(null, false, null, 3, 2), + )); + self::assertCount(2, $this->repo->findVisitsByShortCode( + $shortCode, + null, + new VisitsListFiltering(null, false, null, 5, 4), + )); + self::assertCount(1, $this->repo->findVisitsByShortCode( + $shortCode, + $domain, + new VisitsListFiltering(null, false, null, 3, 2), + )); } /** @test */ @@ -140,13 +152,14 @@ class VisitRepositoryTest extends DatabaseTestCase $this->createShortUrlsAndVisits(false, [$foo]); $this->getEntityManager()->flush(); - self::assertCount(0, $this->repo->findVisitsByTag('invalid')); - self::assertCount(18, $this->repo->findVisitsByTag($foo)); - self::assertCount(6, $this->repo->findVisitsByTag($foo, new DateRange( - Chronos::parse('2016-01-02'), - Chronos::parse('2016-01-03'), + self::assertCount(0, $this->repo->findVisitsByTag('invalid', new VisitsListFiltering())); + self::assertCount(18, $this->repo->findVisitsByTag($foo, new VisitsListFiltering())); + self::assertCount(6, $this->repo->findVisitsByTag($foo, new VisitsListFiltering( + DateRange::withStartAndEndDate(Chronos::parse('2016-01-02'), Chronos::parse('2016-01-03')), + ))); + self::assertCount(12, $this->repo->findVisitsByTag($foo, new VisitsListFiltering( + DateRange::withStartDate(Chronos::parse('2016-01-03')), ))); - self::assertCount(12, $this->repo->findVisitsByTag($foo, new DateRange(Chronos::parse('2016-01-03')))); } /** @test */ @@ -241,16 +254,25 @@ class VisitRepositoryTest extends DatabaseTestCase $this->getEntityManager()->flush(); - self::assertCount(18, $this->repo->findOrphanVisits()); - self::assertCount(5, $this->repo->findOrphanVisits(null, 5)); - self::assertCount(10, $this->repo->findOrphanVisits(null, 15, 8)); - self::assertCount(9, $this->repo->findOrphanVisits(DateRange::withStartDate(Chronos::parse('2020-01-04')), 15)); - self::assertCount(2, $this->repo->findOrphanVisits( + self::assertCount(18, $this->repo->findOrphanVisits(new VisitsListFiltering())); + self::assertCount(5, $this->repo->findOrphanVisits(new VisitsListFiltering(null, false, null, 5))); + self::assertCount(10, $this->repo->findOrphanVisits(new VisitsListFiltering(null, false, null, 15, 8))); + self::assertCount(9, $this->repo->findOrphanVisits(new VisitsListFiltering( + DateRange::withStartDate(Chronos::parse('2020-01-04')), + false, + null, + 15, + ))); + self::assertCount(2, $this->repo->findOrphanVisits(new VisitsListFiltering( DateRange::withStartAndEndDate(Chronos::parse('2020-01-02'), Chronos::parse('2020-01-03')), + false, + null, 6, 4, - )); - self::assertCount(3, $this->repo->findOrphanVisits(DateRange::withEndDate(Chronos::parse('2020-01-01')))); + ))); + self::assertCount(3, $this->repo->findOrphanVisits(new VisitsListFiltering( + DateRange::withEndDate(Chronos::parse('2020-01-01')), + ))); } /** @test */ diff --git a/module/Core/test/Paginator/Adapter/OrphanVisitsPaginatorAdapterTest.php b/module/Core/test/Paginator/Adapter/OrphanVisitsPaginatorAdapterTest.php index 7ec20d9c..1cc21eef 100644 --- a/module/Core/test/Paginator/Adapter/OrphanVisitsPaginatorAdapterTest.php +++ b/module/Core/test/Paginator/Adapter/OrphanVisitsPaginatorAdapterTest.php @@ -13,6 +13,7 @@ use Shlinkio\Shlink\Core\Model\VisitsParams; use Shlinkio\Shlink\Core\Paginator\Adapter\OrphanVisitsPaginatorAdapter; use Shlinkio\Shlink\Core\Repository\VisitRepositoryInterface; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; +use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; class OrphanVisitsPaginatorAdapterTest extends TestCase { @@ -51,7 +52,9 @@ class OrphanVisitsPaginatorAdapterTest extends TestCase { $visitor = Visitor::emptyInstance(); $list = [Visit::forRegularNotFound($visitor), Visit::forInvalidShortUrl($visitor)]; - $repoFind = $this->repo->findOrphanVisits($this->params->getDateRange(), $limit, $offset)->willReturn($list); + $repoFind = $this->repo->findOrphanVisits( + new VisitsListFiltering($this->params->getDateRange(), $this->params->excludeBots(), null, $limit, $offset), + )->willReturn($list); $result = $this->adapter->getSlice($offset, $limit); diff --git a/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php b/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php index d9f4a492..aa684b70 100644 --- a/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php +++ b/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php @@ -12,6 +12,7 @@ use Shlinkio\Shlink\Core\Model\VisitsParams; use Shlinkio\Shlink\Core\Paginator\Adapter\VisitsForTagPaginatorAdapter; use Shlinkio\Shlink\Core\Repository\VisitRepositoryInterface; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; +use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; use Shlinkio\Shlink\Rest\Entity\ApiKey; class VisitsForTagPaginatorAdapterTest extends TestCase @@ -32,7 +33,10 @@ class VisitsForTagPaginatorAdapterTest extends TestCase $limit = 1; $offset = 5; $adapter = $this->createAdapter(null); - $findVisits = $this->repo->findVisitsByTag('foo', new DateRange(), $limit, $offset, null)->willReturn([]); + $findVisits = $this->repo->findVisitsByTag( + 'foo', + new VisitsListFiltering(new DateRange(), false, null, $limit, $offset), + )->willReturn([]); for ($i = 0; $i < $count; $i++) { $adapter->getSlice($offset, $limit); diff --git a/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php b/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php index 91ddeaae..d7b454b0 100644 --- a/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php +++ b/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php @@ -13,6 +13,7 @@ use Shlinkio\Shlink\Core\Model\VisitsParams; use Shlinkio\Shlink\Core\Paginator\Adapter\VisitsPaginatorAdapter; use Shlinkio\Shlink\Core\Repository\VisitRepositoryInterface; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; +use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; use Shlinkio\Shlink\Rest\Entity\ApiKey; class VisitsPaginatorAdapterTest extends TestCase @@ -33,9 +34,11 @@ class VisitsPaginatorAdapterTest extends TestCase $limit = 1; $offset = 5; $adapter = $this->createAdapter(null); - $findVisits = $this->repo->findVisitsByShortCode('', null, new DateRange(), $limit, $offset, null)->willReturn( - [], - ); + $findVisits = $this->repo->findVisitsByShortCode( + '', + null, + new VisitsListFiltering(new DateRange(), false, null, $limit, $offset), + )->willReturn([]); for ($i = 0; $i < $count; $i++) { $adapter->getSlice($offset, $limit); diff --git a/module/Core/test/Visit/VisitsStatsHelperTest.php b/module/Core/test/Visit/VisitsStatsHelperTest.php index 7b525d1a..e6f067da 100644 --- a/module/Core/test/Visit/VisitsStatsHelperTest.php +++ b/module/Core/test/Visit/VisitsStatsHelperTest.php @@ -10,7 +10,6 @@ use PHPUnit\Framework\TestCase; use Prophecy\Argument; use Prophecy\PhpUnit\ProphecyTrait; use Prophecy\Prophecy\ObjectProphecy; -use Shlinkio\Shlink\Common\Util\DateRange; use Shlinkio\Shlink\Core\Entity\ShortUrl; use Shlinkio\Shlink\Core\Entity\Tag; use Shlinkio\Shlink\Core\Entity\Visit; @@ -24,6 +23,7 @@ use Shlinkio\Shlink\Core\Repository\TagRepository; use Shlinkio\Shlink\Core\Repository\VisitRepository; use Shlinkio\Shlink\Core\Visit\Model\VisitsStats; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; +use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; use Shlinkio\Shlink\Core\Visit\VisitsStatsHelper; use Shlinkio\Shlink\Rest\Entity\ApiKey; use ShlinkioTest\Shlink\Core\Util\ApiKeyHelpersTrait; @@ -86,9 +86,7 @@ class VisitsStatsHelperTest extends TestCase $list = map(range(0, 1), fn () => Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance())); $repo2 = $this->prophesize(VisitRepository::class); - $repo2->findVisitsByShortCode($shortCode, null, Argument::type(DateRange::class), 1, 0, $spec)->willReturn( - $list, - ); + $repo2->findVisitsByShortCode($shortCode, null, Argument::type(VisitsListFiltering::class))->willReturn($list); $repo2->countVisitsByShortCode($shortCode, null, Argument::type(VisitsCountFiltering::class))->willReturn(1); $this->em->getRepository(Visit::class)->willReturn($repo2->reveal())->shouldBeCalledOnce(); @@ -139,10 +137,9 @@ class VisitsStatsHelperTest extends TestCase $tagExists = $repo->tagExists($tag, $apiKey)->willReturn(true); $getRepo = $this->em->getRepository(Tag::class)->willReturn($repo->reveal()); - $spec = $apiKey === null ? null : $apiKey->spec(); $list = map(range(0, 1), fn () => Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance())); $repo2 = $this->prophesize(VisitRepository::class); - $repo2->findVisitsByTag($tag, Argument::type(DateRange::class), 1, 0, $spec)->willReturn($list); + $repo2->findVisitsByTag($tag, Argument::type(VisitsListFiltering::class))->willReturn($list); $repo2->countVisitsByTag($tag, Argument::type(VisitsCountFiltering::class))->willReturn(1); $this->em->getRepository(Visit::class)->willReturn($repo2->reveal())->shouldBeCalledOnce(); @@ -159,7 +156,7 @@ class VisitsStatsHelperTest extends TestCase $list = map(range(0, 3), fn () => Visit::forBasePath(Visitor::emptyInstance())); $repo = $this->prophesize(VisitRepository::class); $countVisits = $repo->countOrphanVisits(Argument::type(VisitsCountFiltering::class))->willReturn(count($list)); - $listVisits = $repo->findOrphanVisits(Argument::type(DateRange::class), Argument::cetera())->willReturn($list); + $listVisits = $repo->findOrphanVisits(Argument::type(VisitsListFiltering::class))->willReturn($list); $getRepo = $this->em->getRepository(Visit::class)->willReturn($repo->reveal()); $paginator = $this->helper->orphanVisits(new VisitsParams());