# 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`
