diff --git a/common/lib/xmodule/xmodule/html_module.py b/common/lib/xmodule/xmodule/html_module.py
index 6f5889af66..c93351dbaa 100644
--- a/common/lib/xmodule/xmodule/html_module.py
+++ b/common/lib/xmodule/xmodule/html_module.py
@@ -440,8 +440,10 @@ class CourseInfoModule(CourseInfoFields, HtmlModuleMixin):
return self.data
else:
course_updates = [item for item in self.items if item.get('status') == self.STATUS_VISIBLE]
- course_updates.sort(key=lambda item: CourseInfoModule.safe_parse_date(item['date']), reverse=True)
-
+ course_updates.sort(
+ key=lambda item: (CourseInfoModule.safe_parse_date(item['date']), item['id']),
+ reverse=True
+ )
context = {
'visible_updates': course_updates[:3],
'hidden_updates': course_updates[3:],
diff --git a/common/lib/xmodule/xmodule/tests/test_html_module.py b/common/lib/xmodule/xmodule/tests/test_html_module.py
index 20288c2f5f..0f3992af3f 100644
--- a/common/lib/xmodule/xmodule/tests/test_html_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_html_module.py
@@ -181,3 +181,66 @@ class CourseInfoModuleTestCase(unittest.TestCase):
info_module.get_html()
except ValueError:
self.fail("CourseInfoModule could not parse an invalid date!")
+
+ def test_updates_order(self):
+ """
+ Tests that a course info module will render its updates in the correct order.
+ """
+ sample_update_data = [
+ {
+ "id": 3,
+ "date": "March 18, 1982",
+ "content": "This is a very important update that was inserted last with an older date!",
+ "status": CourseInfoModule.STATUS_VISIBLE,
+ },
+ {
+ "id": 1,
+ "date": "January 1, 2012",
+ "content": "This is a very important update that was inserted first!",
+ "status": CourseInfoModule.STATUS_VISIBLE,
+ },
+ {
+ "id": 2,
+ "date": "January 1, 2012",
+ "content": "This is a very important update that was inserted second!",
+ "status": CourseInfoModule.STATUS_VISIBLE,
+ }
+ ]
+ info_module = CourseInfoModule(
+ Mock(),
+ Mock(),
+ DictFieldData({'items': sample_update_data, 'data': ""}),
+ Mock()
+ )
+
+ # This is the expected context that should be used by the render function
+ expected_context = {
+ 'visible_updates': [
+ {
+ "id": 2,
+ "date": "January 1, 2012",
+ "content": "This is a very important update that was inserted second!",
+ "status": CourseInfoModule.STATUS_VISIBLE,
+ },
+ {
+ "id": 1,
+ "date": "January 1, 2012",
+ "content": "This is a very important update that was inserted first!",
+ "status": CourseInfoModule.STATUS_VISIBLE,
+ },
+ {
+ "id": 3,
+ "date": "March 18, 1982",
+ "content": "This is a very important update that was inserted last with an older date!",
+ "status": CourseInfoModule.STATUS_VISIBLE,
+ }
+ ],
+ 'hidden_updates': [],
+ }
+ template_name = "{0}/course_updates.html".format(info_module.TEMPLATE_DIR)
+ info_module.get_html()
+ # Assertion to validate that render function is called with the expected context
+ info_module.system.render_template.assert_called_once_with(
+ template_name,
+ expected_context
+ )