Commit 02c24cb2 by Nimisha Asthagiri

Block Structure query count and API changes

parent 1ee2c27f
...@@ -4,8 +4,12 @@ Tests for Blocks api.py ...@@ -4,8 +4,12 @@ Tests for Blocks api.py
import ddt import ddt
from django.test.client import RequestFactory from django.test.client import RequestFactory
from itertools import product
from openedx.core.djangoapps.content.block_structure.api import clear_course_from_cache from openedx.core.djangoapps.content.block_structure.api import clear_course_from_cache
from openedx.core.djangoapps.content.block_structure.config import STORAGE_BACKING_FOR_CACHE
from openedx.core.djangoapps.content.block_structure.tests.helpers import override_config_setting
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore import ModuleStoreEnum
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
...@@ -121,26 +125,45 @@ class TestGetBlocksQueryCounts(SharedModuleStoreTestCase): ...@@ -121,26 +125,45 @@ class TestGetBlocksQueryCounts(SharedModuleStoreTestCase):
with self.store.default_store(store_type): with self.store.default_store(store_type):
return SampleCourseFactory.create() return SampleCourseFactory.create()
def _get_blocks(self, course, expected_mongo_queries): def _get_blocks(self, course, expected_mongo_queries, expected_sql_queries):
""" """
Verifies the number of expected queries when calling Verifies the number of expected queries when calling
get_blocks on the given course. get_blocks on the given course.
""" """
with check_mongo_calls(expected_mongo_queries): with check_mongo_calls(expected_mongo_queries):
with self.assertNumQueries(2): with self.assertNumQueries(expected_sql_queries):
get_blocks(self.request, course.location, self.user) get_blocks(self.request, course.location, self.user)
@ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) @ddt.data(
def test_query_counts_cached(self, store_type): *product(
course = self._create_course(store_type) (ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split),
self._get_blocks(course, expected_mongo_queries=0) (True, False),
)
)
@ddt.unpack
def test_query_counts_cached(self, store_type, with_storage_backing):
with override_config_setting(STORAGE_BACKING_FOR_CACHE, active=with_storage_backing):
course = self._create_course(store_type)
self._get_blocks(
course,
expected_mongo_queries=0,
expected_sql_queries=4 if with_storage_backing else 3,
)
@ddt.data( @ddt.data(
(ModuleStoreEnum.Type.mongo, 5), *product(
(ModuleStoreEnum.Type.split, 3), ((ModuleStoreEnum.Type.mongo, 5), (ModuleStoreEnum.Type.split, 3)),
(True, False),
)
) )
@ddt.unpack @ddt.unpack
def test_query_counts_uncached(self, store_type, expected_mongo_queries): def test_query_counts_uncached(self, store_type_tuple, with_storage_backing):
course = self._create_course(store_type) store_type, expected_mongo_queries = store_type_tuple
clear_course_from_cache(course.id) with override_config_setting(STORAGE_BACKING_FOR_CACHE, active=with_storage_backing):
self._get_blocks(course, expected_mongo_queries) course = self._create_course(store_type)
clear_course_from_cache(course.id)
self._get_blocks(
course,
expected_mongo_queries,
expected_sql_queries=9 if with_storage_backing else 3,
)
...@@ -158,7 +158,7 @@ class MilestonesTransformerTestCase(CourseStructureTestCase, MilestonesTestCaseM ...@@ -158,7 +158,7 @@ class MilestonesTransformerTestCase(CourseStructureTestCase, MilestonesTestCaseM
self.course.enable_subsection_gating = True self.course.enable_subsection_gating = True
self.setup_gated_section(self.blocks[gated_block_ref], self.blocks[gating_block_ref]) self.setup_gated_section(self.blocks[gated_block_ref], self.blocks[gating_block_ref])
with self.assertNumQueries(3): with self.assertNumQueries(6):
self.get_blocks_and_check_against_expected(self.user, expected_blocks_before_completion) self.get_blocks_and_check_against_expected(self.user, expected_blocks_before_completion)
# clear the request cache to simulate a new request # clear the request cache to simulate a new request
...@@ -174,7 +174,7 @@ class MilestonesTransformerTestCase(CourseStructureTestCase, MilestonesTestCaseM ...@@ -174,7 +174,7 @@ class MilestonesTransformerTestCase(CourseStructureTestCase, MilestonesTestCaseM
self.blocks[gating_block_child], self.blocks[gating_block_child],
self.user.id, self.user.id,
) )
with self.assertNumQueries(2): with self.assertNumQueries(5):
self.get_blocks_and_check_against_expected(self.user, self.ALL_BLOCKS_EXCEPT_SPECIAL) self.get_blocks_and_check_against_expected(self.user, self.ALL_BLOCKS_EXCEPT_SPECIAL)
def test_staff_access(self): def test_staff_access(self):
......
...@@ -71,11 +71,11 @@ class TestGradeIteration(SharedModuleStoreTestCase): ...@@ -71,11 +71,11 @@ class TestGradeIteration(SharedModuleStoreTestCase):
""" """
with patch.object( with patch.object(
BlockStructureFactory, BlockStructureFactory,
'create_from_cache', 'create_from_store',
wraps=BlockStructureFactory.create_from_cache wraps=BlockStructureFactory.create_from_store
) as mock_create_from_cache: ) as mock_create_from_store:
all_course_grades, all_errors = self._course_grades_and_errors_for(self.course, self.students) all_course_grades, all_errors = self._course_grades_and_errors_for(self.course, self.students)
self.assertEquals(mock_create_from_cache.call_count, 1) self.assertEquals(mock_create_from_store.call_count, 1)
self.assertEqual(len(all_errors), 0) self.assertEqual(len(all_errors), 0)
for course_grade in all_course_grades.values(): for course_grade in all_course_grades.values():
...@@ -100,7 +100,8 @@ class TestGradeIteration(SharedModuleStoreTestCase): ...@@ -100,7 +100,8 @@ class TestGradeIteration(SharedModuleStoreTestCase):
else mock_course_grade.return_value else mock_course_grade.return_value
for student in self.students for student in self.students
] ]
all_course_grades, all_errors = self._course_grades_and_errors_for(self.course, self.students) with self.assertNumQueries(4):
all_course_grades, all_errors = self._course_grades_and_errors_for(self.course, self.students)
self.assertEqual( self.assertEqual(
all_errors, all_errors,
{ {
......
...@@ -136,8 +136,8 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase): ...@@ -136,8 +136,8 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase):
self.set_up_course() self.set_up_course()
self.assertTrue(PersistentGradesEnabledFlag.feature_enabled(self.course.id)) self.assertTrue(PersistentGradesEnabledFlag.feature_enabled(self.course.id))
with patch( with patch(
'openedx.core.lib.block_structure.factory.BlockStructureFactory.create_from_cache', 'openedx.core.lib.block_structure.factory.BlockStructureFactory.create_from_store',
side_effect=BlockStructureNotFound, side_effect=BlockStructureNotFound(self.course.location),
) as mock_block_structure_create: ) as mock_block_structure_create:
self._apply_recalculate_subsection_grade() self._apply_recalculate_subsection_grade()
self.assertEquals(mock_block_structure_create.call_count, 1) self.assertEquals(mock_block_structure_create.call_count, 1)
......
...@@ -1773,7 +1773,7 @@ class TestCertificateGeneration(InstructorTaskModuleTestCase): ...@@ -1773,7 +1773,7 @@ class TestCertificateGeneration(InstructorTaskModuleTestCase):
'failed': 3, 'failed': 3,
'skipped': 2 'skipped': 2
} }
with self.assertNumQueries(166): with self.assertNumQueries(169):
self.assertCertificatesGenerated(task_input, expected_results) self.assertCertificatesGenerated(task_input, expected_results)
expected_results = { expected_results = {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment