Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com), and this project adheres to [Semantic Versioning](https://semver.org).

## [Unreleased]
### Added
* *Nothing*

### Changed
* [#2573](https://github.com/shlinkio/shlink/issues/2573) Update to PHPUnit 13

### Deprecated
* *Nothing*

### Removed
* *Nothing*

### Fixed
* *Nothing*


## [5.0.0] - 2026-01-09
### Added
* [#2431](https://github.com/shlinkio/shlink/issues/2431) Add new date-based conditions for the dynamic rules redirections system, that allow to perform redirections based on an ISO-8601 date value.
Expand Down
23 changes: 10 additions & 13 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@
"pagerfanta/core": "^3.8",
"ramsey/uuid": "^4.7",
"shlinkio/doctrine-specification": "^2.2",
"shlinkio/shlink-common": "dev-main#d4ae052 as 8.0.0",
"shlinkio/shlink-config": "dev-main#fb186e4 as 4.1.0",
"shlinkio/shlink-event-dispatcher": "dev-main#54d4701 as 4.4.0",
"shlinkio/shlink-importer": "dev-main#63753cf as 5.7.0",
"shlinkio/shlink-installer": "dev-develop#a225b16 as 10.0.0",
"shlinkio/shlink-ip-geolocation": "dev-main#e0c45b2 as 5.0.0",
"shlinkio/shlink-common": "^8.0.0",
"shlinkio/shlink-config": "^4.1.0",
"shlinkio/shlink-event-dispatcher": "^4.4.0",
"shlinkio/shlink-importer": "^5.7.0",
"shlinkio/shlink-installer": "^10.0.0",
"shlinkio/shlink-ip-geolocation": "^5.0.0",
"shlinkio/shlink-json": "^1.3",
"spiral/roadrunner": "^2025.1",
"spiral/roadrunner-cli": "^2.7",
Expand All @@ -65,17 +65,14 @@
"phpstan/phpstan-doctrine": "^2.0",
"phpstan/phpstan-phpunit": "^2.0.5",
"phpstan/phpstan-symfony": "^2.0",
"phpunit/php-code-coverage": "^12.0",
"phpunit/phpcov": "^11.0",
"phpunit/phpunit": "^12.0.10",
"phpunit/php-code-coverage": "^13.0",
"phpunit/phpcov": "^12.0",
"phpunit/phpunit": "^13.0",
"shlinkio/php-coding-standard": "~2.5.0",
"shlinkio/shlink-test-utils": "^4.4",
"shlinkio/shlink-test-utils": "^4.5",
"symfony/var-dumper": "^8.0",
"veewee/composer-run-parallel": "^1.4"
},
"conflict": {
"symfony/var-exporter": ">=6.3.9,<=6.4.0"
},
"autoload": {
"psr-4": {
"Shlinkio\\Shlink\\CLI\\": "module/CLI/src",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public function properShortCodeIsCreatedIfLongUrlIsCorrect(): void
$this->urlShortener->expects($this->once())->method('shorten')->withAnyParameters()->willReturn(
UrlShorteningResult::withoutErrorOnEventDispatching($shortUrl),
);
$this->stringifier->method('stringify')->with($shortUrl)->willReturn('stringified_short_url');
$this->stringifier->method('stringify')->willReturnMap([[$shortUrl, 'stringified_short_url']]);

$this->commandTester->execute([
'long-url' => 'http://domain.com/foo/bar',
Expand All @@ -70,7 +70,7 @@ public function longUrlIsAskedIfNotProvided(): void
$this->urlShortener->expects($this->once())->method('shorten')->withAnyParameters()->willReturn(
UrlShorteningResult::withoutErrorOnEventDispatching($shortUrl),
);
$this->stringifier->method('stringify')->with($shortUrl)->willReturn('stringified_short_url');
$this->stringifier->method('stringify')->willReturnMap([[$shortUrl, 'stringified_short_url']]);

$this->commandTester->setInputs([$shortUrl->getLongUrl()]);
$this->commandTester->execute([]);
Expand Down Expand Up @@ -101,7 +101,7 @@ public function properlyProcessesProvidedTags(): void
return true;
}),
)->willReturn(UrlShorteningResult::withoutErrorOnEventDispatching($shortUrl));
$this->stringifier->method('stringify')->with($shortUrl)->willReturn('stringified_short_url');
$this->stringifier->method('stringify')->willReturnMap([[$shortUrl, 'stringified_short_url']]);

$this->commandTester->execute([
'long-url' => 'http://domain.com/foo/bar',
Expand Down
6 changes: 3 additions & 3 deletions module/CLI/test/RedirectRule/RedirectRuleHandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ public function newRulesCanBeAdded(
array $expectedConditions,
bool $continue = false,
): void {
$this->io->expects($this->any())->method('ask')->willReturnCallback(
$this->io->method('ask')->willReturnCallback(
fn (string $message): string|int => match ($message) {
'Rule priority (the lower the value, the higher the priority)' => 2, // Add in between existing rules
'Long URL to redirect when the rule matches' => 'https://example.com/new-two',
Expand All @@ -127,7 +127,7 @@ public function newRulesCanBeAdded(
default => '',
},
);
$this->io->expects($this->any())->method('choice')->willReturnCallback(
$this->io->method('choice')->willReturnCallback(
function (string $message) use (&$callIndex, $type): string {
$callIndex++;

Expand Down Expand Up @@ -241,7 +241,7 @@ function () use (&$callIndex): string {
#[Test]
public function existingRulesCanBeReArranged(): void
{
$this->io->expects($this->any())->method('ask')->willReturnCallback(
$this->io->method('ask')->willReturnCallback(
fn (string $message): string|int => match ($message) {
'Rule priority (the lower the value, the higher the priority)' => 1,
default => '',
Expand Down
2 changes: 0 additions & 2 deletions module/CLI/test/Util/CliTestUtils.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

namespace ShlinkioTest\Shlink\CLI\Util;

use PHPUnit\Framework\Assert;
use PHPUnit\Framework\MockObject\Generator\Generator;
use PHPUnit\Framework\MockObject\Stub;
use Symfony\Component\Console\Application;
Expand Down Expand Up @@ -32,7 +31,6 @@ public static function createCommandStub(string $name): Stub & Command
$command->method('isEnabled')->willReturn(true);
$command->method('getAliases')->willReturn([]);
$command->method('getDefinition')->willReturn(new InputDefinition());
$command->method('setApplication')->with(Assert::isInstanceOf(Application::class));

return $command;
}
Expand Down
6 changes: 2 additions & 4 deletions module/Core/test/Domain/DomainServiceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ public static function provideExcludedDomains(): iterable
#[Test, AllowMockObjectsWithoutExpectations]
public function getDomainThrowsExceptionWhenDomainIsNotFound(): void
{
$this->em->method('find')->with(Domain::class, '123')->willReturn(null);
$this->em->method('find')->willReturnMap([[Domain::class, '123', null]]);

$this->expectException(DomainNotFoundException::class);

Expand All @@ -122,7 +122,7 @@ public function getDomainThrowsExceptionWhenDomainIsNotFound(): void
public function getDomainReturnsEntityWhenFound(): void
{
$domain = Domain::withAuthority('');
$this->em->method('find')->with(Domain::class, '123')->willReturn($domain);
$this->em->method('find')->willReturnMap([[Domain::class, '123', $domain]]);

$result = $this->domainService->getDomain('123');

Expand All @@ -136,7 +136,6 @@ public function getOrCreateAlwaysPersistsDomain(Domain|null $foundDomain, ApiKey
$this->repo->expects($this->once())->method('findOneByAuthority')->with($authority, $apiKey)->willReturn(
$foundDomain,
);
$this->em->method('persist')->with($foundDomain ?? $this->isInstanceOf(Domain::class));

$result = $this->domainService->getOrCreate($authority, $apiKey);

Expand Down Expand Up @@ -168,7 +167,6 @@ public function configureNotFoundRedirectsConfiguresFetchedDomain(
$this->repo->expects($this->once())->method('findOneByAuthority')->with($authority, $apiKey)->willReturn(
$foundDomain,
);
$this->em->method('persist')->with($foundDomain ?? $this->isInstanceOf(Domain::class));

$result = $this->domainService->configureNotFoundRedirects($authority, NotFoundRedirects::withRedirects(
'foo.com',
Expand Down
2 changes: 1 addition & 1 deletion module/Core/test/Importer/ImportedLinksProcessorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ public function properAmountOfVisitsIsImported(
$this->em->expects($this->exactly($amountOfPersistedVisits + ($foundShortUrl === null ? 1 : 0)))->method(
'persist',
)->with($this->callback(fn (object $arg) => $arg instanceof ShortUrl || $arg instanceof Visit));
$this->em->expects($this->any())->method('find')->willReturn(null);
$this->em->method('find')->willReturn(null);
$this->io->expects($this->once())->method('text')->with($this->stringContains($expectedOutput));

$this->processor->process($this->io, ImportResult::withShortUrls([$importedUrl]), $this->buildParams());
Expand Down
17 changes: 7 additions & 10 deletions module/Core/test/Matomo/MatomoVisitSenderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,12 @@ public static function provideTrackerMethods(): iterable
#[Test, DataProvider('provideUrlsToTrack')]
public function properUrlIsTracked(Visit $visit, string $expectedTrackedUrl): void
{
$tracker = $this->createMock(MatomoTracker::class);
$tracker->expects($this->once())->method('setUrl')->with($expectedTrackedUrl)->willReturn($tracker);
$tracker->expects($this->once())->method('setUserAgent')->willReturn($tracker);
$tracker->expects($this->once())->method('setUrlReferrer')->willReturn($tracker);
$tracker->expects($this->any())->method('setCustomTrackingParameter')->willReturn($tracker);
$tracker->expects($this->once())->method('doTrackPageView');
$tracker->expects($this->once())->method('setForceVisitDateTime')->with(
$visit->date->setTimezone('UTC')->toDateTimeString(),
);
$tracker = $this->createStub(MatomoTracker::class);
$tracker->method('setUrl')->willReturn($tracker);
$tracker->method('setUserAgent')->willReturn($tracker);
$tracker->method('setUrlReferrer')->willReturn($tracker);
$tracker->method('setCustomTrackingParameter')->willReturn($tracker);
$tracker->method('doTrackPageView');

$this->trackerBuilder->expects($this->once())->method('buildMatomoTracker')->willReturn($tracker);

Expand Down Expand Up @@ -156,7 +153,7 @@ public function multipleVisitsCanBeSent(): void
$visitor = Visitor::empty();
$bot = Visitor::botInstance();

$this->visitIterationRepository->method('findAllVisits')->with($dateRange)->willReturn([
$this->visitIterationRepository->method('findAllVisits')->willReturn([
Visit::forBasePath($bot),
Visit::forValidShortUrl(ShortUrl::createFake(), $visitor),
Visit::forInvalidShortUrl($visitor),
Expand Down
3 changes: 3 additions & 0 deletions phpunit-api.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
cacheDirectory="build/.phpunit/api-tests.cache"
displayDetailsOnTestsThatTriggerWarnings="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnPhpunitNotices="true"
displayDetailsOnPhpunitDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
>
<testsuites>
<testsuite name="Shlink API tests">
Expand Down
3 changes: 3 additions & 0 deletions phpunit-cli.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
cacheDirectory="build/.phpunit/cli-tests.cache"
displayDetailsOnTestsThatTriggerWarnings="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnPhpunitNotices="true"
displayDetailsOnPhpunitDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
>
<testsuites>
<testsuite name="Shlink CLI tests">
Expand Down
3 changes: 3 additions & 0 deletions phpunit-db.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
cacheDirectory="build/.phpunit/db-tests.cache"
displayDetailsOnTestsThatTriggerWarnings="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnPhpunitNotices="true"
displayDetailsOnPhpunitDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
>
<testsuites>
<testsuite name="Shlink database tests">
Expand Down
1 change: 1 addition & 0 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
displayDetailsOnTestsThatTriggerWarnings="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnPhpunitNotices="true"
displayDetailsOnPhpunitDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
>
<testsuites>
Expand Down