docs: update E2E testing guide with HAR-based endpoints

This commit is contained in:
root 2026-03-29 22:28:48 +00:00
parent ecf51bef54
commit 16e587f485

View File

@ -1,25 +1,26 @@
# End-to-End (E2E) Testing # E2E Testing Guide
E2E тесты требуют реальных credentials Kwork.ru и запускаются **только локально** (не в CI). End-to-end тесты для Kwork API client.
## ⚠️ Предупреждение ## ⚠️ Важные замечания
- **Не запускай в CI** — требуются реальные credentials 1. **Требуют реальных credentials** — используйте тестовый аккаунт
- **Используй тестовый аккаунт** — не основной аккаунт Kwork 2. **Запускаются только локально**НЕ в CI
- **Rate limiting** — добавляй задержки между запросами 3. **Все тесты read-only** — ничего не изменяют на сервере
4. **Rate limiting** — Kwork может ограничивать частые запросы
--- ---
## 🔧 Настройка ## 🔧 Настройка
### 1. Создай файл окружения ### 1. Создайте файл с credentials
```bash ```bash
cd /root/kwork-api cd /root/kwork-api
cp tests/e2e/.env.example tests/e2e/.env cp tests/e2e/.env.example tests/e2e/.env
``` ```
### 2. Заполни credentials ### 2. Заполните credentials
```bash ```bash
# tests/e2e/.env # tests/e2e/.env
@ -27,11 +28,7 @@ KWORK_USERNAME=your_test_username
KWORK_PASSWORD=your_test_password KWORK_PASSWORD=your_test_password
``` ```
### 3. Установи зависимости **Важно:** Используйте тестовый аккаунт, не основной!
```bash
uv sync --group dev
```
--- ---
@ -43,14 +40,19 @@ uv sync --group dev
uv run pytest tests/e2e/ -v uv run pytest tests/e2e/ -v
``` ```
### Конкретный тест ### Только авторизация
```bash ```bash
uv run pytest tests/e2e/test_auth.py -v uv run pytest tests/e2e/test_auth.py -v
uv run pytest tests/e2e/test_catalog.py::test_get_catalog_list -v
``` ```
### С задержками (rate limiting) ### Только каталог и пользователи
```bash
uv run pytest tests/e2e/test_catalog.py -v
```
### С задержкой между тестами (rate limiting)
```bash ```bash
uv run pytest tests/e2e/ -v --slowmo=1 uv run pytest tests/e2e/ -v --slowmo=1
@ -58,79 +60,154 @@ uv run pytest tests/e2e/ -v --slowmo=1
--- ---
## 📁 Структура тестов ## 📋 Список тестов
### Авторизация (`test_auth.py`)
| Тест | Endpoint | Описание |
|------|----------|----------|
| `test_login_success` | `POST /api/user/login` | Успешный логин |
| `test_login_invalid_credentials` | `POST /api/user/login` | Ошибка логина |
| `test_restore_session` | N/A | Восстановление сессии (пропущен) |
### Каталог и пользователи (`test_catalog.py`)
| Тест | Endpoint | Описание |
|------|----------|----------|
| `test_get_projects_list` | `GET /projects` | Список проектов |
| `test_get_categories` | `GET /categories/{slug}` | Категория |
| `test_get_user_profile` | `GET /user/{username}` | Профиль пользователя |
| `test_api_checknotify` | `POST /api/user/checknotify` | Проверка уведомлений |
| `test_api_addview` | `POST /api/offer/addview` | Добавить просмотр |
| `test_get_reviews` | `POST /user/get_reviews` | Отзывы пользователя |
---
## 📊 Endpoints из HAR анализа
Эти endpoints использует официальный сайт Kwork.ru:
### ✅ Работающие (200 OK)
``` ```
tests/e2e/ GET /projects # Список проектов
├── README.md # Этот файл GET /projects/{id}/view # Просмотр проекта
├── .env.example # Шаблон для credentials GET /categories/{slug} # Категория
├── conftest.py # Фикстуры и setup GET /user/{username} # Профиль пользователя
├── test_auth.py # Аутентификация GET /seller # Страница продавца
├── test_catalog.py # Каталог кворков GET /faq # Помощь
├── test_projects.py # Биржа проектов GET /settings # Настройки
└── test_user.py # Пользовательские данные GET /api/user/checknotify # Проверка уведомлений
POST /api/user/login # Логин
POST /user/get_reviews # Отзывы
POST /api/offer/addview # Добавить просмотр
POST /captcha/check_phone_captcha_enabled
POST /quick-faq/init
POST /support2/hit
```
### ❌ Не работающие (404 Not Found)
```
POST /catalogMainv2 # Используется в client.py (нужно исправить)
POST /getKworkDetails # Используется в client.py (нужно исправить)
POST /userReviews # Используется в client.py (нужно исправить)
POST /cities # Используется в client.py (нужно исправить)
POST /countries # Используется в client.py (нужно исправить)
POST /user # Не существует
``` ```
--- ---
## 🧪 Пример теста ## 🔍 Отладка
### Включить логирование
```python ```python
import pytest import logging
from kwork_api import KworkClient logging.basicConfig(level=logging.DEBUG)
@pytest.mark.e2e
async def test_get_user_info():
"""E2E тест: получение информации о пользователе."""
async with await KworkClient.login(
username="test_user",
password="test_pass"
) as client:
user = await client.user.get_info()
assert user.username == "test_user"
assert user.balance >= 0
``` ```
--- ### Посмотреть логи запросов
## 🏷️ Маркировка тестов
E2E тесты маркируются `@pytest.mark.e2e` для изоляции:
```bash ```bash
# Запустить только unit тесты (исключить e2e) uv run pytest tests/e2e/test_auth.py::test_login_success -v -s 2>&1 | grep -E "INFO|DEBUG|ERROR"
uv run pytest tests/ -v -m "not e2e" ```
# Запустить только e2e тесты Пример вывода:
uv run pytest tests/ -v -m e2e ```
INFO:kwork_api.client:Login request: POST https://kwork.ru/api/user/login (user: username)
DEBUG:kwork_api.client:Login payload: {'l_username': '...', 'l_password': '...', ...}
DEBUG:kwork_api.client:Login response status: 200
INFO:kwork_api.client:Login successful: user_id=12345, csrf_token=abc123...
``` ```
--- ---
## 🔒 Безопасность ## 🛠 Troubleshooting
1. **Никогда не коммить `.env`** — добавлен в `.gitignore` ### Ошибка: "Нужно ввести логин"
2. **Используй тестовый аккаунт** — не основной
3. **Не сохраняй токены в коде** — только через env vars **Проблема:** Credentials не переданы в login()
**Решение:** Проверьте что .env файл существует и заполнен:
```bash
cat tests/e2e/.env
```
### Ошибка: 404 Not Found
**Проблема:** Endpoint не существует
**Решение:** Проверьте HAR файл для правильных endpoints:
```bash
cd /root
python3 << 'EOF'
import json
with open('kwork-dump.har') as f:
har = json.load(f)
for entry in har['log']['entries']:
if 'kwork.ru/' in entry['request']['url'] and 'cdn' not in entry['request']['url']:
print(f"{entry['request']['method']} {entry['response']['status']} {entry['request']['url'].split('?')[0]}")
EOF
```
### Ошибка: Rate limit
**Проблема:** Слишком много запросов
**Решение:** Запустите с задержкой:
```bash
uv run pytest tests/e2e/ -v --slowmo=2
```
--- ---
## 🐛 Troubleshooting ## 📝 Добавление новых тестов
### Ошибка аутентификации 1. Создайте тест в `tests/e2e/test_*.py`
``` 2. Добавьте маркер `@pytest.mark.e2e`
KworkAuthError: Invalid credentials 3. Используйте фикстуру `require_credentials`
``` 4. Убедитесь что тест read-only (не изменяет данные)
**Решение:** Проверь credentials в `.env`
### Rate limit Пример:
``` ```python
KworkApiError: Too many requests @pytest.mark.e2e
``` async def test_my_feature(require_credentials):
**Решение:** Запусти с задержкой: `pytest --slowmo=2` """E2E: Мой новый тест."""
client = await KworkClient.login(
username=require_credentials["username"],
password=require_credentials["password"],
)
### Session expired try:
# Ваш тест здесь
result = await client.some_method()
assert result is not None
finally:
await client.close()
``` ```
KworkAuthError: Session expired
``` ---
**Решение:** Перезапусти тесты (session создаётся заново)
_Updated: 2026-03-29_