Files
sankalp addd785605 feat(django_nepkit/tests): add tests for _get_field_ne_setting and NepaliDateFormField validation
Distinguish explicit `False` from default and ensure proper `ValidationError` for malformed Nepali dates
2026-06-06 21:36:08 +05:45

132 lines
4.2 KiB
Python

"""
Tests for ``NepaliModelAdmin`` media and address-chaining integration.
"""
from django.db import models
from django.test import override_settings
from django_nepkit.admin import NepaliModelAdmin
from django_nepkit.models import (
DistrictField,
MunicipalityField,
NepaliTimeField,
ProvinceField,
)
from django_nepkit.widgets import NepaliTimeWidget
from django.contrib.admin.sites import AdminSite
class _ChainedModel(models.Model):
province = ProvinceField()
district = DistrictField()
municipality = MunicipalityField()
class Meta:
app_label = "django_nepkit"
class _TimeModel(models.Model):
t = NepaliTimeField()
class Meta:
app_label = "django_nepkit"
class _PlainModel(models.Model):
name = models.CharField(max_length=10)
class Meta:
app_label = "django_nepkit"
class TestNepaliModelAdminMedia:
def test_includes_address_chaining_js(self):
admin_cls = NepaliModelAdmin(_ChainedModel, AdminSite())
js = admin_cls.media._js
assert "django_nepkit/js/nepal-data.js" in js
assert "django_nepkit/js/address-chaining.js" in js
def test_chaining_js_ordered_after_data(self):
admin_cls = NepaliModelAdmin(_ChainedModel, AdminSite())
js = list(admin_cls.media._js)
data_idx = js.index("django_nepkit/js/nepal-data.js")
chain_idx = js.index("django_nepkit/js/address-chaining.js")
assert data_idx < chain_idx
def test_time_widget_carries_its_own_js(self):
"""The NepaliTimeWidget contributes its own JS via form media."""
from django_nepkit.widgets import NepaliTimeWidget
widget = NepaliTimeWidget()
js = list(widget.media._js)
assert "django_nepkit/js/nepali-time-init.js" in js
class TestAdminUsesNepaliTimeWidget:
def test_time_field_gets_nepali_widget(self):
admin_cls = NepaliModelAdmin(_TimeModel, AdminSite())
ff = admin_cls.formfield_for_dbfield(
_TimeModel._meta.get_field("t"), request=None
)
assert isinstance(ff.widget, NepaliTimeWidget)
def test_time_widget_inherits_ne_setting(self):
admin_cls = NepaliModelAdmin(_TimeModel, AdminSite())
ff = admin_cls.formfield_for_dbfield(
_TimeModel._meta.get_field("t"), request=None
)
assert ff.widget.ne is False
assert ff.widget.en is True
class TestFormfieldForDbfieldIdempotency:
def test_unrelated_field_falls_through(self):
admin_cls = NepaliModelAdmin(_PlainModel, AdminSite())
ff = admin_cls.formfield_for_dbfield(
_PlainModel._meta.get_field("name"), request=None
)
assert ff is not None
class TestGetFieldNeSetting:
"""``_get_field_ne_setting`` must distinguish 'no opinion' from explicit ``False``."""
def test_ne_true_field(self):
class _Model(models.Model):
t = NepaliTimeField(ne=True)
class Meta:
app_label = "django_nepkit"
admin_cls = NepaliModelAdmin(_Model, AdminSite())
assert admin_cls._get_field_ne_setting("t") is True
def test_ne_false_field_keeps_explicit_false(self):
"""An explicit ``ne=False`` must NOT be silently overwritten."""
class _Model(models.Model):
t = NepaliTimeField(ne=False)
class Meta:
app_label = "django_nepkit"
admin_cls = NepaliModelAdmin(_Model, AdminSite())
# Even with the project defaulting to "ne", the explicit False wins.
with override_settings(NEPKIT={"DEFAULT_LANGUAGE": "ne"}):
assert admin_cls._get_field_ne_setting("t") is False
def test_unknown_field_returns_none(self):
admin_cls = NepaliModelAdmin(_TimeModel, AdminSite())
assert admin_cls._get_field_ne_setting("nonexistent") is None
def test_plain_field_without_ne_returns_none(self):
class _Model(models.Model):
name = models.CharField(max_length=10)
class Meta:
app_label = "django_nepkit"
admin_cls = NepaliModelAdmin(_Model, AdminSite())
# ``CharField`` has no ``ne`` attribute → None (was previously False).
assert admin_cls._get_field_ne_setting("name") is None