diff --git a/cms/envs/aws.py b/cms/envs/aws.py index 39250ec076..20dd19e797 100644 --- a/cms/envs/aws.py +++ b/cms/envs/aws.py @@ -101,6 +101,9 @@ if STATIC_URL_BASE: STATIC_URL += "/" STATIC_URL += EDX_PLATFORM_REVISION + "/" +# DEFAULT_COURSE_ABOUT_IMAGE_URL specifies the default image to show for courses that don't provide one +DEFAULT_COURSE_ABOUT_IMAGE_URL = ENV_TOKENS.get('DEFAULT_COURSE_ABOUT_IMAGE_URL', DEFAULT_COURSE_ABOUT_IMAGE_URL) + # GITHUB_REPO_ROOT is the base directory # for course data GITHUB_REPO_ROOT = ENV_TOKENS.get('GITHUB_REPO_ROOT', GITHUB_REPO_ROOT) diff --git a/cms/envs/common.py b/cms/envs/common.py index 2da76905b2..d6ce7cf47b 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -56,6 +56,7 @@ from lms.envs.common import ( # The following setting is included as it is used to check whether to # display credit eligibility table on the CMS or not. ENABLE_CREDIT_ELIGIBILITY, YOUTUBE_API_KEY, + DEFAULT_COURSE_ABOUT_IMAGE_URL, # Django REST framework configuration REST_FRAMEWORK, diff --git a/lms/djangoapps/instructor/tests/test_api.py b/lms/djangoapps/instructor/tests/test_api.py index 63fd554d0b..ebfe42c322 100644 --- a/lms/djangoapps/instructor/tests/test_api.py +++ b/lms/djangoapps/instructor/tests/test_api.py @@ -29,6 +29,7 @@ from nose.tools import raises from nose.plugins.attrib import attr from opaque_keys.edx.locations import SlashSeparatedCourseKey from opaque_keys.edx.locator import UsageKey +from xmodule.modulestore import ModuleStoreEnum from course_modes.models import CourseMode from courseware.models import StudentModule @@ -66,6 +67,7 @@ from certificates.tests.factories import GeneratedCertificateFactory from certificates.models import CertificateStatuses from openedx.core.djangoapps.course_groups.cohorts import set_course_cohort_settings +from openedx.core.lib.xblock_utils import grade_histogram from .test_tools import msk_from_problem_urlname @@ -3092,6 +3094,7 @@ class TestInstructorAPIRegradeTask(SharedModuleStoreTestCase, LoginEnrollmentTes @attr('shard_1') @patch.dict(settings.FEATURES, {'ENTRANCE_EXAMS': True}) +@ddt.ddt class TestEntranceExamInstructorAPIRegradeTask(SharedModuleStoreTestCase, LoginEnrollmentTestCase): """ Test endpoints whereby instructors can rescore student grades, @@ -3160,6 +3163,29 @@ class TestEntranceExamInstructorAPIRegradeTask(SharedModuleStoreTestCase, LoginE ) self.ee_modules = [ee_module_to_reset1.module_state_key, ee_module_to_reset2.module_state_key] + @ddt.data(ModuleStoreEnum.Type.split, ModuleStoreEnum.Type.mongo) + def test_grade_histogram(self, store): + """ + Verify that a histogram has been created. + """ + course = CourseFactory.create(default_store=store) + + usage_key = course.id.make_usage_key('problem', 'first_problem') + StudentModule.objects.create( + student_id=1, + grade=100, + module_state_key=usage_key + ) + StudentModule.objects.create( + student_id=2, + grade=50, + module_state_key=usage_key + ) + + grades = grade_histogram(usage_key) + self.assertEqual(grades[0], (50.0, 1)) + self.assertEqual(grades[1], (100.0, 1)) + def test_reset_entrance_exam_student_attempts_deletall(self): """ Make sure no one can delete all students state on entrance exam. """ url = reverse('reset_student_attempts_for_entrance_exam', diff --git a/openedx/core/lib/api/tests/test_paginators.py b/openedx/core/lib/api/tests/test_paginators.py index c34a54e5cf..bc6d234030 100644 --- a/openedx/core/lib/api/tests/test_paginators.py +++ b/openedx/core/lib/api/tests/test_paginators.py @@ -107,8 +107,7 @@ class PaginateSearchResultsTestCase(TestCase): id_range = get_object_range(page_number, page_size) db_objects = [build_mock_object(obj_id) for obj_id in id_range] self.mock_model.objects.filter = MagicMock(return_value=db_objects) - - page = paginate_search_results(self.mock_model, self.search_results, self.default_size, 'last') + page = paginate_search_results(self.mock_model, self.search_results, page_size, 'last') self.mock_model.objects.filter.assert_called_with(pk__in=id_range) self.assertEquals(db_objects, page.object_list) diff --git a/openedx/core/lib/block_cache/tests/test_block_cache.py b/openedx/core/lib/block_cache/tests/test_block_cache.py index 1c94e049a8..ad98b76581 100644 --- a/openedx/core/lib/block_cache/tests/test_block_cache.py +++ b/openedx/core/lib/block_cache/tests/test_block_cache.py @@ -3,8 +3,9 @@ Tests for block_cache.py """ from django.core.cache import get_cache +from django.conf import settings from mock import patch -from unittest import TestCase +from unittest import TestCase, skipUnless from ..block_cache import get_blocks from ..exceptions import TransformerException @@ -96,6 +97,7 @@ class TestBlockCache(TestCase, ChildrenMapTestMixin): transformers=self.transformers, ) + @skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') def test_block_caching(self, mock_available_transforms): mock_available_transforms.return_value = {transformer.name(): transformer for transformer in self.transformers} diff --git a/openedx/core/lib/tests/test_courses.py b/openedx/core/lib/tests/test_courses.py index a9aed1ceab..690d4f1d49 100644 --- a/openedx/core/lib/tests/test_courses.py +++ b/openedx/core/lib/tests/test_courses.py @@ -3,6 +3,8 @@ Tests for functionality in openedx/core/lib/courses.py. """ import ddt +from django.test.utils import override_settings + from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase @@ -48,12 +50,16 @@ class CourseImageTestCase(ModuleStoreTestCase): course_image_url(course) ) + @override_settings(DEFAULT_COURSE_ABOUT_IMAGE_URL='test.png') + @override_settings(STATIC_URL='static/') @ddt.data(ModuleStoreEnum.Type.split, ModuleStoreEnum.Type.mongo) def test_empty_image_name(self, default_store): - """ Verify that empty image names are cleaned """ - course_image = u'' - course = CourseFactory.create(course_image=course_image, default_store=default_store) + """ + Verify that if a course has empty `course_image`, `course_image_url` returns + `DEFAULT_COURSE_ABOUT_IMAGE_URL` defined in the settings. + """ + course = CourseFactory.create(course_image='', default_store=default_store) self.assertEquals( - course_image, + 'static/test.png', course_image_url(course), ) diff --git a/openedx/core/lib/tests/test_xblock_utils.py b/openedx/core/lib/tests/test_xblock_utils.py index 313dd8e047..a9b23f66a3 100644 --- a/openedx/core/lib/tests/test_xblock_utils.py +++ b/openedx/core/lib/tests/test_xblock_utils.py @@ -173,28 +173,6 @@ class TestXblockUtils(SharedModuleStoreTestCase): self.assertIsInstance(test_replace, Fragment) self.assertEqual(test_replace.content, anchor_tag) - @ddt.data('course_mongo', 'course_split') - def test_grade_histogram(self, course_id): - """ - Verify that a histogram has been created. - """ - course = getattr(self, course_id) - usage_key = course.id.make_usage_key('problem', 'first_problem') - StudentModule.objects.create( - student_id=1, - grade=100, - module_state_key=usage_key - ) - StudentModule.objects.create( - student_id=2, - grade=50, - module_state_key=usage_key - ) - - grades = grade_histogram(usage_key) - self.assertEqual(grades[0], (50.0, 1)) - self.assertEqual(grades[1], (100.0, 1)) - def test_sanitize_html_id(self): """ Verify that colons and dashes are replaced. diff --git a/pavelib/utils/test/suites/nose_suite.py b/pavelib/utils/test/suites/nose_suite.py index ae739ba12c..16699d13ef 100644 --- a/pavelib/utils/test/suites/nose_suite.py +++ b/pavelib/utils/test/suites/nose_suite.py @@ -150,6 +150,7 @@ class SystemTestSuite(NoseTestSuite): " common/djangoapps/*" " openedx/core/djangoapps/*" " openedx/tests/*" + " openedx/core/lib/*" ) if self.root in ('lms', 'cms'):