diff --git a/module/Rest/test-api/Action/NonOrphanVisitsTest.php b/module/Rest/test-api/Action/NonOrphanVisitsTest.php index 0e69db54..db38c534 100644 --- a/module/Rest/test-api/Action/NonOrphanVisitsTest.php +++ b/module/Rest/test-api/Action/NonOrphanVisitsTest.php @@ -31,5 +31,7 @@ class NonOrphanVisitsTest extends ApiTestCase yield 'bots excluded' => [['excludeBots' => 'true'], 6, 6]; yield 'bots excluded and pagination' => [['excludeBots' => 'true', 'page' => 1, 'itemsPerPage' => 4], 6, 4]; yield 'date filter' => [['startDate' => Chronos::now()->addDays(1)->toAtomString()], 0, 0]; + yield 'domain filter' => [['domain' => 'example.com'], 0, 0]; + yield 'default domain filter' => [['domain' => 'DEFAULT'], 7, 7]; } } diff --git a/module/Rest/test-api/Action/OrphanVisitsTest.php b/module/Rest/test-api/Action/OrphanVisitsTest.php index f9414899..30519c4c 100644 --- a/module/Rest/test-api/Action/OrphanVisitsTest.php +++ b/module/Rest/test-api/Action/OrphanVisitsTest.php @@ -19,7 +19,7 @@ class OrphanVisitsTest extends ApiTestCase 'userAgent' => 'cf-facebook', 'visitLocation' => null, 'potentialBot' => true, - 'visitedUrl' => 'foo.com', + 'visitedUrl' => 'https://example.com/short', 'type' => 'invalid_short_url', 'redirectUrl' => null, ]; @@ -29,7 +29,7 @@ class OrphanVisitsTest extends ApiTestCase 'userAgent' => 'shlink-tests-agent', 'visitLocation' => null, 'potentialBot' => false, - 'visitedUrl' => '', + 'visitedUrl' => 'https://s.test/bar', 'type' => 'regular_404', 'redirectUrl' => null, ]; @@ -39,7 +39,7 @@ class OrphanVisitsTest extends ApiTestCase 'userAgent' => 'shlink-tests-agent', 'visitLocation' => null, 'potentialBot' => false, - 'visitedUrl' => '', + 'visitedUrl' => 'https://s.test/foo', 'type' => 'base_url', 'redirectUrl' => null, ]; @@ -80,6 +80,14 @@ class OrphanVisitsTest extends ApiTestCase 1, [self::INVALID_SHORT_URL], ]; + yield 'example domain only' => [['domain' => 'example.com'], 1, 1, [self::INVALID_SHORT_URL]]; + yield 'default domain only' => [['domain' => 's.test'], 2, 2, [self::REGULAR_NOT_FOUND, self::BASE_URL]]; + yield 'default domain only with DEFAULT keyword' => [ + ['domain' => 'DEFAULT'], + 2, + 2, + [self::REGULAR_NOT_FOUND, self::BASE_URL], + ]; } #[Test] diff --git a/module/Rest/test-api/Action/TagVisitsTest.php b/module/Rest/test-api/Action/TagVisitsTest.php index c51f02fb..7a0c5f45 100644 --- a/module/Rest/test-api/Action/TagVisitsTest.php +++ b/module/Rest/test-api/Action/TagVisitsTest.php @@ -17,11 +17,11 @@ class TagVisitsTest extends ApiTestCase public function expectedVisitsAreReturned( string $apiKey, string $tag, - bool $excludeBots, + array $query, int $expectedVisitsAmount, ): void { $resp = $this->callApiWithKey(self::METHOD_GET, sprintf('/tags/%s/visits', $tag), [ - RequestOptions::QUERY => $excludeBots ? ['excludeBots' => true] : [], + RequestOptions::QUERY => $query, ], $apiKey); $payload = $this->getJsonResponsePayload($resp); @@ -33,16 +33,18 @@ class TagVisitsTest extends ApiTestCase public static function provideTags(): iterable { - yield 'foo with admin API key' => ['valid_api_key', 'foo', false, 5]; - yield 'foo with admin API key and no bots' => ['valid_api_key', 'foo', true, 4]; - yield 'bar with admin API key' => ['valid_api_key', 'bar', false, 2]; - yield 'bar with admin API key and no bots' => ['valid_api_key', 'bar', true, 1]; - yield 'baz with admin API key' => ['valid_api_key', 'baz', false, 0]; - yield 'foo with author API key' => ['author_api_key', 'foo', false, 5]; - yield 'foo with author API key and no bots' => ['author_api_key', 'foo', true, 4]; - yield 'bar with author API key' => ['author_api_key', 'bar', false, 2]; - yield 'bar with author API key and no bots' => ['author_api_key', 'bar', true, 1]; - yield 'foo with domain API key' => ['domain_api_key', 'foo', false, 0]; + yield 'foo with admin API key' => ['valid_api_key', 'foo', [], 5]; + yield 'foo with admin API key and no bots' => ['valid_api_key', 'foo', ['excludeBots' => true], 4]; + yield 'bar with admin API key' => ['valid_api_key', 'bar', [], 2]; + yield 'bar with admin API key and no bots' => ['valid_api_key', 'bar', ['excludeBots' => true], 1]; + yield 'baz with admin API key' => ['valid_api_key', 'baz', [], 0]; + yield 'foo with author API key' => ['author_api_key', 'foo', [], 5]; + yield 'foo with author API key and no bots' => ['author_api_key', 'foo', ['excludeBots' => true], 4]; + yield 'bar with author API key' => ['author_api_key', 'bar', [], 2]; + yield 'bar with author API key and no bots' => ['author_api_key', 'bar', ['excludeBots' => true], 1]; + yield 'foo with domain API key' => ['domain_api_key', 'foo', [], 0]; + yield 'foo with specific domain' => ['valid_api_key', 'foo', ['domain' => 'example.com'], 0]; + yield 'foo with default domain' => ['valid_api_key', 'foo', ['domain' => 'DEFAULT'], 5]; } #[Test, DataProvider('provideApiKeysAndTags')] diff --git a/module/Rest/test-api/Fixtures/VisitsFixture.php b/module/Rest/test-api/Fixtures/VisitsFixture.php index e10b6dab..76954ebf 100644 --- a/module/Rest/test-api/Fixtures/VisitsFixture.php +++ b/module/Rest/test-api/Fixtures/VisitsFixture.php @@ -58,20 +58,32 @@ class VisitsFixture extends AbstractFixture implements DependentFixtureInterface Visitor::fromParams('shlink-tests-agent', 'https://app.shlink.io', ''), )); + // Orphan visits (s.test is the default domain in tests env) $manager->persist($this->setVisitDate( - fn () => Visit::forBasePath(Visitor::fromParams('shlink-tests-agent', 'https://s.test', '1.2.3.4')), + fn () => Visit::forBasePath(Visitor::fromParams( + 'shlink-tests-agent', + 'https://s.test', + '1.2.3.4', + visitedUrl: 'https://s.test/foo', + )), '2020-01-01', )); $manager->persist($this->setVisitDate( - fn () => Visit::forRegularNotFound( - Visitor::fromParams('shlink-tests-agent', 'https://s.test/foo/bar', '1.2.3.4'), - ), + fn () => Visit::forRegularNotFound(Visitor::fromParams( + 'shlink-tests-agent', + 'https://s.test/foo/bar', + '1.2.3.4', + visitedUrl: 'https://s.test/bar', + )), '2020-02-01', )); $manager->persist($this->setVisitDate( - fn () => Visit::forInvalidShortUrl( - Visitor::fromParams('cf-facebook', 'https://s.test/foo', '1.2.3.4', 'foo.com'), - ), + fn () => Visit::forInvalidShortUrl(Visitor::fromParams( + 'cf-facebook', + 'https://s.test/foo', + '1.2.3.4', + visitedUrl: 'https://example.com/short', + )), '2020-03-01', ));