""" قرارداد (Contract) پکیج مدل‌ها پس از بازنویسی. هدف: تضمین اینکه تقسیم `admin_panel/models.py` به پکیج `admin_panel/models/` هیچ نامی را حذف نکرده، `app_label`ها ثابت مانده‌اند و نام جدول‌های دیتابیس دقیقاً همان مقادیر پیشین هستند (شرط لازم برای «No changes detected» در مایگریشن‌ها). """ from django.apps import apps from django.test import SimpleTestCase import admin_panel.models as models_pkg # ۱۸ مدل اصلی فایل قدیمی models.py (پیش از بازنویسی) EXPECTED_MODELS = [ 'UserProfile', 'Customer', 'PhoneNumber', 'StoreRoom', 'StoreRoomOwner', 'ProductCategory', 'Product', 'Factor', 'ProductInStore', 'ProductStockHistory', 'StoreTransferRequest', 'FactorIteam', 'VisitQueue', 'ArticleType', 'Article', 'Action', 'Sarresid', 'CacheTable', ] # نام‌هایی که کدهای دیگر از طریق star-import به آن‌ها تکیه دارند # (مثلاً context_processor.py از `User` استفاده می‌کند که از همین نشتی می‌آید). LEAKED_NAMES = ['models', 'User', 'Sum', 'transaction', 'connection', 'ValidationError'] class ModelsPackageContractTests(SimpleTestCase): def test_all_models_importable_from_package(self): for name in EXPECTED_MODELS: self.assertTrue( hasattr(models_pkg, name), msg=f"مدل «{name}» از admin_panel.models قابل import نیست.", ) def test_models_are_registered_under_admin_panel_app(self): for name in EXPECTED_MODELS: model = getattr(models_pkg, name) self.assertEqual( model._meta.app_label, 'admin_panel', msg=f"app_label مدل {name} تغییر کرده است: {model._meta.app_label}", ) def test_db_table_names_are_unchanged_defaults(self): for name in EXPECTED_MODELS: model = getattr(models_pkg, name) expected = f"admin_panel_{name.lower()}" self.assertEqual( model._meta.db_table, expected, msg=f"نام جدول مدل {name} تغییر کرده است: {model._meta.db_table} != {expected}", ) def test_star_import_leak_names_still_present(self): """ رفتار star-import باید دقیقاً مانند فایل تک‌پارچه‌ی قبلی حفظ شود؛ چراکه context_processor.py و چند ماژول دیگر به نشتی نام‌هایی مثل `User` و `models` وابسته‌اند. """ for name in LEAKED_NAMES: self.assertTrue( hasattr(models_pkg, name), msg=f"نام «{name}» که از طریق star-import منتشر می‌شد، حذف شده است.", ) def test_models_package_has_no_duplicate_registration(self): registered = [m for m in apps.get_app_config('admin_panel').get_models()] labels = [m.__name__ for m in registered] self.assertEqual(len(labels), len(set(labels)), msg=f"نام تکراری مدل: {labels}")