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); } }