put('content/hero.jpg', (string) $manager->create(1600, 900)->toJpeg());
ResponsiveImage::generate('content/hero.jpg', 'public');
Storage::disk('public')->put('content/below.jpg', (string) $manager->create(1200, 800)->toJpeg());
ResponsiveImage::generate('content/below.jpg', 'public');
$hero = Blade::render(
''
);
$below = Blade::render(
''
);
$this->assertStringContainsString('loading="eager"', $hero);
$this->assertStringNotContainsString('loading="lazy"', $hero);
$this->assertStringContainsString('alt="Hero Amare"', $hero);
$this->assertStringContainsString('srcset=', $hero);
$this->assertStringContainsString('sizes="100vw"', $hero);
$this->assertStringContainsString('width="', $hero);
$this->assertStringContainsString('height="', $hero);
$this->assertStringContainsString('loading="lazy"', $below);
$this->assertStringContainsString('alt="Galeria"', $below);
$this->assertStringContainsString('srcset=', $below);
$this->assertStringContainsString('sizes="', $below);
}
public function test_missing_variants_fall_back_to_original_without_srcset(): void
{
Storage::fake('public');
$manager = new ImageManager(new Driver);
Storage::disk('public')->put('content/legacy.jpg', (string) $manager->create(800, 600)->toJpeg());
$html = Blade::render(
''
);
$this->assertStringContainsString('alt="Legado"', $html);
$this->assertStringContainsString('loading="lazy"', $html);
$this->assertStringNotContainsString('srcset=', $html);
$this->assertStringNotContainsString('put('content/hero.jpg', (string) $manager->create(1600, 900)->toJpeg());
ResponsiveImage::generate('content/hero.jpg', 'public');
$html = Blade::render(
''
);
$this->assertStringContainsString('assertStringContainsString('content/hero-720.jpg.webp 720w', $html);
// `display: contents` keeps the wrapper out of the layout — callers style
// the img against the grid or flex parent, and an inline would
// break `h-full`.
$this->assertStringContainsString('', $html);
// The source is a preference, not a replacement: the img keeps the
// original format for anything that cannot decode webp.
$this->assertStringContainsString('src="/storage/content/hero.jpg"', $html);
$this->assertStringContainsString('content/hero-720.jpg 720w', $html);
$this->assertStringContainsString('sizes="100vw"', $html);
}
public function test_media_without_webp_siblings_renders_a_bare_image(): void
{
Storage::fake('public');
$manager = new ImageManager(new Driver);
Storage::disk('public')->put('content/partial.jpg', (string) $manager->create(1600, 900)->toJpeg());
// Variants from before webp support: the original format only.
foreach (ResponsiveImage::WIDTHS as $width) {
Storage::disk('public')->put(
ResponsiveImage::variantPath('content/partial.jpg', $width),
(string) $manager->create(1600, 900)->toJpeg()
);
}
$html = Blade::render('');
$this->assertStringContainsString('srcset=', $html);
$this->assertStringNotContainsString('assertStringNotContainsString('image/webp', $html);
}
public function test_render_consults_responsive_metadata_once(): void
{
Storage::fake('public');
Cache::shouldReceive('get')
->once()
->with(Mockery::type('string'))
->andReturn([
'width' => 1600,
'height' => 900,
'variants' => [['path' => 'content/cached-component-720.jpg', 'width' => 720]],
'webp_variants' => [['path' => 'content/cached-component-720.jpg.webp', 'width' => 720]],
]);
$html = Blade::render('');
$this->assertStringContainsString('content/cached-component-720.jpg 720w', $html);
$this->assertStringContainsString('content/cached-component-720.jpg.webp 720w', $html);
$this->assertStringContainsString('width="1600"', $html);
$this->assertStringContainsString('height="900"', $html);
}
}