Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/tests/admin_registration/tests.py
blob: 7471c521d6ce4c02d29839d13018db4cee2761f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
from __future__ import unicode_literals

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.assertTrue(
            isinstance(self.site._registry[Person], admin.options.ModelAdmin)
        )

    def test_registration_with_model_admin(self):
        self.site.register(Person, NameAdmin)
        self.assertTrue(
            isinstance(self.site._registry[Person], NameAdmin)
        )

    def test_prevent_double_registration(self):
        self.site.register(Person)
        self.assertRaises(admin.sites.AlreadyRegistered,
                          self.site.register,
                          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.assertTrue(
            isinstance(self.site._registry[Person], admin.options.ModelAdmin)
        )
        self.assertEqual(self.site._registry[Person].search_fields, ['name'])
        self.assertTrue(
            isinstance(self.site._registry[Place], admin.options.ModelAdmin)
        )
        self.assertEqual(self.site._registry[Place].search_fields, ['name'])

    def test_abstract_model(self):
        """
        Exception is raised when trying to register an abstract model.
        Refs #12004.
        """
        self.assertRaises(ImproperlyConfigured, 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.assertTrue(
            isinstance(self.default_site._registry[Person],
                       admin.options.ModelAdmin)
        )
        self.default_site.unregister(Person)

    def test_custom_site_registration(self):
        register(Person, site=self.custom_site)(NameAdmin)
        self.assertTrue(
            isinstance(self.custom_site._registry[Person],
                       admin.options.ModelAdmin)
        )

    def test_multiple_registration(self):
        register(Traveler, Place)(NameAdmin)
        self.assertTrue(
            isinstance(self.default_site._registry[Traveler],
                       admin.options.ModelAdmin)
        )
        self.default_site.unregister(Traveler)
        self.assertTrue(
            isinstance(self.default_site._registry[Place],
                       admin.options.ModelAdmin)
        )
        self.default_site.unregister(Place)

    def test_wrapped_class_not_a_model_admin(self):
        self.assertRaisesMessage(ValueError, 'Wrapped class must subclass ModelAdmin.',
            register(Person), CustomSite)

    def test_custom_site_not_an_admin_site(self):
        self.assertRaisesMessage(ValueError, 'site must subclass AdminSite',
            register(Person, site=Traveler), NameAdmin)