Завантаження публікації
ОГОЛОШЕННЯ

Набір із 5–8 тестів для адмін-сторінки: фільтри, доступи, валідація — без води, тільки те, що ловить регресії

Практичний мінімум для Laravel: які саме тести написати, щоб сторінка контролю/CRUD не “попливла” після правок — перевіряємо доступи (403/404), фільтри (дата/юзер/статус), збереження query string, та валідацію (422/redirect з errors).


Максим Третяк
Максим Третяк
Газета Дейком | 04.01.2026, 18:00 GMT+3; 11:00 GMT-4

Коли ви будуєте сторінку контролю/аналітики або CRUD-модуль у живому проєкті, вам не потрібні “сотні тестів”. Вам потрібні 5–8 тестів, які закривають три головні ризики: витік даних через доступи, неправильна вибірка через фільтри, і “сміття в базі” через валідацію. Це той мінімум, який реально окупається: він ловить помилки відразу, не даючи їм доїхати в прод.

Нижче — логіка, як саме зібрати ці 5–8 тестів. Вони мають бути feature-тестами, бо саме feature перевіряє реальну поведінку маршруту: middleware, policy, контролер, запит, пагінація і FormRequest працюють разом. Unit-тести policy — опційні, але у вашій ситуації (де permissions критичні) головний ефект дають саме HTTP-тести.

Почніть із ролей/акторів. Мінімум два: користувач з правом (редактор/адмін) і користувач без прав (або інша роль). Плюс інколи потрібен “автор” для кейсу “бачить тільки своє”. Далі ви створюєте тестові записи так, щоб фільтри точно могли відсіювати: різні дати, різні статуси, різні автори. Тести мають бути детермінованими: якщо ви створили 3 записи, то ви чітко знаєте, які мають потрапити в результат.

Ось “золотий” набір із 7 тестів, який закриває майже всі регресії для сторінки контролю/CRUD.

Тест 1. Доступ до сторінки контролю: без прав — 403/redirect, з правом — 200.

Це ловить ситуації, коли хтось забув middleware permissions або навпаки — випадково відкрив модуль.

Тест 2. Обмеження видимості: користувач з обмеженою роллю не бачить чужі записи в index.

Це ключовий антивитік. Він повинен падати, якщо хтось прибрав базовий visibleTo($user) або переписав запит “в лоб”.

Тест 3. Фільтр по статусу працює і не розширює доступ.

Ви створюєте записи зі статусами A/B, робите GET /control?status=A і перевіряєте, що в відповіді тільки A. Потім важлива частина: якщо користувач обмежений, він не повинен отримати чужі A — тобто фільтр звужує, але не розширює.

Тест 4. Фільтр по даті: BETWEEN включає межі дня коректно.

Це ловить найчастішу помилку “від/до не включило записи на кінці дня”. Ви робите записи на різних датах/часах, фільтруєте по даті і перевіряєте, що саме потрібні потрапили.

Тест 5. Фільтр по user_id: працює для ролі, якій це дозволено, і ігнорується/не дає витоку для ролі, якій не дозволено.

Наприклад, адміну дозволено дивитись по будь-кому, автору — ні. Тест гарантує, що параметр user_id не став “діркою”.

Тест 6. Пагінація: зберігає query string.

Це UX-регресія, яка в реальності дуже болюча: натискаєш “сторінка 2” і фільтри злітають. Тест простий: викликаєте сторінку з фільтрами і перевіряєте, що лінки пагінації містять ці параметри.

Тест 7. Валідація store/update: невалідні дані не записуються і повертають помилку (422 або redirect з errors).

Це базовий захист. Якщо хтось зняв FormRequest або “спростив” правила, тест падає. Плюс ви перевіряєте, що база не змінилась.

Якщо вам потрібно 8 тестів — додайте ще один “підміна забороненого поля”.

Тест 8. Update з підсунутим полем (наприклад, status/approval_status) не змінює це поле для ролі без права.

Це дуже потужний тест проти ескалації прав через request payload.

Далі — як ці тести мають виглядати технічно, без прив’язки до вашої конкретної таблиці. Ви завжди робите actingAs($user) і відправляєте HTTP запити. Ви перевіряєте статус-код і (важливо) перевіряєте контент відповіді або наявність записів у БД. Для index-сторінки зручніше перевіряти контент (назви/ID) у HTML, а для create/update — assertDatabaseHas / assertDatabaseMissing.

Статуси. 200 — можна дивитись. 302 — успішний store/update з редиректом. 403 — заборонено. 404 — якщо ви ховаєте існування запису і дістаєте його через доступний scope. 422 — для API або для JSON-очікування, або redirect з errors для web-форм. Важливо вибрати консистентну політику і тестувати саме її.

Найчастіша помилка при написанні такого набору — “вимкнути middleware” або “підмінити авторизацію”, щоб тести проходили. Це самообман. Вам потрібні тести, які імітують прод: з permissions, з policies, з реальними маршрутами. Інакше вони не ловлять регресії, заради яких ви їх писали.

Щоб тести були підтримувані, вам потрібні два хелпери. Перший — створення користувачів з ролями/правами (адмін/редактор/автор). Другий — фабрика тестових записів з різними статусами, датами і власниками. Якщо фабрик немає, можна створювати записи руками, але краще винести це в методи в тесті, щоб не було копіпасту.

Висновок: “5–8 тестів” — це не випадкове число. Це мінімальний набір, який закриває реальні ризики: доступи (не показати зайве і не дати виконати дію), фільтри (дата/статус/юзер працюють коректно і не розширюють доступ), пагінація (не губить параметри), і валідація (не пускає сміття). Якщо ці тести є, ви можете додавати нові фільтри і розширення без страху, що тихо зламаєте старі обмеження або відкриєте дані.


Максим Третяк — Кореспондент, який спеціалізується на суспільно важливих темах, пише про політику, фінансові ринки та економіку. Він проживає та працює в Україні.

Цей матеріал є частиною розгорнутої теми: Web-програмування, яка охоплює численні цікаві аспекти цієї події. Газета «Дейком» ретельно відстежує події, проводячи перевірку джерел та інформації, щоб забезпечити нашим читачам найбільш точне та актуальне інформування.

Цей матеріал опубліковано 04.01.2026 року о 18:00 GMT+3 Київ; 11:00 GMT-4 Вашингтон, розділ: Освіта, із заголовком: "Набір із 5–8 тестів для адмін-сторінки: фільтри, доступи, валідація — без води, тільки те, що ловить регресії". Якщо в публікації з'являться зміни, про це буде зазначено та описано у кінці публікації.

Читайте щоденну газету та загальну стрічку новин газети Дейком, яка поєднує багато цікавого в понад 40 розділах з усіх куточків світу.


Save
ОГОЛОШЕННЯ

Новини, які можуть Вас зацікавити:

Штатні та позаштатні журналісти газети «Дейком» щодня готують сотні публікацій, щоб читачі отримували найоперативнішу, перевірену й глибоку інформацію. Ми працюємо для тих, хто хоче розуміти суть подій, бачити широку картину та бути на крок попереду.

Останні новини

Вибір редакції