From 0738b6c3274b5c151f5cf887b97eebdf2d63a098 Mon Sep 17 00:00:00 2001 From: jsa Date: Mon, 14 Apr 2014 17:40:15 -0400 Subject: [PATCH] django_comment_client/forum: add test coverage for user_profile view JIRA: FOR-496 --- .../django_comment_client/forum/tests.py | 119 +++++++++++++++++- .../django_comment_client/forum/views.py | 2 +- 2 files changed, 118 insertions(+), 3 deletions(-) diff --git a/lms/djangoapps/django_comment_client/forum/tests.py b/lms/djangoapps/django_comment_client/forum/tests.py index f13084646c..b4a3eb7d00 100644 --- a/lms/djangoapps/django_comment_client/forum/tests.py +++ b/lms/djangoapps/django_comment_client/forum/tests.py @@ -106,13 +106,13 @@ def make_mock_thread_data(text, thread_id, include_children): return thread_data -def make_mock_request_impl(text, thread_id=None): +def make_mock_request_impl(text, thread_id="dummy_thread_id"): def mock_request_impl(*args, **kwargs): url = args[1] data = None if url.endswith("threads"): data = { - "collection": [make_mock_thread_data(text, "dummy_thread_id", False)] + "collection": [make_mock_thread_data(text, thread_id, False)] } elif thread_id and url.endswith(thread_id): data = make_mock_thread_data(text, thread_id, True) @@ -122,6 +122,12 @@ def make_mock_request_impl(text, thread_id=None): "downvoted_ids": [], "subscribed_thread_ids": [], } + # comments service adds these attributes when course_id param is present + if kwargs.get('params', {}).get('course_id'): + data.update({ + "threads_count": 1, + "comments_count": 2 + }) if data: return Mock(status_code=200, text=json.dumps(data), json=Mock(return_value=data)) return Mock(status_code=404) @@ -252,6 +258,115 @@ class SingleThreadTestCase(ModuleStoreTestCase): ) +@override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE) +@patch('requests.request') +class UserProfileTestCase(ModuleStoreTestCase): + + TEST_THREAD_TEXT = 'userprofile-test-text' + TEST_THREAD_ID = 'userprofile-test-thread-id' + + def setUp(self): + self.course = CourseFactory.create() + self.student = UserFactory.create() + self.profiled_user = UserFactory.create() + CourseEnrollmentFactory.create(user=self.student, course_id=self.course.id) + + def get_response(self, mock_request, params, **headers): + mock_request.side_effect = make_mock_request_impl(self.TEST_THREAD_TEXT, self.TEST_THREAD_ID) + request = RequestFactory().get("dummy_url", data=params, **headers) + request.user = self.student + response = views.user_profile( + request, + self.course.id, + self.profiled_user.id + ) + mock_request.assert_any_call( + "get", + StringEndsWithMatcher('/users/{}/active_threads'.format(self.profiled_user.id)), + data=None, + params=PartialDictMatcher({ + "course_id": self.course.id, + "page": params.get("page", 1), + "per_page": views.THREADS_PER_PAGE + }), + headers=ANY, + timeout=ANY + ) + return response + + def check_html(self, mock_request, **params): + response = self.get_response(mock_request, params) + self.assertEqual(response.status_code, 200) + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') + html = response.content + self.assertRegexpMatches(html, r'var \$\$course_id = \"{}\"'.format(self.course.id)) + self.assertRegexpMatches(html, r'var \$\$profiled_user_id = \"{}\"'.format(self.profiled_user.id)) + self.assertRegexpMatches(html, r'1 discussion started') + self.assertRegexpMatches(html, r'2 comments') + self.assertRegexpMatches(html, r'"id": "{}"'.format(self.TEST_THREAD_ID)) + self.assertRegexpMatches(html, r'"title": "{}"'.format(self.TEST_THREAD_TEXT)) + self.assertRegexpMatches(html, r'"body": "{}"'.format(self.TEST_THREAD_TEXT)) + self.assertRegexpMatches(html, r'"username": "{}"'.format(self.student.username)) + + def check_ajax(self, mock_request, **params): + response = self.get_response(mock_request, params, HTTP_X_REQUESTED_WITH="XMLHttpRequest") + self.assertEqual(response.status_code, 200) + self.assertEqual(response['Content-Type'], 'application/json; charset=utf-8') + response_data = json.loads(response.content) + self.assertEqual( + sorted(response_data.keys()), + ["annotated_content_info", "discussion_data", "num_pages", "page"] + ) + self.assertEqual(len(response_data['discussion_data']), 1) + self.assertEqual(response_data["page"], 1) + self.assertEqual(response_data["num_pages"], 1) + self.assertEqual(response_data['discussion_data'][0]['id'], self.TEST_THREAD_ID) + self.assertEqual(response_data['discussion_data'][0]['title'], self.TEST_THREAD_TEXT) + self.assertEqual(response_data['discussion_data'][0]['body'], self.TEST_THREAD_TEXT) + + def test_html(self, mock_request): + self.check_html(mock_request) + + def test_html_p2(self, mock_request): + self.check_html(mock_request, page="2") + + def test_ajax(self, mock_request): + self.check_ajax(mock_request) + + def test_ajax_p2(self, mock_request): + self.check_ajax(mock_request, page="2") + + def test_404_profiled_user(self, mock_request): + request = RequestFactory().get("dummy_url") + request.user = self.student + with self.assertRaises(Http404): + response = views.user_profile( + request, + self.course.id, + -999 + ) + + def test_404_course(self, mock_request): + request = RequestFactory().get("dummy_url") + request.user = self.student + with self.assertRaises(Http404): + response = views.user_profile( + request, + "non/existent/course", + self.profiled_user.id + ) + + def test_post(self, mock_request): + mock_request.side_effect = make_mock_request_impl(self.TEST_THREAD_TEXT, self.TEST_THREAD_ID) + request = RequestFactory().post("dummy_url") + request.user = self.student + response = views.user_profile( + request, + self.course.id, + self.profiled_user.id + ) + self.assertEqual(response.status_code, 405) + @override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE) @patch('requests.request') class CommentsServiceRequestHeadersTestCase(UrlResetMixin, ModuleStoreTestCase): diff --git a/lms/djangoapps/django_comment_client/forum/views.py b/lms/djangoapps/django_comment_client/forum/views.py index e70be6c1b6..cbbd4b0205 100644 --- a/lms/djangoapps/django_comment_client/forum/views.py +++ b/lms/djangoapps/django_comment_client/forum/views.py @@ -314,7 +314,7 @@ def single_thread(request, course_id, discussion_id, thread_id): return render_to_response('discussion/index.html', context) - +@require_GET @login_required def user_profile(request, course_id, user_id): nr_transaction = newrelic.agent.current_transaction()