tests.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import unittest
  2. from django.conf import settings
  3. from django.contrib.sites.models import Site
  4. from django.contrib.admindocs import utils
  5. from django.contrib.auth.models import User
  6. from django.core.urlresolvers import reverse
  7. from django.test import TestCase
  8. from django.test.utils import modify_settings, override_settings
  9. class MiscTests(TestCase):
  10. urls = 'admin_docs.urls'
  11. def setUp(self):
  12. User.objects.create_superuser('super', None, 'secret')
  13. self.client.login(username='super', password='secret')
  14. @modify_settings(INSTALLED_APPS={'remove': 'django.contrib.sites'})
  15. @override_settings(SITE_ID=None) # will restore SITE_ID after the test
  16. def test_no_sites_framework(self):
  17. """
  18. Without the sites framework, should not access SITE_ID or Site
  19. objects. Deleting settings is fine here as UserSettingsHolder is used.
  20. """
  21. Site.objects.all().delete()
  22. del settings.SITE_ID
  23. self.client.get('/admindocs/views/') # should not raise
  24. @override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
  25. @unittest.skipUnless(utils.docutils_is_available, "no docutils installed.")
  26. class AdminDocViewTests(TestCase):
  27. fixtures = ['data.xml']
  28. urls = 'admin_docs.urls'
  29. def setUp(self):
  30. self.client.login(username='super', password='secret')
  31. def test_index(self):
  32. self.client.logout()
  33. response = self.client.get(reverse('django-admindocs-docroot'))
  34. # Should display the login screen
  35. self.assertContains(response,
  36. '<input type="hidden" name="next" value="/admindocs/" />', html=True)
  37. self.client.login(username='super', password='secret')
  38. response = self.client.get(reverse('django-admindocs-docroot'))
  39. self.assertContains(response, '<h1>Documentation</h1>', html=True)
  40. self.assertContains(response,
  41. '<h1 id="site-name"><a href="/admin/">Django '
  42. 'administration</a></h1>')
  43. def test_bookmarklets(self):
  44. response = self.client.get(reverse('django-admindocs-bookmarklets'))
  45. self.assertContains(response, 'http://testserver/admin/doc/views/')
  46. def test_templatetag_index(self):
  47. response = self.client.get(reverse('django-admindocs-tags'))
  48. self.assertContains(response, '<h3 id="built_in-extends">extends</h3>', html=True)
  49. def test_templatefilter_index(self):
  50. response = self.client.get(reverse('django-admindocs-filters'))
  51. self.assertContains(response, '<h3 id="built_in-first">first</h3>', html=True)
  52. def test_view_index(self):
  53. response = self.client.get(reverse('django-admindocs-views-index'))
  54. self.assertContains(response,
  55. '<h3><a href="/admindocs/views/django.contrib.admindocs.views.BaseAdminDocsView/">/admindocs/</a></h3>',
  56. html=True)
  57. self.assertContains(response, 'Views by namespace test')
  58. self.assertContains(response, 'Name: <code>test:func</code>.')
  59. def test_view_detail(self):
  60. response = self.client.get(
  61. reverse('django-admindocs-views-detail',
  62. args=['django.contrib.admindocs.views.BaseAdminDocsView']))
  63. # View docstring
  64. self.assertContains(response, 'Base view for admindocs views.')
  65. def test_model_index(self):
  66. response = self.client.get(reverse('django-admindocs-models-index'))
  67. self.assertContains(response, '<h2 id="app-auth">Auth</h2>', html=True)
  68. def test_model_detail(self):
  69. response = self.client.get(reverse('django-admindocs-models-detail',
  70. args=['auth', 'user']))
  71. # Check for attribute, many-to-many field
  72. self.assertContains(response,
  73. '<tr><td>email</td><td>Email address</td><td>email address</td></tr>', html=True)
  74. self.assertContains(response,
  75. '<tr><td>user_permissions.all</td><td>List</td><td>'
  76. '<p>all related <a class="reference external" href="/admindocs/models/auth.permission/">'
  77. 'auth.Permission</a> objects</p></td></tr>', html=True)
  78. def test_template_detail(self):
  79. response = self.client.get(reverse('django-admindocs-templates',
  80. args=['admin_doc/template_detail.html']))
  81. self.assertContains(response,
  82. '<h1>Template: "admin_doc/template_detail.html"</h1>', html=True)
  83. def test_missing_docutils(self):
  84. utils.docutils_is_available = False
  85. try:
  86. response = self.client.get(reverse('django-admindocs-docroot'))
  87. self.assertContains(response,
  88. '<h3>The admin documentation system requires Python\'s '
  89. '<a href="http://docutils.sf.net/">docutils</a> library.</h3>',
  90. html=True)
  91. self.assertContains(response,
  92. '<h1 id="site-name"><a href="/admin/">Django '
  93. 'administration</a></h1>')
  94. finally:
  95. utils.docutils_is_available = True
  96. @override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
  97. class XViewMiddlewareTest(TestCase):
  98. fixtures = ['data.xml']
  99. urls = 'admin_docs.urls'
  100. def test_xview_func(self):
  101. user = User.objects.get(username='super')
  102. response = self.client.head('/xview/func/')
  103. self.assertFalse('X-View' in response)
  104. self.client.login(username='super', password='secret')
  105. response = self.client.head('/xview/func/')
  106. self.assertTrue('X-View' in response)
  107. self.assertEqual(response['X-View'], 'admin_docs.views.xview')
  108. user.is_staff = False
  109. user.save()
  110. response = self.client.head('/xview/func/')
  111. self.assertFalse('X-View' in response)
  112. user.is_staff = True
  113. user.is_active = False
  114. user.save()
  115. response = self.client.head('/xview/func/')
  116. self.assertFalse('X-View' in response)
  117. def test_xview_class(self):
  118. user = User.objects.get(username='super')
  119. response = self.client.head('/xview/class/')
  120. self.assertFalse('X-View' in response)
  121. self.client.login(username='super', password='secret')
  122. response = self.client.head('/xview/class/')
  123. self.assertTrue('X-View' in response)
  124. self.assertEqual(response['X-View'], 'admin_docs.views.XViewClass')
  125. user.is_staff = False
  126. user.save()
  127. response = self.client.head('/xview/class/')
  128. self.assertFalse('X-View' in response)
  129. user.is_staff = True
  130. user.is_active = False
  131. user.save()
  132. response = self.client.head('/xview/class/')
  133. self.assertFalse('X-View' in response)
  134. @unittest.skipUnless(utils.docutils_is_available, "no docutils installed.")
  135. class DefaultRoleTest(TestCase):
  136. urls = 'admin_docs.urls'
  137. def test_parse_rst(self):
  138. """
  139. Tests that ``django.contrib.admindocs.utils.parse_rst`` uses
  140. ``cmsreference`` as the default role.
  141. """
  142. markup = ('<p><a class="reference external" href="/admindocs/%s">'
  143. 'title</a></p>\n')
  144. self.assertEqual(utils.parse_rst('`title`', 'model'),
  145. markup % 'models/title/')
  146. self.assertEqual(utils.parse_rst('`title`', 'view'),
  147. markup % 'views/title/')
  148. self.assertEqual(utils.parse_rst('`title`', 'template'),
  149. markup % 'templates/title/')
  150. self.assertEqual(utils.parse_rst('`title`', 'filter'),
  151. markup % 'filters/#title')
  152. self.assertEqual(utils.parse_rst('`title`', 'tag'),
  153. markup % 'tags/#title')
  154. def test_publish_parts(self):
  155. """
  156. Tests that Django hasn't broken the default role for interpreted text
  157. when ``publish_parts`` is used directly, by setting it to
  158. ``cmsreference``. See #6681.
  159. """
  160. import docutils
  161. self.assertNotEqual(docutils.parsers.rst.roles.DEFAULT_INTERPRETED_ROLE,
  162. 'cmsreference')
  163. source = 'reST, `interpreted text`, default role.'
  164. markup = '<p>reST, <cite>interpreted text</cite>, default role.</p>\n'
  165. parts = docutils.core.publish_parts(source=source, writer_name="html4css1")
  166. self.assertEqual(parts['fragment'], markup)