test_dashboard.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from django.test import RequestFactory, TestCase, tag
  2. from extras.dashboard.widgets import ObjectListWidget
  3. from extras.templatetags.dashboard import render_widget
  4. class ObjectListWidgetTestCase(TestCase):
  5. def test_widget_config_form_validates_model(self):
  6. model_info = 'extras.notification'
  7. form = ObjectListWidget.ConfigForm({'model': model_info})
  8. self.assertFalse(form.is_valid())
  9. @tag('regression')
  10. def test_widget_fails_gracefully(self):
  11. """
  12. Example:
  13. '2829fd9b-5dee-4c9a-81f2-5bd84c350a27': {
  14. 'class': 'extras.ObjectListWidget',
  15. 'color': 'indigo',
  16. 'title': 'Object List',
  17. 'config': {
  18. 'model': 'extras.notification',
  19. 'page_size': None,
  20. 'url_params': None
  21. }
  22. }
  23. """
  24. config = {
  25. # 'class': 'extras.ObjectListWidget', # normally popped off, left for clarity
  26. 'color': 'yellow',
  27. 'title': 'this should fail',
  28. 'config': {
  29. 'model': 'extras.notification',
  30. 'page_size': None,
  31. 'url_params': None,
  32. },
  33. }
  34. class Request:
  35. class User:
  36. def has_perm(self, *args, **kwargs):
  37. return True
  38. user = User()
  39. mock_request = Request()
  40. widget = ObjectListWidget(id='2829fd9b-5dee-4c9a-81f2-5bd84c350a27', **config)
  41. rendered = widget.render(mock_request)
  42. self.assertTrue('Unable to load content. Could not resolve list URL for:' in rendered)
  43. class RenderWidgetTemplateTagTestCase(TestCase):
  44. def _make_context(self):
  45. request = RequestFactory().get('/')
  46. return {'request': request}
  47. def test_render_widget_escapes_exception_html(self):
  48. """Exception text with HTML special chars must be escaped, not rendered as markup."""
  49. class BrokenWidget:
  50. def render(self, request):
  51. raise Exception('<script>alert(1)</script>')
  52. output = render_widget(self._make_context(), BrokenWidget())
  53. self.assertIn('&lt;script&gt;', output)
  54. self.assertNotIn('<script>', output)
  55. def test_render_widget_escapes_exception_angle_brackets(self):
  56. """Angle brackets in exception messages are escaped."""
  57. class BrokenWidget:
  58. def render(self, request):
  59. raise ValueError('invalid value: <bad>')
  60. output = render_widget(self._make_context(), BrokenWidget())
  61. self.assertIn('&lt;bad&gt;', output)
  62. self.assertNotIn('<bad>', output)