From 16e587f485e512b2924aa5fde882f358dd984534 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 29 Mar 2026 22:28:48 +0000 Subject: [PATCH] docs: update E2E testing guide with HAR-based endpoints --- tests/e2e/README.md | 211 ++++++++++++++++++++++++++++++-------------- 1 file changed, 144 insertions(+), 67 deletions(-) diff --git a/tests/e2e/README.md b/tests/e2e/README.md index d757cf9..ded6efd 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -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 -- **Используй тестовый аккаунт** — не основной аккаунт Kwork -- **Rate limiting** — добавляй задержки между запросами +1. **Требуют реальных credentials** — используйте тестовый аккаунт +2. **Запускаются только локально** — НЕ в CI +3. **Все тесты read-only** — ничего не изменяют на сервере +4. **Rate limiting** — Kwork может ограничивать частые запросы --- ## 🔧 Настройка -### 1. Создай файл окружения +### 1. Создайте файл с credentials ```bash cd /root/kwork-api cp tests/e2e/.env.example tests/e2e/.env ``` -### 2. Заполни credentials +### 2. Заполните credentials ```bash # tests/e2e/.env @@ -27,11 +28,7 @@ KWORK_USERNAME=your_test_username 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 ``` -### Конкретный тест +### Только авторизация ```bash 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 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/ -├── README.md # Этот файл -├── .env.example # Шаблон для credentials -├── conftest.py # Фикстуры и setup -├── test_auth.py # Аутентификация -├── test_catalog.py # Каталог кворков -├── test_projects.py # Биржа проектов -└── test_user.py # Пользовательские данные +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 pytest -from kwork_api import KworkClient - -@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 +import logging +logging.basicConfig(level=logging.DEBUG) ``` ---- - -## 🏷️ Маркировка тестов - -E2E тесты маркируются `@pytest.mark.e2e` для изоляции: +### Посмотреть логи запросов ```bash -# Запустить только unit тесты (исключить e2e) -uv run pytest tests/ -v -m "not e2e" +uv run pytest tests/e2e/test_auth.py::test_login_success -v -s 2>&1 | grep -E "INFO|DEBUG|ERROR" +``` -# Запустить только 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 +## 📝 Добавление новых тестов -### Ошибка аутентификации -``` -KworkAuthError: Invalid credentials -``` -**Решение:** Проверь credentials в `.env` +1. Создайте тест в `tests/e2e/test_*.py` +2. Добавьте маркер `@pytest.mark.e2e` +3. Используйте фикстуру `require_credentials` +4. Убедитесь что тест read-only (не изменяет данные) -### Rate limit +Пример: +```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() ``` -KworkApiError: Too many requests -``` -**Решение:** Запусти с задержкой: `pytest --slowmo=2` -### Session expired -``` -KworkAuthError: Session expired -``` -**Решение:** Перезапусти тесты (session создаётся заново) +--- + +_Updated: 2026-03-29_