204 lines
6.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Общие fixtures для тестов API модуля procurement.
"""
import pytest
from decimal import Decimal
from datetime import date
from employees.models import Department, Employee, EmployeeDepartment
from procurement.models import (
Budget,
Equipment,
EquipmentCategory,
ProcurementItem,
ProcurementRequest,
Supplier,
)
from procurement.constants import (
ProcurementStatus,
UrgencyLevel,
EquipmentStatus,
)
# ==============================================================================
# ПОЛЬЗОВАТЕЛИ
# ==============================================================================
@pytest.fixture
def user_factory(db):
"""Фабрика для создания пользователей."""
def _create_user(email, **kwargs):
defaults = {
"password": "testpass123",
"phone_number": f"+7999{email[:7]}",
"first_name": "Тест",
"last_name": "Пользователь",
"send_activation_email": False,
}
defaults.update(kwargs)
return Employee.objects.create_user(email=email, **defaults)
return _create_user
@pytest.fixture
def link_factory(db):
"""Фабрика для связи пользователя с отделом."""
def _link(employee, department, **kwargs):
defaults = {"is_active": True}
defaults.update(kwargs)
return EmployeeDepartment.objects.create(
employee=employee,
department=department,
**defaults
)
return _link
# ==============================================================================
# ОТДЕЛЫ И БЮДЖЕТЫ
# ==============================================================================
@pytest.fixture
def department_factory(db):
"""Фабрика для создания отделов."""
def _create_department(name="Тестовый отдел", **kwargs):
defaults = {"description": f"Описание {name}"}
defaults.update(kwargs)
return Department.objects.create(name=name, **defaults)
return _create_department
@pytest.fixture
def budget_factory(db):
"""Фабрика для создания бюджетов."""
def _create_budget(department, year=2026, quarter=1, **kwargs):
defaults = {
"allocated_amount": Decimal("1000000.00"),
"spent_amount": Decimal("0.00"),
}
defaults.update(kwargs)
return Budget.objects.create(
department=department,
year=year,
quarter=quarter,
**defaults
)
return _create_budget
# ==============================================================================
# ЗАЯВКИ НА ЗАКУПКУ
# ==============================================================================
@pytest.fixture
def procurement_request_factory(db):
"""Фабрика для создания заявок на закупку."""
def _create_request(department, requestor, **kwargs):
defaults = {
"title": "Тестовая заявка",
"description": "Описание заявки",
"status": ProcurementStatus.DRAFT,
"urgency": UrgencyLevel.MEDIUM,
}
defaults.update(kwargs)
return ProcurementRequest.objects.create(
department=department,
requestor=requestor,
**defaults
)
return _create_request
@pytest.fixture
def procurement_item_factory(db):
"""Фабрика для создания позиций в заявке."""
def _create_item(request, **kwargs):
defaults = {
"name": "Тестовый товар",
"description": "Описание товара",
"quantity": 1,
"unit": "шт",
"estimated_unit_price": Decimal("10000.00"),
}
defaults.update(kwargs)
return ProcurementItem.objects.create(
request=request,
**defaults
)
return _create_item
# ==============================================================================
# ОБОРУДОВАНИЕ
# ==============================================================================
@pytest.fixture
def category_factory(db):
"""Фабрика для создания категорий оборудования."""
def _create_category(name="Тестовая категория", **kwargs):
defaults = {
"description": f"Описание {name}",
"icon": "bi-box",
}
defaults.update(kwargs)
return EquipmentCategory.objects.create(name=name, **defaults)
return _create_category
@pytest.fixture
def equipment_factory(db):
"""Фабрика для создания оборудования."""
counter = {"value": 0}
def _create_equipment(category, department, **kwargs):
counter["value"] += 1
defaults = {
"name": f"Тестовое оборудование {counter['value']}",
"inventory_number": f"INV-TEST-{counter['value']:04d}",
"status": EquipmentStatus.AVAILABLE,
"purchase_date": date.today(),
"purchase_cost": Decimal("50000.00"),
}
defaults.update(kwargs)
return Equipment.objects.create(
category=category,
department=department,
**defaults
)
return _create_equipment
# ==============================================================================
# ПОСТАВЩИКИ
# ==============================================================================
@pytest.fixture
def supplier_factory(db):
"""Фабрика для создания поставщиков."""
def _create_supplier(name="Тестовый поставщик", **kwargs):
defaults = {
"contact_person": "Контактное лицо",
"phone": "+79991112233",
"email": "supplier@example.com",
"is_active": True,
}
defaults.update(kwargs)
return Supplier.objects.create(name=name, **defaults)
return _create_supplier