test(core): Function Model test suite for CenturionModelNote Meta Models

ref: #779 #778 #768
This commit is contained in:
2025-05-30 10:16:46 +09:30
parent 5bf9c30c58
commit 1fa3278b73
2 changed files with 168 additions and 0 deletions

View File

@ -0,0 +1,10 @@
import pytest
from core.models.centurion_notes import CenturionModelNote
@pytest.fixture( scope = 'class')
def model(request):
yield CenturionModelNote

View File

@ -0,0 +1,158 @@
import pytest
from django.apps import apps
from django.conf import settings
from core.tests.functional.centurion_abstract.test_functional_centurion_abstract_model import (
CenturionAbstractModelInheritedCases
)
@pytest.mark.note_models
class CenturionNoteModelTestCases(
CenturionAbstractModelInheritedCases
):
kwargs_create_item = {
'body': 'a random note',
'created_by': 'fixture sets value',
'content_type': 'fixture sets value',
}
@pytest.fixture( scope = 'class', autouse = True )
def setup_vars(self, content_type, django_db_blocker, user, model):
with django_db_blocker.unblock():
try:
content_type = content_type.objects.get(
app_label = model._meta.app_label,
model = model._meta.model_name,
)
except content_type.DoesNotExist:
# Enable Abstract models to be tested
content_type = content_type.objects.get(
pk = 1,
)
self.kwargs_create_item.update({
'content_type': content_type,
'created_by': user,
})
class CenturionNoteModelInheritedCases(
CenturionNoteModelTestCases,
):
pass
class CenturionNoteModelPyTest(
CenturionNoteModelTestCases,
):
@staticmethod
def get_models( excludes: list[ str ] ) -> list[ tuple ]:
"""Fetch models from Centurion Apps
Args:
excludes (list[ str ]): Words that may be in a models name to exclude
Returns:
list[ tuple ]: Centurion ERP Only models
"""
models: list = []
model_apps: list = []
exclude_model_apps = [
'django',
'django_celery_results',
'django_filters',
'drf_spectacular',
'drf_spectacular_sidecar',
'coresheaders',
'corsheaders',
'rest_framework',
'rest_framework_json_api',
'social_django',
]
for app in settings.INSTALLED_APPS:
app = app.split('.')[0]
if app in exclude_model_apps:
continue
model_apps += [ app ]
for model in apps.get_models():
if model._meta.app_label not in model_apps:
continue
skip = False
for exclude in excludes:
if exclude in str(model._meta.model_name):
skip = True
break
if skip:
continue
models += [ (model,) ]
return models
history_models = get_models( [ 'audithistory', 'base', 'history', 'note', 'ticket' ] )
@pytest.mark.parametrize(
argnames = [
'test_model'
],
argvalues = history_models,
ids = [
model[0]._meta.app_label + '_' + model[0]._meta.model_name for model in history_models
]
)
def test_model_has_notes_model(self, test_model, model):
"""Model Note Table check
Check if the model has a corresponding notes table that should be
called `<app_label>_<model_name>_centurionmodelnote`
"""
if test_model._meta.abstract:
pytest.xfail( reason = 'Model is an Abstract Model and can not be created.' )
elif not getattr(test_model, '_notes_enabled', False):
pytest.xfail( reason = 'Model has model notes disabled.' )
note_model = apps.get_model(
app_label = test_model._meta.app_label,
model_name = f'{test_model._meta.object_name}CenturionModelNote'
)
assert note_model.__name__ == f'{test_model._meta.object_name}CenturionModelNote'