fix реклама за показы: предел веса картинки проверен по-настоящему, обход модерации не срывается целиком, робот не несёт токен на чужой адрес
Мелочи приёмочного листа v12 §8. Каждая правка с тестом; где защита уже стояла в коде — тест проверен вырезанием этой защиты. Предел веса картинки. Две прежние проверки были пустышками: сравнивали константу саму с собой и с тем же числом в ответе сервера. Вырезание правила max: оставляло обе зелёными. Настоящий тест грузит перевес и ждёт отказа — это четвёртая найденная пустышка за ветку. Обход модерации. Объявление без статуса и причина отказа длиннее колонки роняли запись в базу ВНЕ защиты, и обход обрывался на середине: остальные клиенты не узнавали, приняли их рекламу или отклонили, а деньги за отклонённый набор не возвращались. Запись ответа теперь под той же защитой, что и сеть; пустой статус не пишем вовсе, причину храним обрезанной. Робот. Адрес файла приходил в ответе сервера, а шли по нему со своим токеном без всякой сверки. Теперь адрес обязан вести на портал. Папка снимков экрана росла бесконечно, а на снимках видны логин и остаток счёта — старше двух недель убираются. Ещё: порядок посредников служебного канала — токен раньше служебного соединения; BannerGenerator больше не отдаёт молча файл тяжелее предела и берёт предел из общей константы; нулевой номер креатива ловится намеренно, а не случайно нестрогим сравнением. Портал 300/300, робот 60/60. Мест снятия заморозки денег по-прежнему четыре. Не тронуто намеренно: цена за 1000 показов и бюджет приходят от клиента — но это видимое поле мастера и принятое продуктовое решение, а не недосмотр. Решает владелец.
This commit is contained in:
@@ -18,7 +18,7 @@ function srcJpeg(int $w, int $h): string
|
||||
}
|
||||
|
||||
it('делает JPEG ТОЧНОГО целевого размера из большой квадратной исходной', function () {
|
||||
$out = (new BannerGenerator())->coverJpeg(srcJpeg(2000, 2000), 300, 250);
|
||||
$out = (new BannerGenerator)->coverJpeg(srcJpeg(2000, 2000), 300, 250);
|
||||
|
||||
$info = getimagesizefromstring($out);
|
||||
expect($info)->not->toBeFalse()
|
||||
@@ -29,7 +29,7 @@ it('делает JPEG ТОЧНОГО целевого размера из бол
|
||||
});
|
||||
|
||||
it('работает для широкого и высокого форматов (cover, точные пиксели)', function () {
|
||||
$gen = new BannerGenerator();
|
||||
$gen = new BannerGenerator;
|
||||
|
||||
$wide = getimagesizefromstring($gen->coverJpeg(srcJpeg(1200, 1200), 728, 90));
|
||||
expect($wide[0])->toBe(728)->and($wide[1])->toBe(90);
|
||||
@@ -38,7 +38,35 @@ it('работает для широкого и высокого формато
|
||||
expect($tall[0])->toBe(240)->and($tall[1])->toBe(600);
|
||||
});
|
||||
|
||||
it('бросает исключение на нечитаемой картинке', function () {
|
||||
expect(fn () => (new BannerGenerator())->coverJpeg('не картинка', 300, 250))
|
||||
/** Хелпер: «шумная» картинка — такую JPEG не ужимает почти никак, вес остаётся большим. */
|
||||
function noisyJpeg(int $w, int $h): string
|
||||
{
|
||||
$img = imagecreatetruecolor($w, $h);
|
||||
for ($x = 0; $x < $w; $x += 2) {
|
||||
for ($y = 0; $y < $h; $y += 2) {
|
||||
imagesetpixel($img, $x, $y, imagecolorallocate($img, ($x * 7) % 255, ($y * 13) % 255, ($x * $y) % 255));
|
||||
}
|
||||
}
|
||||
ob_start();
|
||||
imagejpeg($img, null, 95);
|
||||
$bin = (string) ob_get_clean();
|
||||
imagedestroy($img);
|
||||
|
||||
return $bin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Подбор качества упирается в пол 40 и дальше жать не может. Раньше в этом случае наружу
|
||||
* молча уходил файл любого веса — а кабинет Яндекса тяжелее предела его не примет, и узнали
|
||||
* бы мы об этом уже роботом, стоящим перед окном загрузки на боевом. Лучше честно сказать,
|
||||
* что картинка не ужимается, чем отдать заведомо негодный файл.
|
||||
*/
|
||||
it('не отдаёт молча файл тяжелее предела, а честно отказывается', function () {
|
||||
expect(fn () => (new BannerGenerator)->coverJpeg(noisyJpeg(1200, 1200), 970, 250, 2000))
|
||||
->toThrow(RuntimeException::class);
|
||||
});
|
||||
|
||||
it('бросает исключение на нечитаемой картинке', function () {
|
||||
expect(fn () => (new BannerGenerator)->coverJpeg('не картинка', 300, 250))
|
||||
->toThrow(RuntimeException::class);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user