diff --git a/AGENT.md b/AGENT.md index 907af38..f0a126b 100644 --- a/AGENT.md +++ b/AGENT.md @@ -26,7 +26,7 @@ | Локальный путь | `/home/naeel/ipwhitelist-app` | | Деплой URL | `https://white.nodejsk8s.dev.nubes.ru` | | Платформа | Nubes k8s — редеплой через Nubes UI из Gitea после `git push` | -| Версия | `package.json` → поле `version` (сейчас `0.4.9`) | +| Версия | `package.json` → поле `version` (сейчас `0.5.0`) | **Правило версий:** bump `version` в `package.json` при каждом значимом изменении. @@ -388,23 +388,69 @@ api.delete(path, token) // → { status, data } ## 18. Запуск и тесты ```bash -# Установка зависимостей +# Установка npm install -# Запуск локально (нужен .env) +# Запуск локально (нужен .env с DEV_MODE=true + БД) node server.js -# Тесты (supertest + реальная БД) +# API-тесты (104 штуки — CRUD, валидация, изоляция, admin, лимиты) npm test -# или -node tests/run-tests.js + +# Стресс-тесты (191 штука — concurrency, races, boundary IPs, masks, auth attacks) +npm run test:stress + +# Старый UI-тест (неактуален, использует /dev-login + CSRF) +npm run test:integration ``` -Тесты требуют реального PG подключения (переменные из .env). +**Все тесты требуют реального PG подключения** (переменные из `.env`). + +### Структура тестов (`tests/stress.js`): + +| Раздел | Что проверяет | +|---|---| +| S1 | Concurrency: FOR UPDATE lock, 10-15 параллельных вставок | +| S2 | Limit enforcement под нагрузкой, setLimit(0) | +| S3 | Mixed CRUD: concurrent update+delete+create | +| S4 | Auth attacks: fake key, none algorithm, missing claims | +| S5 | Edge cases: emoji, null byte, null/''/undefined | +| S6 | Validator: overlaps, 14 blocked ranges | +| S7 | Session vs Bearer conflict (bearerMiddleware) | +| S8 | All CIDR masks /0–/33 (34 теста) | +| S9 | IP boundary values: 0.0.0.0 … 255.255.255.255 (32 теста) | +| S10 | Token manipulation: expired, wrong issuer, future, no claims | +| S11 | DB: double delete, update deleted, isolation | +| S12 | Unicode: full-width, zero-width, RTL, NFC/NFD | +| S13 | Admin privilege escalation | +| S14 | Session: login→logout, cookie reuse | +| S15 | Rate limit /exp, /login | +| S16 | Export edge cases | +| S17 | Massive concurrency: 50 createEntry, 30 delete, 20 getOrCreate | +| S18 | CIDR normalization: host bits обнуление | +| S19 | Each blocked range individually (14) | +| S20 | Sequential CRUD patterns | +| S21 | Admin cross-company CRUD | +| S22 | Weird CIDR input: пробелы, табы, \n, 256, IPv6 (20) | --- -## 19. ⚠️ ВРЕМЕННЫЕ ЭЛЕМЕНТЫ — удалить перед продом +## 19. Известные проблемы (баги) — исправлены в v0.5.0 + +| Проблема | Статус | +|---|---| +| `auth.middleware` читал `req.session.user` перед Bearer → Bearer-only API нарушалось | ✅ Добавлен `bearerMiddleware` | +| Mock admin `isAdmin: undefined` в сессии | ✅ `user.role === 'admin'` | +| Сброс лимита (пустое поле → NaN → 400) | ✅ `null` при пустом поле | +| `setLimit()` не проверял `rowCount` → 404 на неизвестную компанию | ✅ 404 с `e.status` | +| Версия не поднималась при правках | ✅ `0.4.1` → `0.5.0` (9 бампов) | +| CSP/ingress блокировал inline-обработчики (onclick, onchange) | ✅ Event delegation через `