🏠 Домашнее задание 7: EmployeeApi

← К оглавлению урока

⚡ ДЗ 7 — кратко

Создать класс EmployeeApi по образцу CompanyApi из урока. Написать тесты для API управления сотрудниками: создать сотрудника, получить по ID, изменить данные.

  • POST /employee/create — создать сотрудника
  • GET /employee/info?id=N — получить по ID
  • PATCH /employee/change/{id} — изменить данные

Условие задания (из LMS)

ДЗ 7. Разработать автоматические тесты, которые проверяют корректность работы API для управления сотрудниками. Создайте класс EmployeeApi для создания вспомогательных методов.

API-методы для работы

1. Создание нового сотрудника

  • Метод: POST
  • URL: http://5.101.50.27:8000/employee/create
  • Описание: Создаёт нового сотрудника, принимает данные в JSON

2. Получение информации о сотруднике

  • Метод: GET
  • URL: http://5.101.50.27:8000/employee/info
  • Описание: Получает данные о сотруднике по его ID

3. Изменение данных о сотруднике

  • Метод: PATCH
  • URL: http://5.101.50.27:8000/employee/change
  • Описание: Позволяет изменить информацию о сотруднике по его ID

Подготовка окружения

1. Создание виртуального окружения

# Терминал (PowerShell)
# Создаём папку проекта и переходим в неё
mkdir hw07-employee-api
cd hw07-employee-api

# Создаём виртуальное окружение
python -m venv venv

# Активируем (PowerShell)
.\venv\Scripts\Activate.ps1

# Проверяем активацию: в приглашении появится (venv)
(venv) PS C:\hw07-employee-api>

2. Установка зависимостей

# Устанавливаем requests и pytest
pip install requests pytest

# Проверяем
pip show requests  # Версия 2.x
pip show pytest    # Версия 8.x

# (Опционально) сохраняем зависимости
pip freeze > requirements.txt

3. Структура проекта

hw07-employee-api/
├── venv/
├── employee_api.py       # Класс EmployeeApi
├── test_employees.py     # Тесты
└── requirements.txt

Пошаговое решение

Шаг 1: Изучить API через Swagger

Открой http://5.101.50.27:8000/docs в браузере. Найди раздел employee. Изучи:

  • Какие поля требуются для создания сотрудника (обязательные и опциональные)
  • Какой формат у ответа GET /employee/info
  • Какие поля можно изменить через PATCH
⚠️ Проверить по документации: точные поля запросов employee/create и employee/change могут отличаться от company. Используй Swagger UI для верификации.

Шаг 2: Создать компанию для сотрудника

Сотрудник всегда принадлежит компании. Для тестирования нужно сначала создать компанию и получить её ID.

# employee_api.py
import requests

BASE_URL = "http://5.101.50.27:8000"

class EmployeeApi:
    """Клиент для работы с API сотрудников X-Clients"""

    def __init__(self, url):
        self.url = url

    def get_token(self, username="harrypotter", password="expelliarmus"):
        """Получить токен авторизации"""
        creds = {"username": username, "password": password}
        resp = requests.post(self.url + "/auth/login", json=creds)
        assert resp.status_code == 200, f"Ошибка авторизации: {resp.status_code}"
        return resp.json()["user_token"]

Шаг 3: Добавить метод создания сотрудника

# employee_api.py — продолжение класса EmployeeApi

    def create_employee(self, first_name, last_name, company_id,
                        phone="", email="", is_active=True):
        """Создать нового сотрудника"""
        employee = {
            "firstName": first_name,
            "lastName": last_name,
            "companyId": company_id,
            "phone": phone,
            "email": email,
            "isActive": is_active
        }
        token = self.get_token()
        resp = requests.post(
            self.url + "/employee/create",
            json=employee,
            headers={"x-client-token": token}  # Проверить в Swagger!
        )
        assert resp.status_code == 201, \
            f"Ошибка создания сотрудника: {resp.status_code} — {resp.text}"
        return resp.json()

Шаг 4: Добавить метод получения сотрудника

# employee_api.py — продолжение

    def get_employee(self, employee_id):
        """Получить сотрудника по ID"""
        resp = requests.get(
            self.url + "/employee/info",
            params={"id": employee_id}
        )
        assert resp.status_code == 200, \
            f"Ошибка получения сотрудника: {resp.status_code}"
        return resp.json()

