# Design: Admin Test Checklist **Date:** 2026-05-24 **Status:** Approved **Updated:** 2026-05-24 (v2 — 3-state status + error comments) ## Summary Админ-страница с чек-листом для ручного тестирования функционала сайта. Каждая проверка имеет описание действия и ожидаемый результат. Отметка сохраняется в SQLite с автоматической датой. Поддерживает 3 состояния: пройдено / не пройдено (с комментарием об ошибке) / не проверено. ## Architecture ### Data Model Модель `ChecklistResult` в Prisma schema: ```prisma model ChecklistResult { id String @id @default(cuid()) itemKey String @unique // уникальный ключ проверки passed Boolean // true = пройдено, false = не пройдено comment String? // описание ошибки (при passed: false) checkedAt DateTime @default(now()) updatedAt DateTime @updatedAt } ``` ### Elements Source Элементы чек-листа — хардкод в `shared/constants/test-checklist-items.js` (JS + .d.ts). Версионируются с кодом. Структура элемента: ```ts { key: string // уникальный идентификатор section: string // раздел (группировка) action: string // что сделать expectedResult: string // что должно произойти } ``` ### API **Server route:** `server/src/routes/api/admin/test-checklist.js` - `GET /api/admin/test-checklist` — возвращает все элементы + их результаты из БД (включая `comment`) - `PATCH /api/admin/test-checklist` — body: `{ itemKey, passed, comment? }`, обновляет/создаёт результат, `checkedAt = now()`. При `passed: true` комментарий очищается. - `POST /api/admin/test-checklist/reset` — сбрасывает все результаты (удаляет записи) Только для админов. ### Frontend **Page:** `client/src/pages/admin-test-checklist/ui/AdminTestChecklistPage.tsx` - Аккордеон по разделам (MUI Accordion) - Каждая строка: 3-состоятельный статус (✅ пройдено / ❌ не пройдено / ⬜ не проверено), колонка "Действие", колонка "Ожидаемый результат", колонка "Комментарий" (показывает текст ошибки с tooltip), дата проверки - При выборе «Не пройдено» — открывается диалог с обязательным полем «Описание ошибки» (textarea) - Диалог: заголовок «Описание ошибки — {название проверки}», placeholder «Опишите, что пошло не так...», кнопки «Отмена» / «Сохранить», валидация — поле обязательно при ❌ - Кнопка «Сбросить все» для полного ре-теста - `@tanstack/react-query` для данных, `apiClient` для запросов **Navigation:** новый пункт в `AdminLayoutPage` — «Тест-чеклист» с иконкой `ClipboardCheck`, роут `/admin/test-checklist` ## Sections & Items ### Авторизация (auth) - `auth.register-email` — Регистрация по email → код приходит, аккаунт создаётся - `auth.login-password` — Вход по паролю → корректный пускает, неправильный — ошибка - `auth.oauth-vk` — OAuth VK → редирект, callback, авторизация - `auth.oauth-yandex` — OAuth Yandex → редирект, callback, авторизация - `auth.reset-password` — Сброс пароля → письмо приходит, ссылка работает - `auth.logout` — Выход → сессия очищается ### Каталог и товары (catalog) - `catalog.homepage` — Главная → слайдер грузится, товары отображаются - `catalog.filters` — Фильтры → по категории, цене, материалам работают - `catalog.product-page` — Страница товара → фото, описание, цена, кнопка "В корзину" - `catalog.seo` — SEO → title, meta, slug корректные ### Корзина (cart) - `cart.add` — Добавление товара → счётчик обновляется - `cart.change-qty` — Изменение количества → пересчёт суммы - `cart.remove` — Удаление → товар убирается, сумма пересчитывается ### Чекаут (checkout) - `checkout.address` — Выбор адреса → из сохранённых / новый - `checkout.delivery` — Выбор доставки → Почта, OZON, Яндекс, 5post - `checkout.payment` — Выбор оплаты → онлайн / при получении - `checkout.comment` — Комментарий к заказу → поле работает - `checkout.create` — Создание заказа → заказ создаётся, статус DRAFT ### Оплата (payment) - `payment.yookassa` — ЮKassa → редирект на оплату, webhook обрабатывается - `payment.status` — Статус платежа → обновляется после webhook ### Профиль пользователя (profile) - `profile.avatar` — Аватар → загрузка, отображение, удаление - `profile.settings` — Настройки → email, имя, способы входа - `profile.addresses` — Адреса → добавление, редактирование, удаление, по умолчанию - `profile.orders` — Заказы → список, детали, статусы - `profile.messages` — Сообщения по заказу → отправка, получение, read state - `profile.notifications` — Уведомления → вкл/выкл каналы - `profile.delete-account` — Удаление аккаунта → данные удаляются ### Админ — Товары (admin-products) - `admin-products.list` — Список → пагинация, поиск - `admin-products.create` — Создание → все поля, загрузка фото, публикация - `admin-products.edit` — Редактирование → изменения сохраняются - `admin-products.delete` — Удаление → товар удаляется - `admin-products.images` — Изображения → добавление, сортировка, удаление ### Админ — Категории (admin-categories) - `admin-categories.crud` — CRUD категорий, сортировка ### Админ — Заказы (admin-orders) - `admin-orders.list` — Список → фильтрация по статусу, внимание - `admin-orders.details` — Детали → состав, статус, смена статуса - `admin-orders.messages` — Сообщения → ответ пользователю ### Админ — Отзывы (admin-reviews) - `admin-reviews.list` — Список → pending/approved/rejected - `admin-reviews.moderate` — Модерация → approve/reject ### Админ — Пользователи (admin-users) - `admin-users.list` — Список → email, дата регистрации - `admin-users.orders` — Просмотр заказов пользователя ### Админ — Галерея (admin-gallery) - `admin-gallery.upload` — Загрузка, удаление, использование в слайдере ### Админ — Настройки (admin-settings) - `admin-settings.notifications` — Уведомления → email, telegram ### Инфо-страницы (info) - `info.pages` — Доставка, оплата, как заказать, статусы заказов - `info.legal` — Политика конфиденциальности, условия использования ### SSE / Realtime (sse) - `sse.notifications` — Уведомления приходят в реальном времени ## Implementation Plan 1. Prisma migration — добавить модель `ChecklistResult` 2. Shared constants — `test-checklist-items.ts` 3. Server API route — GET/PATCH/POST 4. Client page — `AdminTestChecklistPage` 5. Client routing — добавить в `AdminLayoutPage` 6. Register route in `client/src/app/routes/index.tsx`