decoration)->toBe($decoration) ->and($picture->thumbnail)->toBe($thumbnail) ->and($picture->mobileThumbnail)->toBe($mobileThumbnail); })->with(['jpg', 'jpeg']); it('refuses files that are not jpg', function (string $decoration, string $thumbnail, string $mobileThumbnail, string $invalid): void { // GIVEN $decorationPath = new PicturePath($decoration); $thumbnailPath = new PicturePath($thumbnail); $mobileThumbnailPath = new PicturePath($mobileThumbnail); // WHEN $build = fn (): CouponPicture => new CouponPicture($decorationPath, $thumbnailPath, $mobileThumbnailPath); // THEN expect($build)->toThrow(\DomainException::class, sprintf('Coupon picture "%s" must be a JPG file.', $invalid)); })->with([ 'decoration' => ['files/decoration.png', 'files/thumbnail.jpg', 'files/mobile_thumbnail.jpg', 'files/decoration.png'], 'thumbnail' => ['files/decoration.jpg', 'files/thumbnail.webp', 'files/mobile_thumbnail.jpg', 'files/thumbnail.webp'], 'mobile thumbnail' => ['files/decoration.jpg', 'files/thumbnail.jpg', 'files/mobile_thumbnail.png', 'files/mobile_thumbnail.png'], ]); it('creates a picture when the decoration is 280 x 260', function (): void { // GIVEN $decoration = new PicturePath('tests/Fixtures/Coupon/decoration.jpg'); $thumbnail = new PicturePath('files/thumbnail.jpg'); $mobileThumbnail = new PicturePath('files/mobile_thumbnail.jpg'); // WHEN $picture = CouponPicture::create($decoration, $thumbnail, $mobileThumbnail); // THEN expect($picture->decoration)->toBe($decoration) ->and($picture->thumbnail)->toBe($thumbnail) ->and($picture->mobileThumbnail)->toBe($mobileThumbnail); }); it('refuses a decoration with the wrong size', function (): void { // GIVEN $decoration = new PicturePath('tests/Fixtures/Coupon/invalid_decoration.jpg'); $thumbnail = new PicturePath('files/thumbnail.jpg'); $mobileThumbnail = new PicturePath('files/mobile_thumbnail.jpg'); // WHEN $create = fn (): CouponPicture => CouponPicture::create($decoration, $thumbnail, $mobileThumbnail); // THEN expect($create)->toThrow(\DomainException::class, 'The decoration picture must be 280 x 260 px'); }); it('refuses a decoration file that does not exist', function (): void { // GIVEN $decoration = new PicturePath('files/missing.jpg'); $thumbnail = new PicturePath('files/thumbnail.jpg'); $mobileThumbnail = new PicturePath('files/mobile_thumbnail.jpg'); // WHEN $create = fn (): CouponPicture => CouponPicture::create($decoration, $thumbnail, $mobileThumbnail); // THEN expect($create)->toThrow(\DomainException::class, 'Unable to read the decoration picture "files/missing.jpg".'); }); });