From f3dc173240d2a91c831b08dd6820e1d83322f3da Mon Sep 17 00:00:00 2001 From: Zan Anderle Date: Thu, 30 Oct 2014 20:45:01 +0100 Subject: Fixed #24917 -- Made admindocs display model methods that take arguments. --- tests/admin_docs/models.py | 11 +++++++++++ tests/admin_docs/tests.py | 33 ++++++++++++++++++++++++++++++++- tests/utils_tests/test_inspect.py | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 tests/utils_tests/test_inspect.py (limited to 'tests') diff --git a/tests/admin_docs/models.py b/tests/admin_docs/models.py index 9ddcb762e1..a425ae0fcd 100644 --- a/tests/admin_docs/models.py +++ b/tests/admin_docs/models.py @@ -44,6 +44,17 @@ class Person(models.Model): def _get_full_name(self): return "%s %s" % (self.first_name, self.last_name) + def rename_company(self, new_name): + self.company.name = new_name + self.company.save() + return new_name + + def dummy_function(self, baz, rox, *some_args, **some_kwargs): + return some_kwargs + + def suffix_company_name(self, suffix='ltd'): + return self.company.name + suffix + def add_image(self): pass diff --git a/tests/admin_docs/tests.py b/tests/admin_docs/tests.py index 7619e01465..ff860f9929 100644 --- a/tests/admin_docs/tests.py +++ b/tests/admin_docs/tests.py @@ -246,7 +246,7 @@ class TestModelDetailView(TestDataMixin, AdminDocsTestCase): def setUp(self): self.client.login(username='super', password='secret') with captured_stderr() as self.docutils_stderr: - self.response = self.client.get(reverse('django-admindocs-models-detail', args=['admin_docs', 'person'])) + self.response = self.client.get(reverse('django-admindocs-models-detail', args=['admin_docs', 'Person'])) def test_method_excludes(self): """ @@ -261,6 +261,34 @@ class TestModelDetailView(TestDataMixin, AdminDocsTestCase): self.assertNotContains(self.response, "set_status") self.assertNotContains(self.response, "save_changes") + def test_methods_with_arguments(self): + """ + Methods that take arguments should also displayed. + """ + self.assertContains(self.response, "

Methods with arguments

") + self.assertContains(self.response, "rename_company") + self.assertContains(self.response, "dummy_function") + self.assertContains(self.response, "suffix_company_name") + + def test_methods_with_arguments_display_arguments(self): + """ + Methods with arguments should have their arguments displayed. + """ + self.assertContains(self.response, "new_name") + + def test_methods_with_arguments_display_arguments_default_value(self): + """ + Methods with keyword arguments should have their arguments displayed. + """ + self.assertContains(self.response, "suffix='ltd'") + + def test_methods_with_multiple_arguments_display_arguments(self): + """ + Methods with multiple arguments should have all their arguments + displayed, but omitting 'self'. + """ + self.assertContains(self.response, "baz, rox, *some_args, **some_kwargs") + def test_method_data_types(self): """ We should be able to get a basic idea of the type returned @@ -368,6 +396,9 @@ class TestModelDetailView(TestDataMixin, AdminDocsTestCase): self.assertContains(self.response, body, html=True) self.assertContains(self.response, model_body, html=True) + def test_model_detail_title(self): + self.assertContains(self.response, '

admin_docs.Person

', html=True) + @unittest.skipUnless(utils.docutils_is_available, "no docutils installed.") class TestUtils(AdminDocsTestCase): diff --git a/tests/utils_tests/test_inspect.py b/tests/utils_tests/test_inspect.py new file mode 100644 index 0000000000..88a9fb0d74 --- /dev/null +++ b/tests/utils_tests/test_inspect.py @@ -0,0 +1,35 @@ +import unittest + +from django.utils import inspect + + +class Person(object): + def no_arguments(self): + return None + + def one_argument(self, something): + return something + + def just_args(self, *args): + return args + + def all_kinds(self, name, address='home', age=25, *args, **kwargs): + return kwargs + + +class TestInspectMethods(unittest.TestCase): + def test_get_func_full_args_no_arguments(self): + self.assertEqual(inspect.get_func_full_args(Person.no_arguments), []) + + def test_get_func_full_args_one_argument(self): + self.assertEqual(inspect.get_func_full_args(Person.one_argument), [('something',)]) + + def test_get_func_full_args_all_arguments(self): + arguments = [('name',), ('address', 'home'), ('age', 25), ('*args',), ('**kwargs',)] + self.assertEqual(inspect.get_func_full_args(Person.all_kinds), arguments) + + def test_func_accepts_var_args_has_var_args(self): + self.assertEqual(inspect.func_accepts_var_args(Person.just_args), True) + + def test_func_accepts_var_args_no_var_args(self): + self.assertEqual(inspect.func_accepts_var_args(Person.one_argument), False) -- cgit v1.3