From 6daa0013886e185fa611deca02e67c2ab951b8d7 Mon Sep 17 00:00:00 2001 From: Yutaka Kurosaki <> Date: Sat, 9 May 2026 10:38:19 +0900 Subject: [PATCH] Scaffold MediaUrlResolver with null fallback Initial skeleton returning null for any non-media URL. Subsequent commits add detection for video, audio, YouTube, and Vimeo. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/app/Markdown/MediaUrlResolver.php | 14 +++++++ .../Unit/Markdown/MediaUrlResolverTest.php | 38 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/app/Markdown/MediaUrlResolver.php create mode 100644 src/tests/Unit/Markdown/MediaUrlResolverTest.php diff --git a/src/app/Markdown/MediaUrlResolver.php b/src/app/Markdown/MediaUrlResolver.php new file mode 100644 index 0000000..1fd476d --- /dev/null +++ b/src/app/Markdown/MediaUrlResolver.php @@ -0,0 +1,14 @@ +resolver = new MediaUrlResolver(); + } + + #[DataProvider('nonMediaUrls')] + public function test_returns_null_for_non_media_urls(string $url): void + { + $this->assertNull($this->resolver->resolve($url)); + } + + public static function nonMediaUrls(): array + { + return [ + 'normal image' => ['/photo.jpg'], + 'svg' => ['/icon.svg'], + 'png' => ['/avatar.png'], + 'no extension' => ['/foo'], + 'empty string' => [''], + 'javascript scheme' => ['javascript:alert(1)'], + 'host-only' => ['http://'], + 'youtu.be lookalike host' => ['https://example.com/youtu.be-fake/abc'], + ]; + } +}