From e7a4ed742a4b78847dc20cff95b297d0b70e7491 Mon Sep 17 00:00:00 2001 From: Andy Armstrong Date: Wed, 5 Apr 2017 14:07:41 -0400 Subject: [PATCH] Add query count tests for old and new course pages --- lms/djangoapps/courseware/tests/test_views.py | 29 ++++---- .../tests/views/test_course_home.py | 71 +++++++++++++++++++ .../tests/views/test_course_outline.py | 14 +--- 3 files changed, 88 insertions(+), 26 deletions(-) create mode 100644 openedx/features/course_experience/tests/views/test_course_home.py diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py index cfb5d0a4b6..1ec5d8e39a 100644 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -205,11 +205,11 @@ class IndexQueryTestCase(ModuleStoreTestCase): NUM_PROBLEMS = 20 @ddt.data( - (ModuleStoreEnum.Type.mongo, 10), - (ModuleStoreEnum.Type.split, 4), + (ModuleStoreEnum.Type.mongo, 10, 147), + (ModuleStoreEnum.Type.split, 4, 147), ) @ddt.unpack - def test_index_query_counts(self, store_type, expected_query_count): + def test_index_query_counts(self, store_type, expected_mongo_query_count, expected_mysql_query_count): with self.store.default_store(store_type): course = CourseFactory.create() with self.store.bulk_operations(course.id): @@ -224,17 +224,18 @@ class IndexQueryTestCase(ModuleStoreTestCase): self.client.login(username=self.user.username, password=password) CourseEnrollment.enroll(self.user, course.id) - with check_mongo_calls(expected_query_count): - url = reverse( - 'courseware_section', - kwargs={ - 'course_id': unicode(course.id), - 'chapter': unicode(chapter.location.name), - 'section': unicode(section.location.name), - } - ) - response = self.client.get(url) - self.assertEqual(response.status_code, 200) + with self.assertNumQueries(expected_mysql_query_count): + with check_mongo_calls(expected_mongo_query_count): + url = reverse( + 'courseware_section', + kwargs={ + 'course_id': unicode(course.id), + 'chapter': unicode(chapter.location.name), + 'section': unicode(section.location.name), + } + ) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) @attr(shard=2) diff --git a/openedx/features/course_experience/tests/views/test_course_home.py b/openedx/features/course_experience/tests/views/test_course_home.py new file mode 100644 index 0000000000..84d984a88e --- /dev/null +++ b/openedx/features/course_experience/tests/views/test_course_home.py @@ -0,0 +1,71 @@ +""" +Tests for the course home page. +""" +from django.core.urlresolvers import reverse + +from openedx.core.djangoapps.content.block_structure.api import get_course_in_cache +from student.models import CourseEnrollment +from student.tests.factories import UserFactory +from xmodule.modulestore import ModuleStoreEnum +from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase +from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory, check_mongo_calls + +TEST_PASSWORD = 'test' + + +def course_home_url(course): + """ + Returns the URL for the course's home page + """ + return reverse( + 'edx.course_experience.course_home', + kwargs={ + 'course_id': unicode(course.id), + } + ) + + +class TestCourseHomePage(SharedModuleStoreTestCase): + """ + Test the course home page. + """ + @classmethod + def setUpClass(cls): + """Set up the simplest course possible.""" + # setUpClassAndTestData() already calls setUpClass on SharedModuleStoreTestCase + # pylint: disable=super-method-not-called + with super(TestCourseHomePage, cls).setUpClassAndTestData(): + with cls.store.default_store(ModuleStoreEnum.Type.split): + cls.course = CourseFactory.create() + with cls.store.bulk_operations(cls.course.id): + chapter = ItemFactory.create(category='chapter', parent_location=cls.course.location) + section = ItemFactory.create(category='sequential', parent_location=chapter.location) + section2 = ItemFactory.create(category='sequential', parent_location=chapter.location) + ItemFactory.create(category='vertical', parent_location=section.location) + ItemFactory.create(category='vertical', parent_location=section2.location) + + @classmethod + def setUpTestData(cls): + """Set up and enroll our fake user in the course.""" + cls.user = UserFactory(password=TEST_PASSWORD) + CourseEnrollment.enroll(cls.user, cls.course.id) + + def setUp(self): + """ + Set up for the tests. + """ + super(TestCourseHomePage, self).setUp() + self.client.login(username=self.user.username, password=TEST_PASSWORD) + + def test_queries(self): + """ + Verify that the view's query count doesn't regress. + """ + # Pre-fill the course blocks cache + get_course_in_cache(self.course.id) + + # Fetch the view and verify the query counts + with self.assertNumQueries(36): + with check_mongo_calls(3): + url = course_home_url(self.course) + self.client.get(url) diff --git a/openedx/features/course_experience/tests/views/test_course_outline.py b/openedx/features/course_experience/tests/views/test_course_outline.py index 0e695adc0e..e940dc8b34 100644 --- a/openedx/features/course_experience/tests/views/test_course_outline.py +++ b/openedx/features/course_experience/tests/views/test_course_outline.py @@ -13,21 +13,11 @@ from student.tests.factories import UserFactory from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory +from .test_course_home import course_home_url + TEST_PASSWORD = 'test' -def course_home_url(course): - """ - Returns the URL for the course's home page - """ - return reverse( - 'edx.course_experience.course_home', - kwargs={ - 'course_id': unicode(course.id), - } - ) - - class TestCourseOutlinePage(SharedModuleStoreTestCase): """ Test the new course outline view.