This commit is contained in:
javad committed 2026-10-09 20:02:36 +03:30
1 parent 6f36db63a1
commit 250cdbab7f
42 files changed
+96363 -11699

No files matched your search

+81
View File
@@ -0,0 +1,81 @@
"""
قرارداد (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}")