from django.contrib import admin from django.contrib.admin.decorators import register from django.contrib.admin.sites import site from django.core.exceptions import ImproperlyConfigured from django.test import SimpleTestCase from .models import Location, Person, Place, Traveler class NameAdmin(admin.ModelAdmin): list_display = ['name'] save_on_top = True class CustomSite(admin.AdminSite): pass class TestRegistration(SimpleTestCase): def setUp(self): self.site = admin.AdminSite() def test_bare_registration(self): self.site.register(Person) self.assertIsInstance(self.site._registry[Person], admin.ModelAdmin) self.site.unregister(Person) self.assertEqual(self.site._registry, {}) def test_registration_with_model_admin(self): self.site.register(Person, NameAdmin) self.assertIsInstance(self.site._registry[Person], NameAdmin) self.site.unregister(Person) self.assertEqual(self.site._registry, {}) def test_prevent_double_registration(self): self.site.register(Person) msg = "The model Person is already registered in app 'admin_registration'." with self.assertRaisesMessage(admin.sites.AlreadyRegistered, msg): self.site.register(Person) def test_prevent_double_registration_for_custom_admin(self): class PersonAdmin(admin.ModelAdmin): pass self.site.register(Person, PersonAdmin) msg = "The model Person is already registered with 'admin_registration.PersonAdmin'." with self.assertRaisesMessage(admin.sites.AlreadyRegistered, msg): self.site.register(Person, PersonAdmin) def test_unregister_unregistered_model(self): msg = 'The model Person is not registered' with self.assertRaisesMessage(admin.sites.NotRegistered, msg): self.site.unregister(Person) def test_registration_with_star_star_options(self): self.site.register(Person, search_fields=['name']) self.assertEqual(self.site._registry[Person].search_fields, ['name']) def test_star_star_overrides(self): self.site.register(Person, NameAdmin, search_fields=["name"], list_display=['__str__']) self.assertEqual(self.site._registry[Person].search_fields, ['name']) self.assertEqual(self.site._registry[Person].list_display, ['__str__']) self.assertTrue(self.site._registry[Person].save_on_top) def test_iterable_registration(self): self.site.register([Person, Place], search_fields=['name']) self.assertIsInstance(self.site._registry[Person], admin.ModelAdmin) self.assertEqual(self.site._registry[Person].search_fields, ['name']) self.assertIsInstance(self.site._registry[Place], admin.ModelAdmin) self.assertEqual(self.site._registry[Place].search_fields, ['name']) self.site.unregister([Person, Place]) self.assertEqual(self.site._registry, {}) def test_abstract_model(self): """ Exception is raised when trying to register an abstract model. Refs #12004. """ msg = 'The model Location is abstract, so it cannot be registered with admin.' with self.assertRaisesMessage(ImproperlyConfigured, msg): self.site.register(Location) def test_is_registered_model(self): "Checks for registered models should return true." self.site.register(Person) self.assertTrue(self.site.is_registered(Person)) def test_is_registered_not_registered_model(self): "Checks for unregistered models should return false." self.assertFalse(self.site.is_registered(Person)) class TestRegistrationDecorator(SimpleTestCase): """ Tests the register decorator in admin.decorators For clarity: @register(Person) class AuthorAdmin(ModelAdmin): pass is functionally equal to (the way it is written in these tests): AuthorAdmin = register(Person)(AuthorAdmin) """ def setUp(self): self.default_site = site self.custom_site = CustomSite() def test_basic_registration(self): register(Person)(NameAdmin) self.assertIsInstance(self.default_site._registry[Person], admin.ModelAdmin) self.default_site.unregister(Person) def test_custom_site_registration(self): register(Person, site=self.custom_site)(NameAdmin) self.assertIsInstance(self.custom_site._registry[Person], admin.ModelAdmin) def test_multiple_registration(self): register(Traveler, Place)(NameAdmin) self.assertIsInstance(self.default_site._registry[Traveler], admin.ModelAdmin) self.default_site.unregister(Traveler) self.assertIsInstance(self.default_site._registry[Place], admin.ModelAdmin) self.default_site.unregister(Place) def test_wrapped_class_not_a_model_admin(self): with self.assertRaisesMessage(ValueError, 'Wrapped class must subclass ModelAdmin.'): register(Person)(CustomSite) def test_custom_site_not_an_admin_site(self): with self.assertRaisesMessage(ValueError, 'site must subclass AdminSite'): register(Person, site=Traveler)(NameAdmin) def test_empty_models_list_registration_fails(self): with self.assertRaisesMessage(ValueError, 'At least one model must be passed to register.'): register()(NameAdmin)