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()