/cms/djangoapps/contentstore/management/commands/tests/test_generate_courses.py

https://gitlab.com/unofficial-mirrors/edx-platform · Python · 170 lines · 120 code · 14 blank · 36 comment · 2 complexity · 5346118f344a53bb9c05656876e2306d MD5 · raw file

  1. """
  2. Unittest for generate a test course in an given modulestore
  3. """
  4. import json
  5. import ddt
  6. import mock
  7. from django.core.management import CommandError, call_command
  8. from xmodule.modulestore.django import modulestore
  9. from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
  10. @ddt.ddt
  11. class TestGenerateCourses(ModuleStoreTestCase):
  12. """
  13. Unit tests for creating a course in split store via command line
  14. """
  15. @mock.patch('contentstore.management.commands.generate_courses.logger')
  16. def test_generate_course_in_stores(self, mock_logger):
  17. """
  18. Test that a course is created successfully
  19. """
  20. settings = {"courses": [{
  21. "organization": "test-course-generator",
  22. "number": "1",
  23. "run": "1",
  24. "user": str(self.user.email),
  25. "fields": {"display_name": "test-course", "announcement": "2010-04-20T20:08:21.634121"}
  26. }]}
  27. arg = json.dumps(settings)
  28. call_command("generate_courses", arg)
  29. key = modulestore().make_course_key("test-course-generator", "1", "1")
  30. self.assertTrue(modulestore().has_course(key))
  31. mock_logger.info.assert_any_call("Created course-v1:test-course-generator+1+1")
  32. mock_logger.info.assert_any_call("announcement has been set to 2010-04-20T20:08:21.634121")
  33. mock_logger.info.assert_any_call("display_name has been set to test-course")
  34. def test_invalid_json(self):
  35. """
  36. Test that providing an invalid JSON object will result in the appropriate command error
  37. """
  38. with self.assertRaisesRegexp(CommandError, "Invalid JSON object"):
  39. arg = "invalid_json"
  40. call_command("generate_courses", arg)
  41. def test_missing_courses_list(self):
  42. """
  43. Test that a missing list of courses in json will result in the appropriate command error
  44. """
  45. with self.assertRaisesRegexp(CommandError, "JSON object is missing courses list"):
  46. settings = {}
  47. arg = json.dumps(settings)
  48. call_command("generate_courses", arg)
  49. @mock.patch('contentstore.management.commands.generate_courses.logger')
  50. @ddt.data("organization", "number", "run", "fields")
  51. def test_missing_course_settings(self, setting, mock_logger):
  52. """
  53. Test that missing required settings in JSON object will result in the appropriate error message
  54. """
  55. settings = {"courses": [{
  56. "organization": "test-course-generator",
  57. "number": "1",
  58. "run": "1",
  59. "user": str(self.user.email),
  60. "fields": {"display_name": "test-course"}
  61. }]}
  62. del settings["courses"][0][setting]
  63. arg = json.dumps(settings)
  64. call_command("generate_courses", arg)
  65. mock_logger.warning.assert_any_call("Course json is missing " + setting)
  66. @mock.patch('contentstore.management.commands.generate_courses.logger')
  67. def test_invalid_user(self, mock_logger):
  68. """
  69. Test that providing an invalid user in the course JSON will result in the appropriate error message
  70. """
  71. settings = {"courses": [{
  72. "organization": "test-course-generator",
  73. "number": "1",
  74. "run": "1",
  75. "user": "invalid_user",
  76. "fields": {"display_name": "test-course"}
  77. }]}
  78. arg = json.dumps(settings)
  79. call_command("generate_courses", arg)
  80. mock_logger.warning.assert_any_call("invalid_user user does not exist")
  81. @mock.patch('contentstore.management.commands.generate_courses.logger')
  82. def test_missing_display_name(self, mock_logger):
  83. """
  84. Test that missing required display_name in JSON object will result in the appropriate error message
  85. """
  86. settings = {"courses": [{
  87. "organization": "test-course-generator",
  88. "number": "1",
  89. "run": "1",
  90. "user": str(self.user.email),
  91. "fields": {}
  92. }]}
  93. arg = json.dumps(settings)
  94. call_command("generate_courses", arg)
  95. mock_logger.warning.assert_any_call("Fields json is missing display_name")
  96. @mock.patch('contentstore.management.commands.generate_courses.logger')
  97. def test_invalid_course_field(self, mock_logger):
  98. """
  99. Test that an invalid course field will result in the appropriate message
  100. """
  101. settings = {"courses": [{
  102. "organization": "test-course-generator",
  103. "number": "1",
  104. "run": "1",
  105. "user": str(self.user.email),
  106. "fields": {"display_name": "test-course", "invalid_field": "invalid_value"}
  107. }]}
  108. arg = json.dumps(settings)
  109. call_command("generate_courses", arg)
  110. mock_logger.info.assert_any_call((u'invalid_field') + "is not a valid CourseField")
  111. @mock.patch('contentstore.management.commands.generate_courses.logger')
  112. def test_invalid_date_setting(self, mock_logger):
  113. """
  114. Test that an invalid date json will result in the appropriate message
  115. """
  116. settings = {"courses": [{
  117. "organization": "test-course-generator",
  118. "number": "1",
  119. "run": "1",
  120. "user": str(self.user.email),
  121. "fields": {"display_name": "test-course", "announcement": "invalid_date"}
  122. }]}
  123. arg = json.dumps(settings)
  124. call_command("generate_courses", arg)
  125. mock_logger.info.assert_any_call("The date string could not be parsed for announcement")
  126. @mock.patch('contentstore.management.commands.generate_courses.logger')
  127. def test_invalid_course_tab_list_setting(self, mock_logger):
  128. """
  129. Test that an invalid course tab list json will result in the appropriate message
  130. """
  131. settings = {"courses": [{
  132. "organization": "test-course-generator",
  133. "number": "1",
  134. "run": "1",
  135. "user": str(self.user.email),
  136. "fields": {"display_name": "test-course", "tabs": "invalid_tabs"}
  137. }]}
  138. arg = json.dumps(settings)
  139. call_command("generate_courses", arg)
  140. mock_logger.info.assert_any_call("The course tab list string could not be parsed for tabs")
  141. @mock.patch('contentstore.management.commands.generate_courses.logger')
  142. @ddt.data("mobile_available", "enable_proctored_exams")
  143. def test_missing_course_fields(self, field, mock_logger):
  144. """
  145. Test that missing course fields in fields json will result in the appropriate message
  146. """
  147. settings = {"courses": [{
  148. "organization": "test-course-generator",
  149. "number": "1",
  150. "run": "1",
  151. "user": str(self.user.email),
  152. "fields": {"display_name": "test-course"}
  153. }]}
  154. arg = json.dumps(settings)
  155. call_command("generate_courses", arg)
  156. mock_logger.info.assert_any_call(field + " has not been set")