ec8f189b07
Часть 3a из 6. Чистое ядро под медийные баннеры, без БД/сети. - BannerSizes: 15 базовых размеров блоков медийной Яндекса (1×). - BannerGenerator::coverJpeg — GD cover-crop (масштаб+центр-обрезка) в ТОЧНЫЙ размер, JPEG с подбором качества под вес ≤512КБ; исключение на нечитаемой картинке. Логика повторяет ручной gen_banners.py (Pillow cover) владельца. Тесты: 5/5 зелёные (квадрат/широкий/высокий, точные пиксели, вес, ошибка). Дальше 3b: загрузка 1 картинки → все размеры → превью-галерея → утверждение. Spec: docs/superpowers/specs/2026-07-25-yandex-reklama-medijnaya-pokazy-design.md §4 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
25 lines
762 B
PHP
25 lines
762 B
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use App\Services\Advertising\BannerSizes;
|
||
|
||
it('отдаёт 15 базовых размеров медийной, каждый — пара положительных [w,h]', function () {
|
||
$sizes = BannerSizes::all();
|
||
|
||
expect($sizes)->toHaveCount(15);
|
||
foreach ($sizes as $s) {
|
||
expect($s)->toHaveCount(2)
|
||
->and($s[0])->toBeInt()->toBeGreaterThan(0)
|
||
->and($s[1])->toBeInt()->toBeGreaterThan(0);
|
||
}
|
||
});
|
||
|
||
it('содержит ходовые размеры (300×250, 240×400, 728×90, 970×250)', function () {
|
||
$sizes = BannerSizes::all();
|
||
expect($sizes)->toContain([300, 250])
|
||
->toContain([240, 400])
|
||
->toContain([728, 90])
|
||
->toContain([970, 250]);
|
||
});
|