diff --git a/resources/views/show.blade.php b/resources/views/show.blade.php
index fa47e61..9c870e7 100644
--- a/resources/views/show.blade.php
+++ b/resources/views/show.blade.php
@@ -30,9 +30,9 @@
@endif
- @if($cover = $post->getFirstMedia('cover'))
+ @if($url = $post->coverImageUrl())
-
+
@endif
{{ $post->title }}
diff --git a/tests/Feature/AdminPagesTest.php b/tests/Feature/AdminPagesTest.php
index 77b7b49..b22998c 100644
--- a/tests/Feature/AdminPagesTest.php
+++ b/tests/Feature/AdminPagesTest.php
@@ -50,6 +50,15 @@ class AdminPagesTest extends TestCase
$this->actingAs($this->admin)->get('/admin/media')->assertOk();
}
+ public function test_media_library_resource_loads(): void
+ {
+ $this->actingAs($this->admin)->get('/admin/media-library')->assertOk();
+ $this->actingAs($this->admin)->get('/admin/media-folders')->assertOk();
+ $this->actingAs($this->admin)->get('/admin/posts/create')
+ ->assertOk()
+ ->assertSee('media:ID', false);
+ }
+
public function test_plugin_and_payment_pages_load(): void
{
$this->actingAs($this->admin)->get('/admin/plugins')->assertOk();
diff --git a/tests/Feature/MarkdownMediaLibraryTest.php b/tests/Feature/MarkdownMediaLibraryTest.php
new file mode 100644
index 0000000..f4d249f
--- /dev/null
+++ b/tests/Feature/MarkdownMediaLibraryTest.php
@@ -0,0 +1,113 @@
+createLibraryImage(12, 'Hero shot');
+ $post = Post::query()->create([
+ 'user_id' => User::factory()->create()->id,
+ 'title' => 'Media embed post',
+ 'slug' => 'media-embed-post',
+ 'content' => "Intro\n\n\n",
+ 'content_format' => 'markdown',
+ 'status' => 'published',
+ 'published_at' => now()->subMinute(),
+ ]);
+
+ $html = app(PostContentRenderer::class)->render($post);
+
+ $this->assertStringContainsString((string) $media->url, $html);
+ $this->assertStringContainsString('
assertStringNotContainsString('media:'.$media->id, $html);
+ $this->assertStringContainsString("", (string) $post->fresh()->content);
+ }
+
+ public function test_html_body_hydrates_media_shortcode(): void
+ {
+ $media = $this->createLibraryImage(21, 'Inline');
+ $post = Post::query()->create([
+ 'title' => 'HTML media post',
+ 'content' => '
see [media='.$media->id.']
', + 'content_format' => 'html', + 'status' => 'published', + 'published_at' => now()->subMinute(), + ]); + + $html = app(PostContentRenderer::class)->render($post); + + $this->assertStringContainsString((string) $media->url, $html); + $this->assertStringNotContainsString('[media='.$media->id.']', $html); + } + + public function test_published_post_page_shows_library_image(): void + { + $media = $this->createLibraryImage(33, 'Cover art'); + $post = Post::query()->create([ + 'title' => 'Visible media post', + 'slug' => 'visible-media-post', + 'content' => "", + 'content_format' => 'markdown', + 'status' => 'published', + 'published_at' => now()->subMinute(), + 'cover_media_id' => $media->id, + ]); + + $this->get('/posts/'.$post->slug.'.shtml') + ->assertOk() + ->assertSee((string) $media->url, false) + ->assertDontSee('media:'.$media->id, false); + + $this->assertSame((string) $media->url, $post->fresh()->coverImageUrl()); + } + + public function test_missing_media_reference_does_not_crash_render(): void + { + $post = Post::query()->create([ + 'title' => 'Broken media post', + 'content' => '', + 'content_format' => 'markdown', + 'status' => 'published', + 'published_at' => now()->subMinute(), + ]); + + $html = app(PostContentRenderer::class)->render($post); + + $this->assertIsString($html); + $this->assertStringContainsString('media:99999', $html); + } + + private function createLibraryImage(int $id, string $alt): MediaLibrary + { + $media = new MediaLibrary; + $media->forceFill([ + 'id' => $id, + 'disk' => 'public', + 'path' => 'media/library/articles/image/test-'.$id.'.jpg', + 'original_name' => 'test-'.$id.'.jpg', + 'extension' => 'jpg', + 'mime_type' => 'image/jpeg', + 'size' => 128, + 'type' => MediaLibrary::TYPE_IMAGE, + 'source' => MediaLibrary::SOURCE_ADMIN, + 'folder' => 'articles', + 'alt_text' => $alt, + ]); + $media->save(); + + return $media->fresh(); + } +} diff --git a/tests/Unit/MarkdownMediaEmbedTest.php b/tests/Unit/MarkdownMediaEmbedTest.php new file mode 100644 index 0000000..4aa9787 --- /dev/null +++ b/tests/Unit/MarkdownMediaEmbedTest.php @@ -0,0 +1,57 @@ + 'Hero shot', + 'type' => MediaLibrary::TYPE_IMAGE, + 'mime_type' => 'image/jpeg', + 'original_name' => 'hero.jpg', + 'path' => 'media/library/articles/hero.jpg', + ]); + $media->id = 12; + + $snippet = app(MarkdownMediaEmbed::class)->snippet($media, 'markdown'); + + $this->assertSame('', $snippet); + $this->assertStringNotContainsString('http', $snippet); + $this->assertStringNotContainsString('/storage/', $snippet); + } + + public function test_markdown_file_snippet_is_a_link_reference(): void + { + $media = new MediaLibrary([ + 'alt_text' => '', + 'type' => MediaLibrary::TYPE_FILE, + 'mime_type' => 'application/pdf', + 'original_name' => 'notes.pdf', + 'path' => 'media/library/articles/notes.pdf', + ]); + $media->id = 8; + + $this->assertSame('[notes.pdf](media:8)', app(MarkdownMediaEmbed::class)->snippet($media, 'markdown')); + } + + public function test_html_snippet_uses_shortcode(): void + { + $media = new MediaLibrary([ + 'type' => MediaLibrary::TYPE_IMAGE, + 'mime_type' => 'image/png', + 'original_name' => 'pic.png', + 'path' => 'pic.png', + ]); + $media->id = 3; + + $this->assertSame('[media=3]', app(MarkdownMediaEmbed::class)->snippet($media, 'html')); + } +} diff --git a/themes/sablog/views/list.blade.php b/themes/sablog/views/list.blade.php index 0b583a1..aea5daa 100644 --- a/themes/sablog/views/list.blade.php +++ b/themes/sablog/views/list.blade.php @@ -9,10 +9,10 @@