Commit e27decb4 by sanfordstudent Committed by GitHub

Merge pull request #23 from edx/sstudent/handle-unknown-rt

Handle unknown relationship types gracefully when retrieving milestones
parents 786ce10f 2ee86b56
...@@ -59,16 +59,6 @@ def _validate_milestone_data(milestone): ...@@ -59,16 +59,6 @@ def _validate_milestone_data(milestone):
) )
def _validate_milestone_relationship_type(name):
""" Validation helper """
if not validators.milestone_relationship_type_is_valid(name):
exceptions.raise_exception(
"MilestoneRelationshipType",
name,
exceptions.InvalidMilestoneRelationshipTypeException
)
def _validate_user(user): def _validate_user(user):
""" Validation helper """ """ Validation helper """
if not validators.user_is_valid(user): if not validators.user_is_valid(user):
...@@ -145,7 +135,6 @@ def add_course_milestone(course_key, relationship, milestone): ...@@ -145,7 +135,6 @@ def add_course_milestone(course_key, relationship, milestone):
'relationship': string value (eg: 'requires') 'relationship': string value (eg: 'requires')
""" """
_validate_course_key(course_key) _validate_course_key(course_key)
_validate_milestone_relationship_type(relationship)
_validate_milestone_data(milestone) _validate_milestone_data(milestone)
data.create_course_milestone( data.create_course_milestone(
course_key=course_key, course_key=course_key,
...@@ -162,9 +151,12 @@ def get_course_milestones(course_key, relationship=None): ...@@ -162,9 +151,12 @@ def get_course_milestones(course_key, relationship=None):
""" """
_validate_course_key(course_key) _validate_course_key(course_key)
if relationship is not None: try:
_validate_milestone_relationship_type(relationship) milestones = data.fetch_courses_milestones(course_keys=[course_key], relationship=relationship)
return data.fetch_courses_milestones(course_keys=[course_key], relationship=relationship) except exceptions.InvalidMilestoneRelationshipTypeException:
milestones = []
return milestones
def get_course_required_milestones(course_key, user): def get_course_required_milestones(course_key, user):
...@@ -253,14 +245,16 @@ def get_courses_milestones(course_keys, relationship=None, user=None): ...@@ -253,14 +245,16 @@ def get_courses_milestones(course_keys, relationship=None, user=None):
Returns an array of dicts containing milestones Returns an array of dicts containing milestones
""" """
[_validate_course_key(course_key) for course_key in course_keys] # pylint: disable=expression-not-assigned [_validate_course_key(course_key) for course_key in course_keys] # pylint: disable=expression-not-assigned
try:
milestones = data.fetch_courses_milestones(
course_keys=course_keys,
relationship=relationship,
user=user
)
except exceptions.InvalidMilestoneRelationshipTypeException:
milestones = []
if relationship is not None: return milestones
_validate_milestone_relationship_type(relationship)
return data.fetch_courses_milestones(
course_keys=course_keys,
relationship=relationship,
user=user)
def remove_course_milestone(course_key, milestone): def remove_course_milestone(course_key, milestone):
...@@ -288,7 +282,6 @@ def add_course_content_milestone(course_key, content_key, relationship, mileston ...@@ -288,7 +282,6 @@ def add_course_content_milestone(course_key, content_key, relationship, mileston
""" """
_validate_course_key(course_key) _validate_course_key(course_key)
_validate_content_key(content_key) _validate_content_key(content_key)
_validate_milestone_relationship_type(relationship)
_validate_milestone_data(milestone) _validate_milestone_data(milestone)
_validate_course_content_milestone_requirements(requirements) _validate_course_content_milestone_requirements(requirements)
data.create_course_content_milestone( data.create_course_content_milestone(
...@@ -317,15 +310,17 @@ def get_course_content_milestones(course_key=None, content_key=None, relationshi ...@@ -317,15 +310,17 @@ def get_course_content_milestones(course_key=None, content_key=None, relationshi
_validate_course_key(course_key) _validate_course_key(course_key)
if content_key is not None: if content_key is not None:
_validate_content_key(content_key) _validate_content_key(content_key)
if relationship is not None: try:
_validate_milestone_relationship_type(relationship) milestones = data.fetch_course_content_milestones(
course_key=course_key,
content_key=content_key,
relationship=relationship,
user=user
)
except exceptions.InvalidMilestoneRelationshipTypeException:
milestones = []
return data.fetch_course_content_milestones( return milestones
course_key=course_key,
content_key=content_key,
relationship=relationship,
user=user
)
def remove_course_content_milestone(course_key, content_key, milestone): def remove_course_content_milestone(course_key, content_key, milestone):
......
...@@ -309,7 +309,7 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC ...@@ -309,7 +309,7 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC
def test_add_course_milestone_bogus_milestone_relationship_type(self): def test_add_course_milestone_bogus_milestone_relationship_type(self):
""" Unit Test: test_add_course_milestone_bogus_milestone_relationship_type """ """ Unit Test: test_add_course_milestone_bogus_milestone_relationship_type """
with self.assertNumQueries(0): with self.assertNumQueries(1):
with self.assertRaises(exceptions.InvalidMilestoneRelationshipTypeException): with self.assertRaises(exceptions.InvalidMilestoneRelationshipTypeException):
api.add_course_milestone(self.test_course_key, 'whatever', self.test_milestone) api.add_course_milestone(self.test_course_key, 'whatever', self.test_milestone)
...@@ -327,6 +327,20 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC ...@@ -327,6 +327,20 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC
) )
self.assertEqual(len(requirer_milestones), 1) self.assertEqual(len(requirer_milestones), 1)
def test_get_course_milestones_with_invalid_relationship_type(self):
""" Unit Test: test_get_course_milestones_with_invalid_relationship_type """
api.add_course_milestone(
self.test_course_key,
self.relationship_types['REQUIRES'],
self.test_milestone
)
with self.assertNumQueries(1):
requirer_milestones = api.get_course_milestones(
self.test_course_key,
'INVALID RELATIONSHIP TYPE'
)
self.assertEqual(len(requirer_milestones), 0)
def test_get_course_unfulfilled_milestones(self): def test_get_course_unfulfilled_milestones(self):
""" Unit Test: test_get_course_unfulfilled_milestones """ """ Unit Test: test_get_course_unfulfilled_milestones """
namespace = 'test_get_milestones' namespace = 'test_get_milestones'
...@@ -427,6 +441,37 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC ...@@ -427,6 +441,37 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC
) )
self.assertEqual(len(requirer_milestones), 2) self.assertEqual(len(requirer_milestones), 2)
def test_get_courses_milestones_with_invalid_relationship_type(self):
""" Unit Test: test_get_courses_milestones_with_invalid_relationship_type """
api.add_course_milestone(
self.test_course_key,
self.relationship_types['REQUIRES'],
self.test_milestone
)
api.add_course_milestone(
self.test_prerequisite_course_key,
self.relationship_types['REQUIRES'],
self.test_milestone
)
local_milestone = api.add_milestone({
'display_name': 'Local Milestone',
'name': 'local_milestone',
'namespace': unicode(self.test_course_key),
'description': 'Local Milestone Description'
})
api.add_course_milestone(
self.test_course_key,
self.relationship_types['FULFILLS'],
local_milestone
)
with self.assertNumQueries(1):
requirer_milestones = api.get_courses_milestones(
[self.test_course_key],
'INVALID RELATIONSHIP TYPE'
)
self.assertEqual(len(requirer_milestones), 0)
def test_remove_course_milestone(self): def test_remove_course_milestone(self):
""" Unit Test: test_remove_course_milestone """ """ Unit Test: test_remove_course_milestone """
api.add_course_milestone( api.add_course_milestone(
...@@ -605,7 +650,7 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC ...@@ -605,7 +650,7 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC
def test_add_course_content_milestone_bogus_milestone_relationship_type(self): def test_add_course_content_milestone_bogus_milestone_relationship_type(self):
""" Unit Test: test_add_course_content_milestone_bogus_milestone_relationship_type """ """ Unit Test: test_add_course_content_milestone_bogus_milestone_relationship_type """
with self.assertNumQueries(0): with self.assertNumQueries(1):
with self.assertRaises(exceptions.InvalidMilestoneRelationshipTypeException): with self.assertRaises(exceptions.InvalidMilestoneRelationshipTypeException):
api.add_course_content_milestone( api.add_course_content_milestone(
self.test_course_key, self.test_course_key,
...@@ -613,7 +658,7 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC ...@@ -613,7 +658,7 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC
'whatever', 'whatever',
self.test_milestone self.test_milestone
) )
with self.assertNumQueries(0): with self.assertNumQueries(1):
with self.assertRaises(exceptions.InvalidMilestoneRelationshipTypeException): with self.assertRaises(exceptions.InvalidMilestoneRelationshipTypeException):
api.add_course_content_milestone( api.add_course_content_milestone(
self.test_course_key, self.test_course_key,
...@@ -718,6 +763,28 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC ...@@ -718,6 +763,28 @@ class MilestonesApiTestCase(utils.MilestonesTestCaseMixin, utils.MilestonesTestC
) )
self.assertEqual(len(requirer_milestones), 2) self.assertEqual(len(requirer_milestones), 2)
def test_get_course_content_milestones_with_invalid_relationship(self):
""" Unit Test: test_get_course_content_milestones_with_invalid_relationship """
api.add_course_content_milestone(
self.test_course_key,
self.test_content_key,
self.relationship_types['REQUIRES'],
self.test_milestone
)
api.add_course_content_milestone(
self.test_course_key,
self.test_alternate_content_key,
self.relationship_types['REQUIRES'],
self.test_milestone
)
with self.assertNumQueries(1):
requirer_milestones = api.get_course_content_milestones(
self.test_course_key,
self.test_content_key,
'INVALID RELATIONSHIP TYPE'
)
self.assertEqual(len(requirer_milestones), 0)
def test_remove_course_content_milestone(self): def test_remove_course_content_milestone(self):
""" Unit Test: test_remove_course_content_milestone """ """ Unit Test: test_remove_course_content_milestone """
api.add_course_content_milestone( api.add_course_content_milestone(
......
...@@ -4,7 +4,7 @@ from setuptools import setup, find_packages ...@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
setup( setup(
name='edx-milestones', name='edx-milestones',
version='0.1.9', version='0.1.10',
description='Significant events module for Open edX', description='Significant events module for Open edX',
long_description=open('README.md').read(), long_description=open('README.md').read(),
author='edX', author='edX',
......
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