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

https://gitlab.com/unofficial-mirrors/edx-platform · Python · 92 lines · 60 code · 12 blank · 20 comment · 6 complexity · a987f5a6ab5f4582c9e11226e626c807 MD5 · raw file

  1. """
  2. Unittests for creating a course in an chosen modulestore
  3. """
  4. import ddt
  5. from django.core.management import CommandError, call_command
  6. from django.test import TestCase
  7. from xmodule.modulestore import ModuleStoreEnum
  8. from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
  9. from xmodule.modulestore.django import modulestore
  10. class TestArgParsing(TestCase):
  11. """
  12. Tests for parsing arguments for the `create_course` management command
  13. """
  14. def setUp(self):
  15. super(TestArgParsing, self).setUp()
  16. def test_no_args(self):
  17. errstring = "Error: too few arguments"
  18. with self.assertRaisesRegexp(CommandError, errstring):
  19. call_command('create_course')
  20. def test_invalid_store(self):
  21. with self.assertRaises(CommandError):
  22. call_command('create_course', "foo", "user@foo.org", "org", "course", "run")
  23. def test_nonexistent_user_id(self):
  24. errstring = "No user 99 found"
  25. with self.assertRaisesRegexp(CommandError, errstring):
  26. call_command('create_course', "split", "99", "org", "course", "run")
  27. def test_nonexistent_user_email(self):
  28. errstring = "No user fake@example.com found"
  29. with self.assertRaisesRegexp(CommandError, errstring):
  30. call_command('create_course', "mongo", "fake@example.com", "org", "course", "run")
  31. @ddt.ddt
  32. class TestCreateCourse(ModuleStoreTestCase):
  33. """
  34. Unit tests for creating a course in either old mongo or split mongo via command line
  35. """
  36. @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
  37. def test_all_stores_user_email(self, store):
  38. call_command(
  39. "create_course",
  40. store,
  41. str(self.user.email),
  42. "org", "course", "run"
  43. )
  44. new_key = modulestore().make_course_key("org", "course", "run")
  45. self.assertTrue(
  46. modulestore().has_course(new_key),
  47. "Could not find course in {}".format(store)
  48. )
  49. # pylint: disable=protected-access
  50. self.assertEqual(store, modulestore()._get_modulestore_for_courselike(new_key).get_modulestore_type())
  51. @ddt.data(ModuleStoreEnum.Type.split, ModuleStoreEnum.Type.mongo)
  52. def test_get_course_with_different_case(self, default_store):
  53. """
  54. Tests that course can not be accessed with different case.
  55. Scenario:
  56. Create a course with lower case keys inside `bulk_operations` with `ignore_case=True`.
  57. Verify that course is created.
  58. Verify that get course from store using same course id but different case is not accessible.
  59. """
  60. org = 'org1'
  61. number = 'course1'
  62. run = 'run1'
  63. with self.store.default_store(default_store):
  64. lowercase_course_id = self.store.make_course_key(org, number, run)
  65. with self.store.bulk_operations(lowercase_course_id, ignore_case=True):
  66. # Create course with lowercase key & Verify that store returns course.
  67. self.store.create_course(
  68. lowercase_course_id.org,
  69. lowercase_course_id.course,
  70. lowercase_course_id.run,
  71. self.user.id
  72. )
  73. course = self.store.get_course(lowercase_course_id)
  74. self.assertIsNotNone(course, 'Course not found using lowercase course key.')
  75. self.assertEqual(unicode(course.id), unicode(lowercase_course_id))
  76. # Verify store does not return course with different case.
  77. uppercase_course_id = self.store.make_course_key(org.upper(), number.upper(), run.upper())
  78. course = self.store.get_course(uppercase_course_id)
  79. self.assertIsNone(course, 'Course should not be accessed with uppercase course id.')