82 lines
3.2 KiB
Python
82 lines
3.2 KiB
Python
"""
|
|
قرارداد (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}")
|