kwork-api/tests/e2e/README.md

6.3 KiB
Raw Blame History

E2E Testing Guide

End-to-end тесты для Kwork API client.

⚠️ Важные замечания

  1. Требуют реальных credentials — используйте тестовый аккаунт
  2. Запускаются только локальноНЕ в CI
  3. Все тесты read-only — ничего не изменяют на сервере
  4. 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

📝 Добавление новых тестов

  1. Создайте тест в tests/e2e/test_*.py
  2. Добавьте маркер @pytest.mark.e2e
  3. Используйте фикстуру require_credentials
  4. Убедитесь что тест 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