|
| 1 | +# Copyright (c) 2011 Resolver Systems Ltd. |
| 2 | +# All Rights Reserved |
| 3 | +# |
| 4 | + |
| 5 | + |
| 6 | +from django.core.urlresolvers import reverse |
| 7 | +from django.http import Http404, HttpResponse, HttpResponsePermanentRedirect |
| 8 | + |
| 9 | +from mock import Mock, patch |
| 10 | +import os |
| 11 | + |
| 12 | +from resolver_test import ResolverViewTestCase |
| 13 | + |
| 14 | +from server.renderer.views import render_view |
| 15 | + |
| 16 | + |
| 17 | +class RenderViewTest(ResolverViewTestCase): |
| 18 | + |
| 19 | + @patch("server.renderer.views.os.path.exists") |
| 20 | + def test_render_view_404s_for_nonexistent_file(self, mock_exists): |
| 21 | + mock_exists.return_value = False |
| 22 | + |
| 23 | + with self.assertRaises(Http404): |
| 24 | + render_view(self.request, '9') |
| 25 | + |
| 26 | + |
| 27 | + def test_render_view_404s_for_existing_file_outside_of_content_directory(self): |
| 28 | + |
| 29 | + with self.assertRaises(Http404): |
| 30 | + render_view(self.request, '../../README') |
| 31 | + |
| 32 | + |
| 33 | + @patch("server.renderer.views.os.path.exists") |
| 34 | + @patch("server.renderer.views.publish_parts") |
| 35 | + @patch("server.renderer.views.render_to_response") |
| 36 | + def test_render_view_renders_rst_sensibly(self, mock_render, mock_publish_parts, mock_exists): |
| 37 | + mock_exists.return_value = True |
| 38 | + mock_open = Mock() |
| 39 | + read_results = "The rest contents" |
| 40 | + mock_open.return_value.__enter__ = Mock() |
| 41 | + mock_open.return_value.__enter__.return_value.read.return_value = read_results |
| 42 | + mock_open.return_value.__exit__ = Mock() |
| 43 | + |
| 44 | + mock_publish_parts.return_value = { |
| 45 | + "title": "I am a dashing -- title", |
| 46 | + "body": "<div>I am a processed rest body with double --s</div>" |
| 47 | + } |
| 48 | + |
| 49 | + |
| 50 | + orig_open = open |
| 51 | + __builtins__['open'] = mock_open |
| 52 | + try: |
| 53 | + response = render_view(self.request, "foo") |
| 54 | + finally: |
| 55 | + __builtins__['open'] = orig_open |
| 56 | + |
| 57 | + contents_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'content')) |
| 58 | + self.assertCalledOnce(mock_open, os.path.join(contents_dir, 'foo.txt'), "r") |
| 59 | + self.assertCalledOnce(mock_publish_parts, source=read_results, writer_name="html4css1") |
| 60 | + |
| 61 | + self.assert_render_template_was(mock_render, "tutorial_base.html") |
| 62 | + self.assertRenderedWith(mock_render, "title", "I am a dashing — title") |
| 63 | + self.assertRenderedWith(mock_render, "body", "<div>I am a processed rest body with double —s</div>") |
| 64 | + |
| 65 | + |
| 66 | + def test_render_view_handles_root_request_sensibly(self): |
| 67 | + self.request.META['QUERY_STRING'] = '' |
| 68 | + |
| 69 | + response = render_view(self.request, '') |
| 70 | + |
| 71 | + self.assertIsInstance(response, HttpResponsePermanentRedirect) |
| 72 | + self.assertEquals( |
| 73 | + response['Location'], |
| 74 | + reverse('render_view', args=['index']) |
| 75 | + ) |
| 76 | + |
| 77 | + |
| 78 | + |
| 79 | + |
| 80 | + |
| 81 | + |
0 commit comments