Commit 37df16bc by Clinton Blackburn Committed by Peter Fogg

Ignoring invalid data from the Drupal API

ECOM-4414
parent 8307996b
...@@ -271,6 +271,11 @@ class DrupalApiDataLoader(AbstractDataLoader): ...@@ -271,6 +271,11 @@ class DrupalApiDataLoader(AbstractDataLoader):
logger.info('Retrieved %d course runs...', len(data)) logger.info('Retrieved %d course runs...', len(data))
for body in data: for body in data:
# NOTE (CCB): Some of the entries are empty arrays. We will fix this on the Drupal side of things
# later (ECOM-4493). For now, ignore them.
if not body:
continue
cleaned_body = self.clean_strings(body) cleaned_body = self.clean_strings(body)
course = self.update_course(cleaned_body) course = self.update_course(cleaned_body)
self.update_course_run(course, cleaned_body) self.update_course_run(course, cleaned_body)
......
...@@ -462,7 +462,8 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase): ...@@ -462,7 +462,8 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase):
def mock_api(self): def mock_api(self):
"""Mock out the Drupal API. Returns a list of mocked-out course runs.""" """Mock out the Drupal API. Returns a list of mocked-out course runs."""
body = { body = {
'items': [{ 'items': [
{
'title': self.EXISTING_COURSE_AND_RUN_DATA[0]['title'], 'title': self.EXISTING_COURSE_AND_RUN_DATA[0]['title'],
'level': { 'level': {
'title': 'Introductory', 'title': 'Introductory',
...@@ -474,7 +475,7 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase): ...@@ -474,7 +475,7 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase):
}], }],
'current_language': self.EXISTING_COURSE_AND_RUN_DATA[0]['current_language'], 'current_language': self.EXISTING_COURSE_AND_RUN_DATA[0]['current_language'],
'subtitle': 'Learn about Bread', 'subtitle': 'Learn about Bread',
'description': '<p><b>Bread</b> is a <a href="/wiki/Staple_food" title="Staple food">staple food</a>.', 'description': '<p>Bread is a <a href="/wiki/Staple_food" title="Staple food">staple food</a>.',
'sponsors': [{ 'sponsors': [{
'uuid': 'abc123', 'uuid': 'abc123',
'title': 'Tatte', 'title': 'Tatte',
...@@ -496,7 +497,8 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase): ...@@ -496,7 +497,8 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase):
'title': 'King' 'title': 'King'
} }
}] }]
}, { },
{
'title': self.EXISTING_COURSE_AND_RUN_DATA[1]['title'], 'title': self.EXISTING_COURSE_AND_RUN_DATA[1]['title'],
'level': { 'level': {
'title': 'Intermediate', 'title': 'Intermediate',
...@@ -518,7 +520,8 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase): ...@@ -518,7 +520,8 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase):
'title': 'Tester' 'title': 'Tester'
} }
}] }]
}, { # Create a course which exists in LMS/Otto, but without course runs },
{ # Create a course which exists in LMS/Otto, but without course runs
'title': self.EXISTING_COURSE['title'], 'title': self.EXISTING_COURSE['title'],
'level': { 'level': {
'title': 'Advanced', 'title': 'Advanced',
...@@ -543,7 +546,8 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase): ...@@ -543,7 +546,8 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase):
'uri': 'sponsor/faux' 'uri': 'sponsor/faux'
}], }],
'staff': [], 'staff': [],
}, { # Create a fake course run which doesn't exist in LMS/Otto },
{ # Create a fake course run which doesn't exist in LMS/Otto
'title': 'A partial course', 'title': 'A partial course',
'level': { 'level': {
'title': 'Advanced', 'title': 'Advanced',
...@@ -558,7 +562,10 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase): ...@@ -558,7 +562,10 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase):
'description': 'what is real?', 'description': 'what is real?',
'sponsors': [], 'sponsors': [],
'staff': [], 'staff': [],
}] },
# NOTE (CCB): Some of the entries are empty arrays. Remove this as part of ECOM-4493.
[],
]
} }
responses.add( responses.add(
...@@ -633,8 +640,9 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase): ...@@ -633,8 +640,9 @@ class DrupalApiDataLoaderTests(DataLoaderTestMixin, TestCase):
def test_ingest(self): def test_ingest(self):
"""Verify the data loader ingests data from Drupal.""" """Verify the data loader ingests data from Drupal."""
data = self.mock_api() data = self.mock_api()
# The faked course should not be loaded from Drupal # Neither the faked course, nor the empty array, should not be loaded from Drupal.
loaded_data = data[:-2] # Change this back to -2 as part of ECOM-4493.
loaded_data = data[:-3]
self.loader.ingest() self.loader.ingest()
......
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