kwork-api/tests/e2e/README.md

214 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# E2E Testing Guide
End-to-end тесты для Kwork API client.
## ⚠️ Важные замечания
1. **Требуют реальных credentials** — используйте тестовый аккаунт
2. **Запускаются только локально**НЕ в CI
3. **Все тесты read-only** — ничего не изменяют на сервере
4. **Rate limiting** — Kwork может ограничивать частые запросы
---
## 🔧 Настройка
### 1. Создайте файл с credentials
```bash
cd /root/kwork-api
cp tests/e2e/.env.example tests/e2e/.env
```
### 2. Заполните credentials
```bash
# tests/e2e/.env
KWORK_USERNAME=your_test_username
KWORK_PASSWORD=your_test_password
```
**Важно:** Используйте тестовый аккаунт, не основной!
---
## 🚀 Запуск тестов
### Все E2E тесты
```bash
uv run pytest tests/e2e/ -v
```
### Только авторизация
```bash
uv run pytest tests/e2e/test_auth.py -v
```
### Только каталог и пользователи
```bash
uv run pytest tests/e2e/test_catalog.py -v
```
### С задержкой между тестами (rate limiting)
```bash
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)
```
GET /projects # Список проектов
GET /projects/{id}/view # Просмотр проекта
GET /categories/{slug} # Категория
GET /user/{username} # Профиль пользователя
GET /seller # Страница продавца
GET /faq # Помощь
GET /settings # Настройки
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
import logging
logging.basicConfig(level=logging.DEBUG)
```
### Посмотреть логи запросов
```bash
uv run pytest tests/e2e/test_auth.py::test_login_success -v -s 2>&1 | grep -E "INFO|DEBUG|ERROR"
```
Пример вывода:
```
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
### Ошибка: "Нужно ввести логин"
**Проблема:** 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
```
---
## 📝 Добавление новых тестов
1. Создайте тест в `tests/e2e/test_*.py`
2. Добавьте маркер `@pytest.mark.e2e`
3. Используйте фикстуру `require_credentials`
4. Убедитесь что тест read-only (не изменяет данные)
Пример:
```python
@pytest.mark.e2e
async def test_my_feature(require_credentials):
"""E2E: Мой новый тест."""
client = await KworkClient.login(
username=require_credentials["username"],
password=require_credentials["password"],
)
try:
# Ваш тест здесь
result = await client.some_method()
assert result is not None
finally:
await client.close()
```
---
_Updated: 2026-03-29_