Commit 237ef00a by Mushtaq Ali Committed by muhammad-ammar

edxnotes stub server to support multiple usage id search - TNL-5605

parent 753d7821
...@@ -243,8 +243,9 @@ class StubEdxNotesServiceHandler(StubHttpRequestHandler): ...@@ -243,8 +243,9 @@ class StubEdxNotesServiceHandler(StubHttpRequestHandler):
""" """
Search for a notes by user id, course_id and usage_id. Search for a notes by user id, course_id and usage_id.
""" """
search_with_usage_id = False
user = self.get_params.get("user", None) 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) course_id = self.get_params.get("course_id", None)
text = self.get_params.get("text", None) text = self.get_params.get("text", None)
page = int(self.get_params.get("page", 1)) page = int(self.get_params.get("page", 1))
...@@ -257,11 +258,14 @@ class StubEdxNotesServiceHandler(StubHttpRequestHandler): ...@@ -257,11 +258,14 @@ class StubEdxNotesServiceHandler(StubHttpRequestHandler):
notes = self.server.get_all_notes() notes = self.server.get_all_notes()
if course_id is not None: if course_id is not None:
notes = self.server.filter_by_course_id(notes, course_id) notes = self.server.filter_by_course_id(notes, course_id)
if usage_id is not None: if len(usage_ids) > 0:
notes = self.server.filter_by_usage_id(notes, usage_id) search_with_usage_id = True
notes = self.server.filter_by_usage_id(notes, usage_ids)
if text: if text:
notes = self.server.search(notes, 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): def _collection(self):
""" """
...@@ -356,11 +360,13 @@ class StubEdxNotesService(StubHttpService): ...@@ -356,11 +360,13 @@ class StubEdxNotesService(StubHttpService):
""" """
return self.filter_by(data, "user", user) 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)`. 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): def filter_by_course_id(self, data, course_id):
""" """
...@@ -374,6 +380,12 @@ class StubEdxNotesService(StubHttpService): ...@@ -374,6 +380,12 @@ class StubEdxNotesService(StubHttpService):
""" """
return [note for note in data if note.get(field_name) == value] 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): def search(self, data, query):
""" """
Search the `query(str)` text in the provided `data(list)`. Search the `query(str)` text in the provided `data(list)`.
......
""" """
Unit tests for stub EdxNotes implementation. Unit tests for stub EdxNotes implementation.
""" """
import ddt
import urlparse import urlparse
import json import json
import unittest import unittest
...@@ -9,6 +10,7 @@ from uuid import uuid4 ...@@ -9,6 +10,7 @@ from uuid import uuid4
from ..edxnotes import StubEdxNotesService from ..edxnotes import StubEdxNotesService
@ddt.ddt
class StubEdxNotesServiceTest(unittest.TestCase): class StubEdxNotesServiceTest(unittest.TestCase):
""" """
Test cases for the stub EdxNotes service. Test cases for the stub EdxNotes service.
...@@ -27,9 +29,9 @@ class StubEdxNotesServiceTest(unittest.TestCase): ...@@ -27,9 +29,9 @@ class StubEdxNotesServiceTest(unittest.TestCase):
""" """
Returns a list of dummy notes. 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. Returns a single dummy note.
""" """
...@@ -39,7 +41,7 @@ class StubEdxNotesServiceTest(unittest.TestCase): ...@@ -39,7 +41,7 @@ class StubEdxNotesServiceTest(unittest.TestCase):
"created": "2014-10-31T10:05:00.000000", "created": "2014-10-31T10:05:00.000000",
"updated": "2014-10-31T10:50:00.101010", "updated": "2014-10-31T10:50:00.101010",
"user": "dummy-user-id", "user": "dummy-user-id",
"usage_id": "dummy-usage-id", "usage_id": "dummy-usage-id-" + str(uid),
"course_id": "dummy-course-id", "course_id": "dummy-course-id",
"text": "dummy note text " + nid, "text": "dummy note text " + nid,
"quote": "dummy note quote", "quote": "dummy note quote",
...@@ -106,7 +108,6 @@ class StubEdxNotesServiceTest(unittest.TestCase): ...@@ -106,7 +108,6 @@ class StubEdxNotesServiceTest(unittest.TestCase):
# get response with default page and page size # get response with default page and page size
response = requests.get(self._get_url("api/v1/search"), params={ response = requests.get(self._get_url("api/v1/search"), params={
"user": "dummy-user-id", "user": "dummy-user-id",
"usage_id": "dummy-usage-id",
"course_id": "dummy-course-id", "course_id": "dummy-course-id",
}) })
...@@ -125,7 +126,6 @@ class StubEdxNotesServiceTest(unittest.TestCase): ...@@ -125,7 +126,6 @@ class StubEdxNotesServiceTest(unittest.TestCase):
# search notes with text that don't exist # search notes with text that don't exist
response = requests.get(self._get_url("api/v1/search"), params={ response = requests.get(self._get_url("api/v1/search"), params={
"user": "dummy-user-id", "user": "dummy-user-id",
"usage_id": "dummy-usage-id",
"course_id": "dummy-course-id", "course_id": "dummy-course-id",
"text": "world war 2" "text": "world war 2"
}) })
...@@ -142,6 +142,28 @@ class StubEdxNotesServiceTest(unittest.TestCase): ...@@ -142,6 +142,28 @@ class StubEdxNotesServiceTest(unittest.TestCase):
previous_page=None 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): def test_delete(self):
notes = self._get_notes() notes = self._get_notes()
response = requests.delete(self._get_url("api/v1/annotations/does_not_exist")) response = requests.delete(self._get_url("api/v1/annotations/does_not_exist"))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment