docs: full documentation update — AGENT.md v0.5.0 + CONTEXT.md fixes/changes summary
This commit is contained in:
@@ -26,7 +26,7 @@
|
|||||||
| Локальный путь | `/home/naeel/ipwhitelist-app` |
|
| Локальный путь | `/home/naeel/ipwhitelist-app` |
|
||||||
| Деплой URL | `https://white.nodejsk8s.dev.nubes.ru` |
|
| Деплой URL | `https://white.nodejsk8s.dev.nubes.ru` |
|
||||||
| Платформа | Nubes k8s — редеплой через Nubes UI из Gitea после `git push` |
|
| Платформа | Nubes k8s — редеплой через Nubes UI из Gitea после `git push` |
|
||||||
| Версия | `package.json` → поле `version` (сейчас `0.4.9`) |
|
| Версия | `package.json` → поле `version` (сейчас `0.5.0`) |
|
||||||
|
|
||||||
**Правило версий:** bump `version` в `package.json` при каждом значимом изменении.
|
**Правило версий:** bump `version` в `package.json` при каждом значимом изменении.
|
||||||
|
|
||||||
@@ -388,23 +388,69 @@ api.delete(path, token) // → { status, data }
|
|||||||
## 18. Запуск и тесты
|
## 18. Запуск и тесты
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Установка зависимостей
|
# Установка
|
||||||
npm install
|
npm install
|
||||||
|
|
||||||
# Запуск локально (нужен .env)
|
# Запуск локально (нужен .env с DEV_MODE=true + БД)
|
||||||
node server.js
|
node server.js
|
||||||
|
|
||||||
# Тесты (supertest + реальная БД)
|
# API-тесты (104 штуки — CRUD, валидация, изоляция, admin, лимиты)
|
||||||
npm test
|
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 через `<script>` |
|
||||||
|
| Admin при `/` редиректился на первую компанию, но не на свою | ✅ Авто-редирект на компанию admin по `clientId` |
|
||||||
|
| Даты в UTC вместо МСК | ✅ `timeZone: 'Europe/Moscow'` |
|
||||||
|
| Фильтр аудита: `onchange` ненадёжен | ✅ Кнопка «Применить» + `Number()` сравнение |
|
||||||
|
| `/admin` → 500 из-за отсутствия `defaultLimit` в шаблоне | ✅ Передаётся в `render()` |
|
||||||
|
|
||||||
|
## 20. ⚠️ ВРЕМЕННЫЕ ЭЛЕМЕНТЫ — удалить перед продом
|
||||||
|
|
||||||
### GET /exp — публичный экспорт без авторизации (добавлен v0.4.9)
|
### GET /exp — публичный экспорт без авторизации (добавлен v0.4.9)
|
||||||
|
|
||||||
@@ -418,7 +464,7 @@ node tests/run-tests.js
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 20. Расхождения с ТЗ (открытые задачи)
|
## 21. Расхождения с ТЗ (открытые задачи)
|
||||||
|
|
||||||
| Пункт ТЗ | Суть | Статус |
|
| Пункт ТЗ | Суть | Статус |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
|||||||
Reference in New Issue
Block a user