diff options
Diffstat (limited to 'tests')
3 files changed, 152 insertions, 4 deletions
diff --git a/tests/app/Http/Middleware/CheckForMaintenanceModeTest.php b/tests/app/Http/Middleware/CheckForMaintenanceModeTest.php index c2d45d7c56..a047f552ac 100644 --- a/tests/app/Http/Middleware/CheckForMaintenanceModeTest.php +++ b/tests/app/Http/Middleware/CheckForMaintenanceModeTest.php @@ -20,6 +20,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Middleware; use Fig\Http\Message\StatusCodeInterface; +use Fisharebest\Webtrees\Services\MaintenanceModeService; use Fisharebest\Webtrees\TestCase; use PHPUnit\Framework\Attributes\CoversClass; use Psr\Http\Server\RequestHandlerInterface; @@ -29,13 +30,33 @@ use function response; #[CoversClass(CheckForMaintenanceMode::class)] class CheckForMaintenanceModeTest extends TestCase { - public function testMiddleware(): void + public function testSiteIsOffline(): void { $handler = $this->createMock(RequestHandlerInterface::class); $handler->method('handle')->willReturn(response()); + $maintenance_mode_service = $this->createMock(MaintenanceModeService::class); + $maintenance_mode_service->method('isOffline')->willReturn(true); + $maintenance_mode_service->method('message')->willReturn('XYZZY'); + + $request = self::createRequest(); + $middleware = new CheckForMaintenanceMode($maintenance_mode_service); + $response = $middleware->process($request, $handler); + + self::assertSame(StatusCodeInterface::STATUS_SERVICE_UNAVAILABLE, $response->getStatusCode()); + self::assertStringContainsString('XYZZY', $response->getBody()->getContents()); + } + + public function testSiteIsOnline(): void + { + $handler = $this->createMock(RequestHandlerInterface::class); + $handler->method('handle')->willReturn(response()); + + $maintenance_mode_service = $this->createMock(MaintenanceModeService::class); + $maintenance_mode_service->method('isOffline')->willReturn(false); + $request = self::createRequest(); - $middleware = new CheckForMaintenanceMode(); + $middleware = new CheckForMaintenanceMode($maintenance_mode_service); $response = $middleware->process($request, $handler); self::assertSame(StatusCodeInterface::STATUS_NO_CONTENT, $response->getStatusCode()); diff --git a/tests/app/Http/RequestHandlers/UpgradeWizardStepTest.php b/tests/app/Http/RequestHandlers/UpgradeWizardStepTest.php index 4b9c747a5a..030a7135fa 100644 --- a/tests/app/Http/RequestHandlers/UpgradeWizardStepTest.php +++ b/tests/app/Http/RequestHandlers/UpgradeWizardStepTest.php @@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Exceptions\HttpServerErrorException; use Fisharebest\Webtrees\Services\GedcomExportService; use Fisharebest\Webtrees\Services\GedcomImportService; +use Fisharebest\Webtrees\Services\MaintenanceModeService; use Fisharebest\Webtrees\Services\PhpService; use Fisharebest\Webtrees\Services\TimeoutService; use Fisharebest\Webtrees\Services\TreeService; @@ -45,8 +46,9 @@ class UpgradeWizardStepTest extends TestCase { $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), new TreeService(new GedcomImportService()), - new UpgradeService(new TimeoutService(php_service: new PhpService())) + new UpgradeService(new TimeoutService(php_service: new PhpService())), ); $request = self::createRequest(RequestMethodInterface::METHOD_POST, ['step' => 'Invalid']); @@ -62,6 +64,7 @@ class UpgradeWizardStepTest extends TestCase $mock_upgrade_service->method('latestVersion')->willReturn('999.999.999'); $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), new TreeService(new GedcomImportService()), $mock_upgrade_service ); @@ -80,6 +83,7 @@ class UpgradeWizardStepTest extends TestCase $mock_upgrade_service->method('latestVersion')->willReturn(''); $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), new TreeService(new GedcomImportService()), $mock_upgrade_service ); @@ -96,6 +100,7 @@ class UpgradeWizardStepTest extends TestCase $mock_upgrade_service->method('latestVersion')->willReturn('0.0.0'); $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), new TreeService(new GedcomImportService()), $mock_upgrade_service ); @@ -108,6 +113,7 @@ class UpgradeWizardStepTest extends TestCase { $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), new TreeService(new GedcomImportService()), new UpgradeService(new TimeoutService(php_service: new PhpService())) ); @@ -122,6 +128,7 @@ class UpgradeWizardStepTest extends TestCase { $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), new TreeService(new GedcomImportService()), new UpgradeService(new TimeoutService(php_service: new PhpService())) ); @@ -143,6 +150,7 @@ class UpgradeWizardStepTest extends TestCase $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), new TreeService(new GedcomImportService()), new UpgradeService(new TimeoutService(php_service: new PhpService())) ); @@ -162,6 +170,7 @@ class UpgradeWizardStepTest extends TestCase $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), $tree_service, new UpgradeService(new TimeoutService(php_service: new PhpService())) ); @@ -182,9 +191,10 @@ class UpgradeWizardStepTest extends TestCase $this->expectException(HttpServerErrorException::class); $mock_upgrade_service = $this->createMock(UpgradeService::class); - $mock_upgrade_service->method('downloadFile')->will(self::throwException(new Exception())); + $mock_upgrade_service->method('downloadFile')->will($this->throwException(new Exception())); $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), new TreeService(new GedcomImportService()), $mock_upgrade_service ); @@ -199,6 +209,7 @@ class UpgradeWizardStepTest extends TestCase $mock_upgrade_service->method('downloadFile')->willReturn(123456); $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), new TreeService(new GedcomImportService()), $mock_upgrade_service ); @@ -215,6 +226,7 @@ class UpgradeWizardStepTest extends TestCase $mock_upgrade_service->method('webtreesZipContents')->willReturn(new Collection()); $handler = new UpgradeWizardStep( new GedcomExportService(new Psr17Factory(), new Psr17Factory()), + new MaintenanceModeService(__DIR__ . '/../../../data/'), new TreeService(new GedcomImportService()), $mock_upgrade_service ); diff --git a/tests/app/Services/MaintenanceModeServiceTest.php b/tests/app/Services/MaintenanceModeServiceTest.php new file mode 100644 index 0000000000..6e11385e59 --- /dev/null +++ b/tests/app/Services/MaintenanceModeServiceTest.php @@ -0,0 +1,115 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2025 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Services; + +use Fisharebest\Webtrees\TestCase; +use InvalidArgumentException; +use PHPUnit\Framework\Attributes\CoversClass; + +use function file_put_contents; + +#[CoversClass(MaintenanceModeService::class)] +class MaintenanceModeServiceTest extends TestCase +{ + private const string TEST_DATA_DIR = __DIR__ . '/../../data/'; + + public function testInvalidFolder(): void + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage(__DIR__ . '/non-existent does not exist'); + + new MaintenanceModeService(__DIR__ . '/non-existent'); + } + + public function testOfflineAndOnline(): void + { + $service = new MaintenanceModeService(self::TEST_DATA_DIR); + + $this->assertFalse($service->isOffline()); + + $service->offline(); + + $this->assertTrue($service->isOffline()); + + $service->online(); + + $this->assertFalse($service->isOffline()); + } + + public function testMessage(): void + { + $service = new MaintenanceModeService(self::TEST_DATA_DIR); + + $service->offline('foo bar'); + + $this->assertSame('foo bar', $service->message()); + + $service->online(); + } + + public function testOfflineFileIsAFolder(): void + { + $service = new MaintenanceModeService(self::TEST_DATA_DIR); + + mkdir(self::TEST_DATA_DIR . 'offline.txt', 0777, true); + + $this->assertTrue($service->isOffline()); + $this->assertSame('', $service->message()); + + $service->online(); + + $this->assertFalse($service->isOffline()); + } + + public function testOfflineFileIsUnreadable(): void + { + $service = new MaintenanceModeService(self::TEST_DATA_DIR); + + file_put_contents(self::TEST_DATA_DIR . 'offline.txt', 'foo'); + chmod(self::TEST_DATA_DIR . 'offline.txt', 0); + + $this->assertTrue($service->isOffline()); + $this->assertSame('', $service->message()); + + $service->online(); + + $this->assertFalse($service->isOffline()); + } + + public function testOfflineFileIsSymbolicLink(): void + { + $service = new MaintenanceModeService(self::TEST_DATA_DIR); + + file_put_contents(self::TEST_DATA_DIR . 'foo', 'foo'); + symlink(self::TEST_DATA_DIR . 'foo', self::TEST_DATA_DIR . 'offline.txt'); + + $this->assertTrue($service->isOffline()); + $this->assertSame('foo', $service->message()); + + unlink(self::TEST_DATA_DIR . 'foo'); + + $this->assertTrue($service->isOffline()); + $this->assertSame('', $service->message()); + + $service->online(); + + $this->assertFalse($service->isOffline()); + } +} |
