"""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))