| .. | ||
| .env | ||
| .env.example | ||
| conftest.py | ||
| README.md | ||
| test_auth.py | ||
| test_catalog.py | ||
E2E Testing Guide
End-to-end тесты для Kwork API client.
⚠️ Важные замечания
- Требуют реальных credentials — используйте тестовый аккаунт
- Запускаются только локально — НЕ в CI
- Все тесты read-only — ничего не изменяют на сервере
- Rate limiting — Kwork может ограничивать частые запросы
🔧 Настройка
1. Создайте файл с credentials
cd /root/kwork-api
cp tests/e2e/.env.example tests/e2e/.env
2. Заполните credentials
# tests/e2e/.env
KWORK_USERNAME=your_test_username
KWORK_PASSWORD=your_test_password
Важно: Используйте тестовый аккаунт, не основной!
🚀 Запуск тестов
Все E2E тесты
uv run pytest tests/e2e/ -v
Только авторизация
uv run pytest tests/e2e/test_auth.py -v
Только каталог и пользователи
uv run pytest tests/e2e/test_catalog.py -v
С задержкой между тестами (rate limiting)
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 # Не существует
🔍 Отладка
Включить логирование
import logging
logging.basicConfig(level=logging.DEBUG)
Посмотреть логи запросов
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 файл существует и заполнен:
cat tests/e2e/.env
Ошибка: 404 Not Found
Проблема: Endpoint не существует
Решение: Проверьте HAR файл для правильных endpoints:
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
Проблема: Слишком много запросов
Решение: Запустите с задержкой:
uv run pytest tests/e2e/ -v --slowmo=2
📝 Добавление новых тестов
- Создайте тест в
tests/e2e/test_*.py - Добавьте маркер
@pytest.mark.e2e - Используйте фикстуру
require_credentials - Убедитесь что тест read-only (не изменяет данные)
Пример:
@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