diff --git a/tests/admin_checks/tests.py b/tests/admin_checks/tests.py index 5419fc1009a..eb394f794fd 100644 --- a/tests/admin_checks/tests.py +++ b/tests/admin_checks/tests.py @@ -64,6 +64,10 @@ class SystemChecksTestCase(SimpleTestCase): ] self.assertEqual(errors, expected) + @override_settings(TEMPLATES=[]) + def test_no_template_engines(self): + self.assertEqual(admin.checks.check_dependencies(), []) + @override_settings( INSTALLED_APPS=[ 'django.contrib.admin', @@ -138,6 +142,31 @@ class SystemChecksTestCase(SimpleTestCase): ] self.assertEqual(errors, expected) + def test_list_editable_not_a_list_or_tuple(self): + class SongAdmin(admin.ModelAdmin): + list_editable = 'test' + + self.assertEqual(SongAdmin(Song, AdminSite()).check(), [ + checks.Error( + "The value of 'list_editable' must be a list or tuple.", + obj=SongAdmin, + id='admin.E120', + ) + ]) + + def test_list_editable_missing_field(self): + class SongAdmin(admin.ModelAdmin): + list_editable = ('test',) + + self.assertEqual(SongAdmin(Song, AdminSite()).check(), [ + checks.Error( + "The value of 'list_editable[0]' refers to 'test', which is " + "not an attribute of 'admin_checks.Song'.", + obj=SongAdmin, + id='admin.E121', + ) + ]) + def test_readonly_and_editable(self): class SongAdmin(admin.ModelAdmin): readonly_fields = ["original_release"] @@ -572,6 +601,18 @@ class SystemChecksTestCase(SimpleTestCase): ] self.assertEqual(errors, expected) + def test_readonly_fields_not_list_or_tuple(self): + class SongAdmin(admin.ModelAdmin): + readonly_fields = 'test' + + self.assertEqual(SongAdmin(Song, AdminSite()).check(), [ + checks.Error( + "The value of 'readonly_fields' must be a list or tuple.", + obj=SongAdmin, + id='admin.E034', + ) + ]) + def test_extra(self): class SongAdmin(admin.ModelAdmin): def awesome_song(self, instance): diff --git a/tests/modeladmin/test_checks.py b/tests/modeladmin/test_checks.py index decddee591a..acca6b18a2b 100644 --- a/tests/modeladmin/test_checks.py +++ b/tests/modeladmin/test_checks.py @@ -366,6 +366,17 @@ class RadioFieldsCheckTests(CheckTestCase): class PrepopulatedFieldsCheckTests(CheckTestCase): + def test_not_list_or_tuple(self): + class TestModelAdmin(ModelAdmin): + prepopulated_fields = {'slug': 'test'} + + self.assertIsInvalid( + TestModelAdmin, ValidationTestModel, + 'The value of \'prepopulated_fields["slug"]\' must be a list ' + 'or tuple.', + 'admin.E029' + ) + def test_not_dictionary(self): class TestModelAdmin(ModelAdmin): prepopulated_fields = () @@ -1130,3 +1141,15 @@ class ListDisplayEditableTests(CheckTestCase): "'list_display_links' is set.", id='admin.E124', ) + + def test_both_list_editable_and_list_display_links(self): + class ProductAdmin(ModelAdmin): + list_editable = ('name',) + list_display = ('name',) + list_display_links = ('name',) + self.assertIsInvalid( + ProductAdmin, ValidationTestModel, + "The value of 'name' cannot be in both 'list_editable' and " + "'list_display_links'.", + id='admin.E123', + )