feat: обновления парсеров, тестов и миграций
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

- Обновлены клиенты парсеров (checko, fns, minpromtorg, proverki, zakupki)
- Добавлены новые миграции для моделей
- Расширено покрытие тестами
- Обновлены конфигурации и настройки проекта
- Добавлены утилиты для тестирования

Co-Authored-By: Warp <agent@warp.dev>
This commit is contained in:
2026-02-10 10:17:47 +01:00
parent 975d019ba5
commit ee95628a0a
59 changed files with 7292 additions and 2876 deletions

View File

@@ -1,11 +1,18 @@
"""Тесты для Model Mixins."""
from django.db import connection, models
from django.test import TestCase, TransactionTestCase
from django.test.utils import isolate_apps
from apps.core.mixins import (
AuditMixin,
OrderableMixin,
SlugMixin,
SoftDeleteMixin,
StatusMixin,
TimestampMixin,
)
from django.test import TestCase
from tests.apps.user.factories import UserFactory
class TimestampMixinTest(TestCase):
@@ -108,3 +115,93 @@ class OrderableMixinTest(TestCase):
def test_orderable_mixin_has_order_field(self):
"""Проверка наличия поля order."""
self.assertTrue(hasattr(OrderableMixin, "order"))
@isolate_apps("apps.core")
class MixinsBehaviorTest(TransactionTestCase):
class TestModel(
SoftDeleteMixin,
OrderableMixin,
StatusMixin,
SlugMixin,
AuditMixin,
TimestampMixin,
models.Model,
):
name = models.CharField(max_length=50)
class Meta:
app_label = "core"
@classmethod
def setUpClass(cls):
super().setUpClass()
table_name = cls.TestModel._meta.db_table
existing_tables = connection.introspection.table_names()
with connection.schema_editor() as schema_editor:
if table_name in existing_tables:
schema_editor.delete_model(cls.TestModel)
schema_editor.create_model(cls.TestModel)
@classmethod
def tearDownClass(cls):
table_name = cls.TestModel._meta.db_table
with connection.schema_editor() as schema_editor:
if table_name in connection.introspection.table_names():
schema_editor.delete_model(cls.TestModel)
super().tearDownClass()
def test_soft_delete_and_restore(self):
user = UserFactory.create_user()
obj = self.TestModel.objects.create(
name=f"item-{user.id}",
slug=f"slug-{user.id}",
created_by=user,
)
obj.delete()
self.assertTrue(obj.is_deleted)
self.assertIsNotNone(obj.deleted_at)
self.assertEqual(self.TestModel.objects.count(), 0)
self.assertEqual(self.TestModel.all_objects.count(), 1)
obj.restore()
self.assertFalse(obj.is_deleted)
self.assertEqual(self.TestModel.objects.count(), 1)
def test_soft_delete_queryset_methods(self):
obj = self.TestModel.objects.create(name="alive", slug="alive-slug")
self.TestModel.objects.filter(id=obj.id).delete()
self.assertEqual(self.TestModel.objects.count(), 0)
self.assertEqual(self.TestModel.objects.deleted_only().count(), 1)
def test_hard_delete(self):
obj = self.TestModel.objects.create(name="hard", slug="hard-slug")
obj.hard_delete()
self.assertEqual(self.TestModel.all_objects.count(), 0)
def test_orderable_moves(self):
obj = self.TestModel.objects.create(name="ord", slug="ord-slug", order=2)
obj.move_up()
obj.refresh_from_db()
self.assertEqual(obj.order, 1)
obj.move_down()
obj.refresh_from_db()
self.assertEqual(obj.order, 2)
obj.move_to(5)
obj.refresh_from_db()
self.assertEqual(obj.order, 5)
obj.move_to(-1)
obj.refresh_from_db()
self.assertEqual(obj.order, 5)
def test_status_transitions(self):
obj = self.TestModel.objects.create(name="status", slug="status-slug")
self.assertTrue(obj.is_draft)
obj.activate()
obj.refresh_from_db()
self.assertTrue(obj.is_active_status)
obj.deactivate()
obj.refresh_from_db()
self.assertEqual(obj.status, obj.Status.INACTIVE)
obj.archive()
obj.refresh_from_db()
self.assertTrue(obj.is_archived)