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 + )