sputnikqa 0.0.2b2
Extensible test automation framework — built for QA engineers who value clean architecture and scalability.
License: MIT
Requires Python: <4.0,>=3.13

# 🛰️ SputnikQA — Test Automation Framework
![PyPI version](https://img.shields.io/pypi/v/sputnikqa.svg)
![Python versions](https://img.shields.io/pypi/pyversions/sputnikqa.svg)
![License](https://img.shields.io/pypi/l/sputnikqa.svg)

___

**SputnikQA** — это современный, типизированный и расширяемый фреймворк для написания автотестов на Python.

Идеально подходит для команд, которые хотят писать читаемые, надёжные и поддерживаемые автотесты.


## Установка
```bash
# Основной пакет
pip install sputnikqa

# С интеграцией Allure (рекомендуется)
pip install sputnikqa[allure]
```


## Основные возможности
- restapi booster
  - [x] **Типизированные модели ответов** через `Pydantic`
  - [x] **Автоматическая валидация** статуса и тела ответа
  - [x] **Декларативные секции API** (`BaseApiSection`) — по аналогии с Page Object
  - [x] **Билдеры запросов** — для удобного формирования тел и multipart-загрузок
  - [x] **Поддержка middleware** — логирование, авторизация, retry и др.
  - [x] **Встроенная интеграция с Allure**:
    - шаги с `@allure.step`
    - прикрепление cURL, статуса и тела ответа
  - [x] **Гибкий HTTP-клиент** — поддержка `httpx`, `requests` и кастомных реализаций
  - [x] **Поддержка async/await** через `AsyncApiClient`


## Пример использования
### 1. Определите модель ответа
```python
from sputnikqa.boosters.restapi.response_models import JsonResponse

class Pet(JsonResponse):
    id: int | None = None
    name: str
    status: str
```

### 2. Создайте секцию API
```python
from sputnikqa.boosters.restapi.sections.base import BaseApiSection

class PetSection(BaseApiSection):
    base_url = "https://petstore.swagger.io/v2"

    def get_pet_by_id(self, pet_id: int):
        response = self.client.get(self.url_join(f"/pet/{pet_id}"))
        return (
            self.validator(response)
            .validate_status(200)
            .validate_response_model({200: Pet})
        )
```

### 3. Напишите тест
```python
def test_get_pet(pet_section):
    pet = pet_section.get_pet_by_id(1).get_validated_model()
    assert pet.name == "doggie"
    assert pet.status == "available"
```


## Архитектура
```text
sputnikqa/
├── boosters/
│   └── restapi/
│       ├── clients/          # HTTP-клиенты (httpx, requests и др.)
│       ├── middleware/       # Middleware (логирование, авторизация)
│       ├── request_builders/ # Билдеры (тело, файлы)
│       ├── response_models/  # Базовые модели ответов
│       ├── sections/         # Базовый класс секций
│       └── validators/       # Валидаторы ответов
└── integrations/
    └── allure/               # Интеграция с Allure
```


## Интеграции
### Allure
Автоматически прикрепляет к отчёту:

- cURL-команду запроса
- HTTP-статус
- тело ответа

```python
from sputnikqa.integrations.allure.client import ApiClientAllure
from sputnikqa.integrations.allure.middleware import AllureMiddleware

client = ApiClientAllure(HttpxClient(), middlewares=[AllureMiddleware()])
```
> Требуется: `pip install sputnikqa[allure]`


## Документация и примеры
Полный пример тестов для [Petstore API](https://petstore.swagger.io/) доступен в репозитории:

- Пример: [`response_models.py`](./examples/src/petstore_api/response_models.py)
- Пример: [`sections/pet.py`](./examples/src/petstore_api/sections/pet.py)
- Пример: [`test_pet.py`](./examples/tests/petstore_api/test_pet.py)


## Для разработчиков
Хотите расширить фреймворк?

- Реализуйте свой `BaseHttpClient` для кастомного HTTP-стека.
- Напишите middleware для авторизации, retry или трассировки.
- Используйте `PrimitiveResponse` для обёртки примитивов (`str`, `int`, `dict`).


## Лицензия
Distributed under the MIT License. See [LICENSE](LICENSE) for more information.

___

> SputnikQA — ваш надёжный спутник в мире автоматизации тестирования. 

📌 PyPI: https://pypi.org/project/sputnikqa/  
📌 GitVerse: https://gitverse.ru/crenom/SputnikQA