← Главная
🩸 HemaWeb — QA Test Plan
Blood Donation Platform · AI-Powered Testing · Playwright + TypeScript
🔗 Тестируемый стенд
Frontend:
https://hemaweb.world/
API:
https://hemaweb.world/api
Swagger:
https://hemaweb.world/api/docs
GitHub: a-voronkov/hemaweb
👥 Тестовые аккаунты
| Роль | Email | Пароль |
| Super Admin | superadmin@hemaweb.local | SuperAdmin123! |
| Admin | admin@hemaweb.local | Admin123! |
| Staff | staff@hemaweb.local | Staff123! |
| System Admin | sysadmin@hemaweb.local | SysAdmin123! |
| Donor (verified) | donor1@example.com | Donor123! |
| Donor (unverified) | donor2@example.com | Donor123! |
📋 Тест-кейсы: Authentication
TC-001 Smoke API
Регистрация нового донора
POST /auth/register с уникальным email → 201 + user.id + user.email
TC-002 Regression API
Регистрация с дублирующим email
POST /auth/register с существующим email → 409 Conflict
TC-003 Smoke API
Логин с валидными данными
POST /auth/login → 200 + session cookie + user data
TC-004 Regression API
Логин с неверным паролем
POST /auth/login wrong password → 401
TC-005 Critical API
Доступ к /auth/me без авторизации
GET /auth/me без cookie → 401
📋 Тест-кейсы: Blood Drives
TC-010 Critical API
Staff создаёт blood drive
POST /blood-drives (staff auth) → 201 + title + status="upcoming"
TC-011 Critical API
Donor НЕ может создать blood drive (RBAC)
POST /blood-drives (donor auth) → 403 Forbidden
TC-012 Critical API
Поиск nearby drives с сортировкой по расстоянию
GET /blood-drives/nearby?lat=13.7563&lng=100.5018&radius=50 → sorted by distance asc
TC-013 Critical API
Верифицированный донор регистрируется на drive
POST /blood-drives/{id}/register (verified donor) → 200 + confirmation email
TC-015 🐛 BUG API
Донор в cooldown может зарегистрироваться на drive
nextEligibleDate > now, но POST /register → 200 (ожидалось 400). AI нашёл: нет проверки cooldown.
📋 Тест-кейсы: Donations & Verification
TC-020 Critical API
Staff записывает донацию
POST /medical-centers/record-donation → 200 + donor.nextEligibleDate = +56 дней
TC-022 🐛 BUG API
Donation с volumeMl = 0 проходит
POST /medical-centers/record-donation volumeMl=0 → 200 (ожидалось 400). AI нашёл: нет валидации.
📋 Тест-кейсы: UI
TC-030 Smoke UI
Donor логинится через UI → видит дашборд
Открыть /auth/sign-in → ввести email/password → нажать Login → увидеть dashboard
TC-031 Critical UI
Donor browse upcoming blood drives
Login → /blood-drives → увидеть список drives или карту
TC-032 Critical UI
Регистрация нового донора через UI
/auth/sign-up → заполнить форму → submit → редирект с sign-up
🔴 AI-найденные риски (Security & Logic)
| # | Риск | Severity | Файл |
| 1 | Race condition: двойная запись на blood drive | Critical | blood-drives.service.ts |
| 2 | Race condition: двойной appointment на слот | Critical | blood-drives.service.ts |
| 3 | Нет rate limiting на /auth/login | Critical | auth.controller.ts |
| 4 | Слабая валидация пароля (только длина ≥ 8) | High | auth.service.ts |
| 5 | Session cookie — нет проверки флагов | High | auth.service.ts |
| 6 | Нет санитизации XSS в title/description | High | Multiple |
| 7 | Nearby search: ALL drives в память вместо PostGIS | High | blood-drives.service.ts |
| 8 | Не проверяется cooldown при регистрации | Medium | blood-drives.service.ts |
| 9 | Email failures молча проглатываются | Medium | Multiple |
| 10 | Нет пагинации на /blood-drives | Medium | blood-drives.controller.ts |
| 11 | Weight может быть 0 или отрицательный | Medium | Prisma schema |
| 12 | Soft delete inconsistency (drives vs registrations) | Medium | blood-drives.service.ts |
📊 Test Strategy
| Уровень | Тестов | Когда запускать | Время |
| 🟢 Smoke | 6 | Каждый деплой | < 2 мин |
| 🟡 Critical Path | 8 | Каждый PR | < 5 мин |
| 🔵 Full Regression | 45 | Nightly | < 15 мин |