test: ТЗ compliance — 45 API-тестов + полный отчёт о соответствии
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
# ТЗ-Compliance Report — 2026-05-31 (v0.5.0)
|
||||
|
||||
Независимая проверка соответствия кода Техническому Заданию (`docs/ТЗ.md`).
|
||||
Аутентификация "по-настоящему" (OIDC) и сценарий "несколько компаний на пользователя" — ИСКЛЮЧЕНЫ из проверки (уточняется).
|
||||
|
||||
---
|
||||
|
||||
## ИТОГ: 45/45 тестов пройдено ✅
|
||||
|
||||
Все функциональные требования ТЗ **реализованы**. Расхождения — только в объёме/глубине реализации.
|
||||
|
||||
---
|
||||
|
||||
## Детальный разбор по пунктам ТЗ
|
||||
|
||||
### 1. Назначение и цели — ✅
|
||||
|
||||
| Требование | Статус | Где |
|
||||
|---|---|---|
|
||||
| Web-интерфейс для управления списком | ✅ | `views/index.ejs`, `ui/routes/entries.js` |
|
||||
| Единая точка для инженеров | ✅ | `/admin`, `/audit` |
|
||||
| Машиночитаемая выдача агрегированного списка | ✅ | `/exp` (временный), `/export` |
|
||||
|
||||
### 2. Объем работ — ✅
|
||||
|
||||
| Требование | Статус | Где |
|
||||
|---|---|---|
|
||||
| Web-страница | ✅ | SSR через EJS |
|
||||
| Авторизация OIDC | ⏸️ | mock (DEV_MODE=true), OIDC-код написан но не подключён |
|
||||
| Валидация клиент + сервер | ⚠️ | Сервер: ✅ полная. Клиент: только HTML5 `pattern` |
|
||||
| Внешний endpoint txt | ✅ | `/exp` (без авторизации) |
|
||||
| Хранение + аудит | ✅ | PostgreSQL 3 таблицы |
|
||||
| Административное управление лимитами | ✅ | `/admin`, `PATCH /api/v1/companies/:id/limit` |
|
||||
|
||||
### 3. Роли и права — ✅
|
||||
|
||||
| Требование | Статус |
|
||||
|---|---|
|
||||
| Client: видит только свои записи | ✅ |
|
||||
| Client: CRUD своих записей в пределах лимита | ✅ |
|
||||
| Admin (WZ01112): видит все компании | ✅ |
|
||||
| Admin: CRUD всех записей | ✅ |
|
||||
| Admin: изменение лимитов | ✅ |
|
||||
| Несколько компаний на пользователя | ⏸️ (не реализовано — ждём devops) |
|
||||
|
||||
### 4.1. Просмотр списка — ✅
|
||||
|
||||
| Требование | Статус | Примечание |
|
||||
|---|---|---|
|
||||
| Таблица записей активной компании | ✅ | |
|
||||
| Admin — записи всех компаний с фильтром | ✅ | `?company=<id>` |
|
||||
| Колонки: значение, комментарий, автор, дата создания, дата изменения | ✅ | |
|
||||
| Soft-deleted скрыты по умолчанию | ✅ | |
|
||||
| Фильтр soft-deleted для admin | ❌ | `listEntries(includeDeleted)` есть, но API не принимает параметр |
|
||||
| «использовано X из N» | ✅ | `used` / `limit` в ответе API |
|
||||
|
||||
### 4.2. Создание записи — ✅
|
||||
|
||||
| Требование | Статус |
|
||||
|---|---|
|
||||
| Поля: значение, комментарий (до 255) | ✅ |
|
||||
| Валидация на клиенте и сервере | ✅ (см. примечание по клиентской) |
|
||||
| Проверка лимита, пересечений, дубликатов, запрещённых диапазонов | ✅ |
|
||||
| Аудит при создании | ✅ |
|
||||
|
||||
### 4.3. Редактирование — ✅
|
||||
|
||||
| Требование | Статус |
|
||||
|---|---|
|
||||
| Редактирование значения и комментария | ✅ |
|
||||
| Повторная полная проверка при изменении значения | ✅ |
|
||||
| Аудит с прежним и новым значением | ✅ |
|
||||
|
||||
### 4.4. Soft delete — ✅
|
||||
|
||||
| Требование | Статус |
|
||||
|---|---|
|
||||
| Логическое удаление (deleted_at, deleted_by) | ✅ |
|
||||
| Освобождение места в лимите | ✅ |
|
||||
| Исключение из выдачи | ✅ |
|
||||
| Аудит | ✅ |
|
||||
|
||||
### 4.5. Лимиты — ✅
|
||||
|
||||
| Требование | Статус |
|
||||
|---|---|
|
||||
| Глобальный лимит по умолчанию: 15 | ✅ |
|
||||
| Настройка через конфигурацию (env) | ✅ `DEFAULT_LIMIT` |
|
||||
| Per-company лимит (выше и ниже глобального) | ✅ `custom_limit` |
|
||||
| Блокировка с понятным сообщением | ✅ 409 с «Лимит исчерпан» |
|
||||
| Снижение лимита не удаляет существующие записи | ✅ |
|
||||
|
||||
### 4.6. Журнал аудита — ✅
|
||||
|
||||
| Требование | Статус |
|
||||
|---|---|
|
||||
| Все изменяющие операции фиксируются | ✅ CREATE, UPDATE, DELETE |
|
||||
| Поля: кто, когда, компания, действие, прежнее/новое состояние | ✅ |
|
||||
| Доступен только администратору | ✅ 403 для user |
|
||||
|
||||
### 4.7. Внешняя выдача — ⚠️
|
||||
|
||||
| Требование | Статус |
|
||||
|---|---|
|
||||
| Суммаризация CIDR по всем компаниям | ✅ `aggregateCIDRs()` |
|
||||
| HTTP GET endpoint, txt | ⚠️ `/exp` (временный), `/export` требует авторизации |
|
||||
| Без авторизации (сетевое ограничение) | ⚠️ `/exp` — да, `/export` — нет |
|
||||
|
||||
### 5. Валидация — ✅
|
||||
|
||||
| Требование | Статус |
|
||||
|---|---|
|
||||
| /22–/32 маски | ✅ |
|
||||
| Только IPv4 | ✅ |
|
||||
| Нормализация host bits + уведомление | ✅ `wasNormalized` передаётся в UI |
|
||||
| Запрет 14 диапазонов (Приложение А) | ✅ все 14 |
|
||||
| Отсутствие дубликатов в компании | ✅ |
|
||||
| Отсутствие пересечений в компании | ✅ |
|
||||
| Комментарий ≤ 255 | ✅ |
|
||||
| Клиентская валидация | ⚠️ только HTML5 `pattern` — нет JS-проверки диапазонов |
|
||||
|
||||
---
|
||||
|
||||
## НЕРЕАЛИЗОВАННЫЕ / НЕПОЛНЫЕ пункты
|
||||
|
||||
| # | Пункт ТЗ | Описание расхождения | Приоритет |
|
||||
|---|---|---|---|
|
||||
| 1 | 4.1 | Фильтр soft-deleted записей для admin: `listEntries(includeDeleted=true)` есть, но API-роут `GET /api/v1/entries` не принимает `?includeDeleted=true` | P2 |
|
||||
| 2 | 4.7 | `/export` требует авторизацию (Bearer). По ТЗ — без авторизации (сетевое ограничение). Обход: `/exp` | P1 — требуется решение |
|
||||
| 3 | 5 | Клиентская валидация — только HTML5 `pattern`, нет JS-проверки масок /22–/32 и запрещённых диапазонов на стороне браузера | P3 |
|
||||
| 4 | 3.1 | Несколько компаний на пользователя — не реализовано (ждём уточнения от devops) | P1 |
|
||||
| 5 | 2 | OIDC-авторизация — код написан (`src/auth.js` OIDC-ветка, `src/routes/auth.js` с `/callback`), но не подключён в `server.js` | P0 для прода |
|
||||
|
||||
---
|
||||
|
||||
## РЕКОМЕНДАЦИИ
|
||||
|
||||
1. **Перед продом:** подключить OIDC-роутер, убрать DEV_MODE
|
||||
2. **Экспорт:** решить — делать `/export` публичным или оставить `/exp` как временное решение
|
||||
3. **Soft-delete фильтр:** добавить `?includeDeleted=true` в API и UI для admin
|
||||
4. **Клиентская валидация:** добавить JS-проверку масок и запрещённых диапазонов
|
||||
Reference in New Issue
Block a user