From 3040a22c021795fdc45857c4f9d815e2c3fd480b Mon Sep 17 00:00:00 2001 From: wuuei <9289130+wuuei@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:33:00 +0100 Subject: [PATCH 1/4] Fix Matomo country logging by sending country code instead of country name Matomo expects the country code in lowercase for accurate logging and proper flag display --- module/Core/src/Matomo/MatomoVisitSender.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Core/src/Matomo/MatomoVisitSender.php b/module/Core/src/Matomo/MatomoVisitSender.php index 9fc0176a..94f25e2f 100644 --- a/module/Core/src/Matomo/MatomoVisitSender.php +++ b/module/Core/src/Matomo/MatomoVisitSender.php @@ -60,7 +60,7 @@ readonly class MatomoVisitSender implements MatomoVisitSenderInterface if ($location !== null) { $tracker ->setCity($location->cityName) - ->setCountry($location->countryName) + ->setCountry(strtolower($location->countryCode)) ->setLatitude($location->latitude) ->setLongitude($location->longitude); } From 5cd7305666ebf199d257ef64d1e863f37acb060d Mon Sep 17 00:00:00 2001 From: wuuei <9289130+wuuei@users.noreply.github.com> Date: Fri, 14 Mar 2025 15:20:49 +0000 Subject: [PATCH 2/4] Fix code style to resolve failing check --- module/Core/src/Matomo/MatomoVisitSender.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/Core/src/Matomo/MatomoVisitSender.php b/module/Core/src/Matomo/MatomoVisitSender.php index 94f25e2f..6a32c2a5 100644 --- a/module/Core/src/Matomo/MatomoVisitSender.php +++ b/module/Core/src/Matomo/MatomoVisitSender.php @@ -11,6 +11,8 @@ use Shlinkio\Shlink\Core\Visit\Entity\Visit; use Shlinkio\Shlink\Core\Visit\Repository\VisitIterationRepositoryInterface; use Throwable; +use function strtolower; + readonly class MatomoVisitSender implements MatomoVisitSenderInterface { public function __construct( From d273b561444067a88e198f25246b7c61c4e8013a Mon Sep 17 00:00:00 2001 From: wuuei <9289130+wuuei@users.noreply.github.com> Date: Fri, 14 Mar 2025 15:21:55 +0000 Subject: [PATCH 3/4] Lock "endroid/qr-code" to 6.0.3 so that unit tests complete --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index d23ec7cf..4a8c4e87 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "doctrine/migrations": "^3.8", "doctrine/orm": "^3.3", "donatj/phpuseragentparser": "^1.10", - "endroid/qr-code": "^6.0", + "endroid/qr-code": "<6.0.4", "friendsofphp/proxy-manager-lts": "^1.0", "geoip2/geoip2": "^3.1", "guzzlehttp/guzzle": "^7.9", From 1ceb38f50bd5f1e6dbb4bb79c3e807d2a7543813 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Fri, 14 Mar 2025 17:38:53 +0100 Subject: [PATCH 4/4] Test actual arguments set to matomo tracker when sending visits --- .../test/Matomo/MatomoVisitSenderTest.php | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/module/Core/test/Matomo/MatomoVisitSenderTest.php b/module/Core/test/Matomo/MatomoVisitSenderTest.php index 0acccd1d..7d66d868 100644 --- a/module/Core/test/Matomo/MatomoVisitSenderTest.php +++ b/module/Core/test/Matomo/MatomoVisitSenderTest.php @@ -43,6 +43,9 @@ class MatomoVisitSenderTest extends TestCase } #[Test, DataProvider('provideTrackerMethods')] + /** + * @param array $invokedMethods + */ public function visitIsSentToMatomo(Visit $visit, string|null $originalIpAddress, array $invokedMethods): void { $tracker = $this->createMock(MatomoTracker::class); @@ -66,8 +69,8 @@ class MatomoVisitSenderTest extends TestCase )->willReturn($tracker); } - foreach ($invokedMethods as $invokedMethod) { - $tracker->expects($this->once())->method($invokedMethod)->willReturn($tracker); + foreach ($invokedMethods as $invokedMethod => $args) { + $tracker->expects($this->once())->method($invokedMethod)->with(...$args)->willReturn($tracker); } $this->trackerBuilder->expects($this->once())->method('buildMatomoTracker')->willReturn($tracker); @@ -81,18 +84,28 @@ class MatomoVisitSenderTest extends TestCase yield 'located regular visit' => [ Visit::forValidShortUrl(ShortUrl::withLongUrl('https://shlink.io'), Visitor::empty()) ->locate(VisitLocation::fromGeolocation(new Location( - countryCode: 'countryCode', + countryCode: 'US', countryName: 'countryName', regionName: 'regionName', city: 'city', latitude: 123, - longitude: 123, + longitude: 456, timeZone: 'timeZone', ))), '1.2.3.4', - ['setCity', 'setCountry', 'setLatitude', 'setLongitude', 'setIp'], + [ + 'setCity' => ['city'], + 'setCountry' => ['us'], + 'setLatitude' => [123], + 'setLongitude' => [456], + 'setIp' => ['1.2.3.4'], + ], + ]; + yield 'fallback IP' => [ + Visit::forBasePath(Visitor::fromParams(remoteAddress: '5.6.7.8')), + null, + ['setIp' => ['5.6.7.0']], ]; - yield 'fallback IP' => [Visit::forBasePath(Visitor::fromParams(remoteAddress: '1.2.3.4')), null, ['setIp']]; } #[Test, DataProvider('provideUrlsToTrack')]