From 237ef00a2b9d5827a5bafe8e2509b51f38f891d9 Mon Sep 17 00:00:00 2001 From: Mushtaq Ali Date: Wed, 26 Oct 2016 13:23:26 +0500 Subject: [PATCH] edxnotes stub server to support multiple usage id search - TNL-5605 --- common/djangoapps/terrain/stubs/edxnotes.py | 24 ++++++++++---- .../terrain/stubs/tests/test_edxnotes.py | 32 ++++++++++++++++--- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/common/djangoapps/terrain/stubs/edxnotes.py b/common/djangoapps/terrain/stubs/edxnotes.py index c5b4510558..8fde3b4974 100644 --- a/common/djangoapps/terrain/stubs/edxnotes.py +++ b/common/djangoapps/terrain/stubs/edxnotes.py @@ -243,8 +243,9 @@ class StubEdxNotesServiceHandler(StubHttpRequestHandler): """ Search for a notes by user id, course_id and usage_id. """ + search_with_usage_id = False user = self.get_params.get("user", None) - usage_id = self.get_params.get("usage_id", None) + usage_ids = self.get_params.get("usage_id", []) course_id = self.get_params.get("course_id", None) text = self.get_params.get("text", None) page = int(self.get_params.get("page", 1)) @@ -257,11 +258,14 @@ class StubEdxNotesServiceHandler(StubHttpRequestHandler): notes = self.server.get_all_notes() if course_id is not None: notes = self.server.filter_by_course_id(notes, course_id) - if usage_id is not None: - notes = self.server.filter_by_usage_id(notes, usage_id) + if len(usage_ids) > 0: + search_with_usage_id = True + notes = self.server.filter_by_usage_id(notes, usage_ids) if text: notes = self.server.search(notes, text) - self.respond(content=self._get_paginated_response(notes, page, page_size)) + if not search_with_usage_id: + notes = self._get_paginated_response(notes, page, page_size) + self.respond(content=notes) def _collection(self): """ @@ -356,11 +360,13 @@ class StubEdxNotesService(StubHttpService): """ return self.filter_by(data, "user", user) - def filter_by_usage_id(self, data, usage_id): + def filter_by_usage_id(self, data, usage_ids): """ Filters provided `data(list)` by the `usage_id(str)`. """ - return self.filter_by(data, "usage_id", usage_id) + if not isinstance(usage_ids, list): + usage_ids = [usage_ids] + return self.filter_by_list(data, "usage_id", usage_ids) def filter_by_course_id(self, data, course_id): """ @@ -374,6 +380,12 @@ class StubEdxNotesService(StubHttpService): """ return [note for note in data if note.get(field_name) == value] + def filter_by_list(self, data, field_name, values): + """ + Filters provided `data(list)` by the `field_name(str)` in values. + """ + return [note for note in data if note.get(field_name) in values] + def search(self, data, query): """ Search the `query(str)` text in the provided `data(list)`. diff --git a/common/djangoapps/terrain/stubs/tests/test_edxnotes.py b/common/djangoapps/terrain/stubs/tests/test_edxnotes.py index 19aa0969eb..9b6a464f24 100644 --- a/common/djangoapps/terrain/stubs/tests/test_edxnotes.py +++ b/common/djangoapps/terrain/stubs/tests/test_edxnotes.py @@ -1,6 +1,7 @@ """ Unit tests for stub EdxNotes implementation. """ +import ddt import urlparse import json import unittest @@ -9,6 +10,7 @@ from uuid import uuid4 from ..edxnotes import StubEdxNotesService +@ddt.ddt class StubEdxNotesServiceTest(unittest.TestCase): """ Test cases for the stub EdxNotes service. @@ -27,9 +29,9 @@ class StubEdxNotesServiceTest(unittest.TestCase): """ Returns a list of dummy notes. """ - return [self._get_dummy_note() for i in xrange(count)] # pylint: disable=unused-variable + return [self._get_dummy_note(i) for i in xrange(count)] # pylint: disable=unused-variable - def _get_dummy_note(self): + def _get_dummy_note(self, uid=0): """ Returns a single dummy note. """ @@ -39,7 +41,7 @@ class StubEdxNotesServiceTest(unittest.TestCase): "created": "2014-10-31T10:05:00.000000", "updated": "2014-10-31T10:50:00.101010", "user": "dummy-user-id", - "usage_id": "dummy-usage-id", + "usage_id": "dummy-usage-id-" + str(uid), "course_id": "dummy-course-id", "text": "dummy note text " + nid, "quote": "dummy note quote", @@ -106,7 +108,6 @@ class StubEdxNotesServiceTest(unittest.TestCase): # get response with default page and page size response = requests.get(self._get_url("api/v1/search"), params={ "user": "dummy-user-id", - "usage_id": "dummy-usage-id", "course_id": "dummy-course-id", }) @@ -125,7 +126,6 @@ class StubEdxNotesServiceTest(unittest.TestCase): # search notes with text that don't exist response = requests.get(self._get_url("api/v1/search"), params={ "user": "dummy-user-id", - "usage_id": "dummy-usage-id", "course_id": "dummy-course-id", "text": "world war 2" }) @@ -142,6 +142,28 @@ class StubEdxNotesServiceTest(unittest.TestCase): previous_page=None ) + @ddt.data( + '?usage_id=dummy-usage-id-0', + '?usage_id=dummy-usage-id-0&usage_id=dummy-usage-id-1&dummy-usage-id-2&dummy-usage-id-3&dummy-usage-id-4' + ) + def test_search_usage_ids(self, usage_ids): + """ + Test search with usage ids. + """ + url = self._get_url('api/v1/search') + usage_ids + response = requests.get(url, params={ + 'user': 'dummy-user-id', + 'course_id': 'dummy-course-id' + }) + self.assertTrue(response.ok) + response = response.json() + parsed = urlparse.urlparse(url) + query_params = urlparse.parse_qs(parsed.query) + query_params['usage_id'].reverse() + self.assertEqual(len(response), len(query_params['usage_id'])) + for index, usage_id in enumerate(query_params['usage_id']): + self.assertEqual(response[index]['usage_id'], usage_id) + def test_delete(self): notes = self._get_notes() response = requests.delete(self._get_url("api/v1/annotations/does_not_exist"))