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
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user