Files
mostovik-backend/tests/apps/parsers/factories.py
Aleksandr Meshchriakov ee95628a0a
Some checks failed
CI/CD Pipeline / Run Tests (push) Failing after 37s
CI/CD Pipeline / Code Quality Checks (push) Failing after 43s
CI/CD Pipeline / Build & Push Images (push) Has been skipped
CI/CD Pipeline / Deploy (dev) (push) Has been skipped
CI/CD Pipeline / Deploy (prod) (push) Has been skipped
CI/CD Pipeline / Code Quality Checks (pull_request) Failing after 0s
CI/CD Pipeline / Run Tests (pull_request) Failing after 0s
CI/CD Pipeline / Build & Push Images (pull_request) Has been skipped
CI/CD Pipeline / Deploy (dev) (pull_request) Has been skipped
CI/CD Pipeline / Deploy (prod) (pull_request) Has been skipped
feat: обновления парсеров, тестов и миграций
- Обновлены клиенты парсеров (checko, fns, minpromtorg, proverki, zakupki)
- Добавлены новые миграции для моделей
- Расширено покрытие тестами
- Обновлены конфигурации и настройки проекта
- Добавлены утилиты для тестирования

Co-Authored-By: Warp <agent@warp.dev>
2026-02-10 10:17:47 +01:00

149 lines
4.9 KiB
Python

"""Factories for parsers tests (Faker-based)."""
from __future__ import annotations
from datetime import timedelta
import factory
from faker import Faker
from apps.parsers.models import (
IndustrialCertificateRecord,
InspectionRecord,
ManufacturerRecord,
ParserLoadLog,
Proxy,
)
from django.utils import timezone
fake = Faker("ru_RU")
# === Хелперы для генерации реалистичных данных ===
def _digits(length: int) -> str:
return "".join(str(fake.random_int(0, 9)) for _ in range(length))
def generate_inn_legal() -> str:
"""Генерация ИНН юридического лица (10 цифр)."""
return _digits(10)
def generate_ogrn() -> str:
"""Генерация ОГРН юридического лица (13 цифр)."""
return _digits(13)
def generate_certificate_number() -> str:
"""Генерация номера сертификата промпроизводства."""
prefix = fake.random_element(["ПП", "СПП", "ЗППП"])
year = fake.random_int(min=2020, max=2025)
number = _digits(5)
return f"{prefix}-{year}-{number}"
def generate_company_name() -> str:
"""Генерация названия компании."""
return fake.company()
def generate_legal_address() -> str:
"""Генерация юридического адреса."""
return fake.address().replace("\n", ", ")
def generate_proxy_address() -> str:
"""Генерация адреса прокси."""
return f"http://{fake.ipv4()}:{fake.port_number()}"
def generate_registration_number() -> str:
"""Генерация номера регистрации проверки."""
return f"{fake.random_int(min=1, max=99)}{fake.random_int(min=2020, max=2025)}{_digits(6)}"
def generate_control_authority() -> str:
"""Генерация названия контролирующего органа."""
return fake.company()
class ProxyFactory(factory.django.DjangoModelFactory):
"""Factory for Proxy model."""
class Meta:
model = Proxy
address = factory.LazyFunction(generate_proxy_address)
description = factory.LazyAttribute(lambda _: fake.sentence(nb_words=3))
is_active = True
fail_count = 0
last_used_at = factory.LazyAttribute(
lambda _: timezone.now() - timedelta(hours=fake.random_int(min=1, max=72))
)
class ParserLoadLogFactory(factory.django.DjangoModelFactory):
"""Factory for ParserLoadLog model."""
class Meta:
model = ParserLoadLog
batch_id = factory.Sequence(lambda n: n + 1)
source = factory.LazyAttribute(
lambda _: fake.random_element([s[0] for s in ParserLoadLog.Source.choices])
)
records_count = factory.LazyAttribute(lambda _: fake.random_int(min=0, max=5000))
status = "success"
error_message = ""
class IndustrialCertificateRecordFactory(factory.django.DjangoModelFactory):
"""Factory for IndustrialCertificateRecord model."""
class Meta:
model = IndustrialCertificateRecord
load_batch = factory.Sequence(lambda n: n + 1)
issue_date = factory.LazyAttribute(lambda _: str(fake.date()))
certificate_number = factory.LazyFunction(generate_certificate_number)
expiry_date = factory.LazyAttribute(lambda _: str(fake.date()))
certificate_file_url = factory.LazyAttribute(lambda _: fake.url())
organisation_name = factory.LazyFunction(generate_company_name)
inn = factory.LazyFunction(generate_inn_legal)
ogrn = factory.LazyFunction(generate_ogrn)
class ManufacturerRecordFactory(factory.django.DjangoModelFactory):
"""Factory for ManufacturerRecord model."""
class Meta:
model = ManufacturerRecord
load_batch = factory.Sequence(lambda n: n + 1)
full_legal_name = factory.LazyFunction(generate_company_name)
inn = factory.LazyFunction(generate_inn_legal)
ogrn = factory.LazyFunction(generate_ogrn)
address = factory.LazyFunction(generate_legal_address)
class InspectionRecordFactory(factory.django.DjangoModelFactory):
"""Factory for InspectionRecord model."""
class Meta:
model = InspectionRecord
load_batch = factory.Sequence(lambda n: n + 1)
registration_number = factory.LazyFunction(generate_registration_number)
inn = factory.LazyFunction(generate_inn_legal)
ogrn = factory.LazyFunction(generate_ogrn)
organisation_name = factory.LazyFunction(generate_company_name)
control_authority = factory.LazyFunction(generate_control_authority)
inspection_type = factory.LazyAttribute(lambda _: fake.word())
inspection_form = factory.LazyAttribute(lambda _: fake.word())
start_date = factory.LazyAttribute(lambda _: str(fake.date()))
end_date = factory.LazyAttribute(lambda _: str(fake.date()))
status = factory.LazyAttribute(lambda _: fake.word())
legal_basis = factory.LazyAttribute(lambda _: fake.sentence(nb_words=4))
result = factory.LazyAttribute(lambda _: fake.sentence(nb_words=3))