Шаг 5: Добавить метод изменения сотрудника

# employee_api.py — продолжение

    def change_employee(self, employee_id, last_name=None,
                        email=None, phone=None, is_active=None):
        """Изменить данные сотрудника"""
        token = self.get_token()
        update_data = {}
        if last_name is not None:
            update_data["lastName"] = last_name
        if email is not None:
            update_data["email"] = email
        if phone is not None:
            update_data["phone"] = phone
        if is_active is not None:
            update_data["isActive"] = is_active

        resp = requests.patch(
            self.url + f"/employee/change/{employee_id}",
            json=update_data,
            headers={"x-client-token": token}
        )
        assert resp.status_code == 200, \
            f"Ошибка изменения сотрудника: {resp.status_code} — {resp.text}"
        return resp.json()

Шаг 6: Написать тесты

# test_employees.py
import requests
import pytest
from employee_api import EmployeeApi

BASE_URL = "http://5.101.50.27:8000"

# Вспомогательная функция для создания тестовой компании
def create_test_company(base_url, name="Test Company for Employees"):
    """Создать компанию для тестов сотрудников"""
    resp = requests.post(base_url + "/company/create",
                         json={"name": name, "description": "Test"})
    assert resp.status_code == 201, f"Не удалось создать компанию: {resp.status_code}"
    return resp.json()["id"]


def test_create_employee():
    """Тест: создание нового сотрудника"""
    api = EmployeeApi(BASE_URL)

    # 1. Создаём компанию для сотрудника
    company_id = create_test_company(BASE_URL)

    # 2. Создаём сотрудника
    result = api.create_employee(
        first_name="Ivan",
        last_name="Petrov",
        company_id=company_id,
        phone="+79001234567",
        email="ivan@example.com"
    )

    # 3. Проверяем результат
    assert "id" in result, "В ответе нет поля 'id'"
    print(f"Создан сотрудник с ID: {result['id']}")


def test_get_employee():
    """Тест: создать сотрудника и получить его по ID"""
    api = EmployeeApi(BASE_URL)

    company_id = create_test_company(BASE_URL)

    # Создаём сотрудника и запоминаем ID
    created = api.create_employee(
        first_name="Anna",
        last_name="Sidorova",
        company_id=company_id
    )
    employee_id = created["id"]

    # Получаем по ID и проверяем данные
    employee = api.get_employee(employee_id)
    assert employee["firstName"] == "Anna"
    assert employee["lastName"] == "Sidorova"
    assert employee["isActive"] is True


def test_change_employee():
    """Тест: изменить данные сотрудника"""
    api = EmployeeApi(BASE_URL)

    company_id = create_test_company(BASE_URL)

    # Создаём сотрудника
    created = api.create_employee(
        first_name="Test",
        last_name="Employee",
        company_id=company_id
    )
    employee_id = created["id"]

    # Изменяем фамилию
    new_last_name = "Updated"
    updated = api.change_employee(employee_id, last_name=new_last_name)

    # Проверяем изменение
    assert updated["lastName"] == new_last_name

Запуск тестов

Через терминал (PowerShell)

# Убедись, что виртуальное окружение активировано
(venv) PS C:\hw07-employee-api> pytest test_employees.py -v

# Ожидаемый вывод:
# test_employees.py::test_create_employee PASSED
# test_employees.py::test_get_employee PASSED
# test_employees.py::test_change_employee PASSED
# 3 passed in 3.45s

Запуск через VS Code (F5 / Run and Debug)

  1. Открой test_employees.py в VS Code
  2. Создай файл .vscode/launch.json для отладки pytest:
// .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "pytest: текущий файл",
            "type": "debugpy",
            "request": "launch",
            "module": "pytest",
            "args": [
                "${file}",
                "-v",
                "--tb=short"
            ],
            "console": "integratedTerminal",
            "justMyCode": true
        }
    ]
}
  1. Поставь точку останова на строке с result = api.create_employee(...)
  2. Нажми F5 для запуска с отладчиком
  3. В панели Variables посмотри значение result — там будет весь JSON-ответ

Связь с теорией и примерами