From 43a5c223d592c867f876da739758f0369521548d Mon Sep 17 00:00:00 2001 From: Joseph Bielawski Date: Mon, 16 Feb 2026 21:37:38 +0100 Subject: [PATCH] Simplify `ScreenshotHelper::slugifyUrl()` --- src/Screenshot/ScreenshotHelper.php | 26 ++++--------- .../Unit/Screenshot/ScreenshotHelperTest.php | 37 +++++++++---------- 2 files changed, 24 insertions(+), 39 deletions(-) diff --git a/src/Screenshot/ScreenshotHelper.php b/src/Screenshot/ScreenshotHelper.php index 3fca420..12ba5dc 100644 --- a/src/Screenshot/ScreenshotHelper.php +++ b/src/Screenshot/ScreenshotHelper.php @@ -55,11 +55,7 @@ public static function generateFilename(string $url, string $directory, string $ */ public static function slugifyUrl(string $url, int $maxLength = 40): string { - $slug = preg_replace('/^https?:\/\//', '', $url); - - if (is_string($slug)) { - $slug = preg_replace('/^www\./', '', $slug); - } + $slug = preg_replace('#^(https?://)?(www\.)?#i', '', $url); if (null === $slug) { $slug = 'invalid-url'; } @@ -67,23 +63,15 @@ public static function slugifyUrl(string $url, int $maxLength = 40): string $slug = preg_replace('/[^a-zA-Z0-9]+/', '-', $slug); if (null === $slug) { $slug = 'invalid-url'; + } else { + $slug = trim($slug, '-'); + $slug = strtolower($slug); } - $slug = trim($slug, '-'); - - $slug = strtolower($slug); - - if (strlen($slug) > $maxLength) { - $slug = substr($slug, 0, $maxLength); - - $slug = rtrim($slug, '-'); - } - - if (empty($slug)) { - $slug = 'screenshot'; - } + $slug = substr($slug, 0, $maxLength); + $slug = rtrim($slug, '-'); - return $slug; + return $slug ?: 'screenshot'; } /** diff --git a/tests/Unit/Screenshot/ScreenshotHelperTest.php b/tests/Unit/Screenshot/ScreenshotHelperTest.php index 5210773..27c43f4 100644 --- a/tests/Unit/Screenshot/ScreenshotHelperTest.php +++ b/tests/Unit/Screenshot/ScreenshotHelperTest.php @@ -15,6 +15,7 @@ namespace Playwright\Tests\Unit\Screenshot; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Playwright\Screenshot\ScreenshotHelper; @@ -37,30 +38,26 @@ protected function tearDown(): void } } - public function testSlugifyUrl(): void + #[DataProvider('provideUrls')] + public function testSlugifyUrl(string $input, string $expected, int $maxLength = 40): void { - $testCases = [ + $result = ScreenshotHelper::slugifyUrl($input, $maxLength); + $this->assertSame($expected, $result, "Failed for input: $input"); + } + + public static function provideUrls(): array + { + return [ ['https://example.com', 'example-com'], ['https://www.github.com/user/repo', 'github-com-user-repo'], ['http://api.service.com/v1/users?id=123', 'api-service-com-v1-users-id-123'], ['https://sub.domain.co.uk/path/file.html', 'sub-domain-co-uk-path-file-html'], ['invalid-chars!@#$%^&*()', 'invalid-chars'], + ['!@#$%^&*()', 'screenshot'], ['', 'screenshot'], + ['https://sub.domain.co.uk/path/file.html', 'sub-domain', 11], + ['https://example.com/very-long-path-that-exceeds-the-maximum-length-limit', 'example-com-very-lon', 20], ]; - - foreach ($testCases as [$input, $expected]) { - $result = ScreenshotHelper::slugifyUrl($input); - $this->assertEquals($expected, $result, "Failed for input: $input"); - } - } - - public function testSlugifyUrlWithMaxLength(): void - { - $longUrl = 'https://example.com/very-long-path-that-exceeds-the-maximum-length-limit'; - $result = ScreenshotHelper::slugifyUrl($longUrl, 20); - - $this->assertLessThanOrEqual(20, strlen($result)); - $this->assertEquals('example-com-very-lon', $result); } public function testGenerateFilename(): void @@ -75,7 +72,7 @@ public function testGenerateFilename(): void ); $this->assertDirectoryExists($this->testDir); - $this->assertEquals($this->testDir.'/'.$basename, $filename); + $this->assertSame($this->testDir.'/'.$basename, $filename); } public function testGenerateFilenameCreatesDirectory(): void @@ -118,7 +115,7 @@ public function testGetDirectoryInfoEmpty(): void 'newestFile' => null, ]; - $this->assertEquals($expected, $info); + $this->assertSame($expected, $info); } public function testGetDirectoryInfoWithFiles(): void @@ -152,7 +149,7 @@ public function testCleanupOldScreenshots(): void $cleaned = ScreenshotHelper::cleanupOldScreenshots($this->testDir, 3600); - $this->assertEquals(1, $cleaned); + $this->assertSame(1, $cleaned); $this->assertFileDoesNotExist($oldFile); $this->assertFileExists($newFile); } @@ -168,7 +165,7 @@ public function testCleanupOldScreenshotsByCount(): void $cleaned = ScreenshotHelper::cleanupOldScreenshots($this->testDir, 86400, 3); - $this->assertEquals(2, $cleaned); + $this->assertSame(2, $cleaned); $remaining = glob($this->testDir.'/*.png'); $this->assertCount(3, $remaining);