cms.test_utils.testcases: 190 total statements, 0.0% covered

Generated: Wed 2013-03-13 10:33 CET

Source file: /media/Envs/Envs/filer-gallery/lib/python2.7/site-packages/cms/test_utils/testcases.py

Stats: 0 executed, 175 missed, 15 excluded, 103 ignored

  1. # -*- coding: utf-8 -*-
  2. from cms.models import Page
  3. from cms.test_utils.util.context_managers import (UserLoginContext,
  4. SettingsOverride)
  5. from django.conf import settings
  6. from django.contrib.auth.models import User, AnonymousUser
  7. from django.core.exceptions import ObjectDoesNotExist
  8. from django.core.urlresolvers import reverse
  9. from django.template.context import Context
  10. from django.test import testcases
  11. from django.test.client import Client, RequestFactory
  12. from menus.menu_pool import menu_pool
  13. from urlparse import urljoin
  14. import sys
  15. import urllib
  16. import warnings
  17. URL_CMS_PAGE = "/en/admin/cms/page/"
  18. URL_CMS_PAGE_ADD = urljoin(URL_CMS_PAGE, "add/")
  19. URL_CMS_PAGE_CHANGE = urljoin(URL_CMS_PAGE, "%d/")
  20. URL_CMS_PAGE_DELETE = urljoin(URL_CMS_PAGE_CHANGE, "delete/")
  21. URL_CMS_PLUGIN_ADD = urljoin(URL_CMS_PAGE_CHANGE, "add-plugin/")
  22. URL_CMS_PLUGIN_EDIT = urljoin(URL_CMS_PAGE_CHANGE, "edit-plugin/")
  23. URL_CMS_PLUGIN_REMOVE = urljoin(URL_CMS_PAGE_CHANGE, "remove-plugin/")
  24. URL_CMS_TRANSLATION_DELETE = urljoin(URL_CMS_PAGE_CHANGE, "delete-translation/")
  25. class _Warning(object):
  26. def __init__(self, message, category, filename, lineno):
  27. self.message = message
  28. self.category = category
  29. self.filename = filename
  30. self.lineno = lineno
  31. def _collectWarnings(observeWarning, f, *args, **kwargs):
  32. def showWarning(message, category, filename, lineno, file=None, line=None):
  33. assert isinstance(message, Warning)
  34. observeWarning(_Warning(
  35. message.args[0], category, filename, lineno))
  36. # Disable the per-module cache for every module otherwise if the warning
  37. # which the caller is expecting us to collect was already emitted it won't
  38. # be re-emitted by the call to f which happens below.
  39. for v in sys.modules.itervalues():
  40. if v is not None:
  41. try:
  42. v.__warningregistry__ = None
  43. except:
  44. # Don't specify a particular exception type to handle in case
  45. # some wacky object raises some wacky exception in response to
  46. # the setattr attempt.
  47. pass
  48. origFilters = warnings.filters[:]
  49. origShow = warnings.showwarning
  50. warnings.simplefilter('always')
  51. try:
  52. warnings.showwarning = showWarning
  53. result = f(*args, **kwargs)
  54. finally:
  55. warnings.filters[:] = origFilters
  56. warnings.showwarning = origShow
  57. return result
  58. class CMSTestCase(testcases.TestCase):
  59. counter = 1
  60. def _fixture_setup(self):
  61. super(CMSTestCase, self)._fixture_setup()
  62. self.create_fixtures()
  63. self.client = Client()
  64. def create_fixtures(self):
  65. pass
  66. def _post_teardown(self):
  67. # Needed to clean the menu keys cache, see menu.menu_pool.clear()
  68. menu_pool.clear()
  69. super(CMSTestCase, self)._post_teardown()
  70. def login_user_context(self, user):
  71. return UserLoginContext(self, user)
  72. def get_superuser(self):
  73. try:
  74. admin = User.objects.get(username="admin")
  75. except User.DoesNotExist:
  76. admin = User(username="admin", is_staff=True, is_active=True, is_superuser=True)
  77. admin.set_password("admin")
  78. admin.save()
  79. return admin
  80. def get_staff_user_with_no_permissions(self):
  81. """
  82. Used in security tests
  83. """
  84. staff = User(username="staff", is_staff=True, is_active=True)
  85. staff.set_password("staff")
  86. staff.save()
  87. return staff
  88. def get_new_page_data(self, parent_id=''):
  89. page_data = {
  90. 'title': 'test page %d' % self.counter,
  91. 'slug': 'test-page-%d' % self.counter,
  92. 'language': settings.LANGUAGES[0][0],
  93. 'template': 'nav_playground.html',
  94. 'parent': parent_id,
  95. 'site': 1,
  96. }
  97. # required only if user haves can_change_permission
  98. page_data['pagepermission_set-TOTAL_FORMS'] = 0
  99. page_data['pagepermission_set-INITIAL_FORMS'] = 0
  100. page_data['pagepermission_set-MAX_NUM_FORMS'] = 0
  101. page_data['pagepermission_set-2-TOTAL_FORMS'] = 0
  102. page_data['pagepermission_set-2-INITIAL_FORMS'] = 0
  103. page_data['pagepermission_set-2-MAX_NUM_FORMS'] = 0
  104. self.counter = self.counter + 1
  105. return page_data
  106. def print_page_structure(self, qs):
  107. """Just a helper to see the page struct.
  108. """
  109. for page in qs.order_by('tree_id', 'lft'):
  110. ident = " " * page.level
  111. print "%s%s (%s), lft: %s, rght: %s, tree_id: %s" % (ident, page,
  112. page.pk, page.lft, page.rght, page.tree_id)
  113. def print_node_structure(self, nodes, *extra):
  114. def _rec(nodes, level=0):
  115. ident = level * ' '
  116. for node in nodes:
  117. raw_attrs = [(bit, getattr(node, bit, node.attr.get(bit, "unknown"))) for bit in extra]
  118. attrs = ', '.join(['%s: %r' % data for data in raw_attrs])
  119. print "%s%s: %s" % (ident, node.title, attrs)
  120. _rec(node.children, level + 1)
  121. _rec(nodes)
  122. def assertObjectExist(self, qs, **filter):
  123. try:
  124. return qs.get(**filter)
  125. except ObjectDoesNotExist:
  126. pass
  127. raise self.failureException, "ObjectDoesNotExist raised"
  128. def assertObjectDoesNotExist(self, qs, **filter):
  129. try:
  130. qs.get(**filter)
  131. except ObjectDoesNotExist:
  132. return
  133. raise self.failureException, "ObjectDoesNotExist not raised"
  134. def copy_page(self, page, target_page):
  135. from cms.utils.page import get_available_slug
  136. data = {
  137. 'position': 'last-child',
  138. 'target': target_page.pk,
  139. 'site': 1,
  140. 'copy_permissions': 'on',
  141. 'copy_moderation': 'on',
  142. }
  143. response = self.client.post(URL_CMS_PAGE + "%d/copy-page/" % page.pk, data)
  144. self.assertEquals(response.status_code, 200)
  145. # Altered to reflect the new django-js jsonified response messages
  146. self.assertEquals(response.content, '{"status": 200, "content": "ok"}')
  147. title = page.title_set.all()[0]
  148. copied_slug = get_available_slug(title)
  149. copied_page = self.assertObjectExist(Page.objects, title_set__slug=copied_slug, parent=target_page)
  150. return copied_page
  151. def move_page(self, page, target_page, position="first-child"):
  152. page.move_page(target_page, position)
  153. return self.reload_page(page)
  154. def reload_page(self, page):
  155. """
  156. Returns a fresh instance of the page from the database
  157. """
  158. return self.reload(page)
  159. def reload(self, obj):
  160. return obj.__class__.objects.get(pk=obj.pk)
  161. def get_pages_root(self):
  162. return urllib.unquote(reverse("pages-root"))
  163. def get_context(self, path=None):
  164. if not path:
  165. path = self.get_pages_root()
  166. context = {}
  167. request = self.get_request(path)
  168. context['request'] = request
  169. return Context(context)
  170. def get_request(self, path=None, language=None, post_data=None, enforce_csrf_checks=False):
  171. factory = RequestFactory()
  172. if not path:
  173. path = self.get_pages_root()
  174. if not language:
  175. language = settings.LANGUAGES[0][0]
  176. if post_data:
  177. request = factory.post(path, post_data)
  178. else:
  179. request = factory.get(path)
  180. request.session = self.client.session
  181. request.user = getattr(self, 'user', AnonymousUser())
  182. request.LANGUAGE_CODE = language
  183. request._dont_enforce_csrf_checks = not enforce_csrf_checks
  184. return request
  185. def check_published_page_attributes(self, page):
  186. public_page = page.publisher_public
  187. if page.parent:
  188. self.assertEqual(page.parent_id, public_page.parent.publisher_draft.id)
  189. self.assertEqual(page.level, public_page.level)
  190. # TODO: add check for siblings
  191. draft_siblings = list(page.get_siblings(True).filter(
  192. publisher_is_draft=True
  193. ).order_by('tree_id', 'parent', 'lft'))
  194. public_siblings = list(public_page.get_siblings(True).filter(
  195. publisher_is_draft=False
  196. ).order_by('tree_id', 'parent', 'lft'))
  197. skip = 0
  198. for i, sibling in enumerate(draft_siblings):
  199. if not sibling.publisher_public_id:
  200. skip += 1
  201. continue
  202. self.assertEqual(sibling.id,
  203. public_siblings[i - skip].publisher_draft.id)
  204. def request_moderation(self, page, level):
  205. """Assign current logged in user to the moderators / change moderation
  206. Args:
  207. page: Page on which moderation should be changed
  208. level <0, 7>: Level of moderation,
  209. 1 - moderate page
  210. 2 - moderate children
  211. 4 - moderate descendants
  212. + combinations
  213. """
  214. response = self.client.post("/admin/cms/page/%d/change-moderation/" % page.id, {'moderate': level})
  215. self.assertEquals(response.status_code, 200)
  216. def failUnlessWarns(self, category, message, f, *args, **kwargs):
  217. warningsShown = []
  218. result = _collectWarnings(warningsShown.append, f, *args, **kwargs)
  219. if not warningsShown:
  220. self.fail("No warnings emitted")
  221. first = warningsShown[0]
  222. for other in warningsShown[1:]:
  223. if ((other.message, other.category)
  224. != (first.message, first.category)):
  225. self.fail("Can't handle different warnings")
  226. self.assertEqual(first.message, message)
  227. self.assertTrue(first.category is category)
  228. return result
  229. assertWarns = failUnlessWarns
  230. class SettingsOverrideTestCase(CMSTestCase):
  231. settings_overrides = {}
  232. def _pre_setup(self):
  233. self._enter_settings_override()
  234. super(SettingsOverrideTestCase, self)._pre_setup()
  235. def _enter_settings_override(self):
  236. self._settings_ctx_manager = SettingsOverride(**self.settings_overrides)
  237. self._settings_ctx_manager.__enter__()
  238. def _post_teardown(self):
  239. super(SettingsOverrideTestCase, self)._post_teardown()
  240. self._exit_settings_override()
  241. def _exit_settings_override(self):
  242. self._settings_ctx_manager.__exit__(None, None, None)